我需要通过Verilog中的generate块在生成的实例中初始化数组。我正在尝试使用下面的语法,但是,出现错误
外部引用foo [0] .bar.array [0]仍未解析。
在Xilinx ISE中。
integer i, j;
initial begin
// initialization of arrays
for(i=0; i<(2**7); i=i+1) begin
valid_array[i] = 0;
for(j=0; j<N; j=j+1) begin
foo[j].bar.array[i] = 0;
end
end
end
这是我的生成块:
genvar jj;
generate
for(jj = 0; jj < N; jj = jj + 1) begin : foo
Memory_v3
#(
.ADDRESS_WIDTH(INDEX),
.DATA_WIDTH(TAG)
) bar
(
.clock(clock),
.we(we),
.addr_a(addra),
.addr_b(addrb),
.din(din),
.dout(dout)
);
end
endgenerate
正确的方法是什么?
答案 0 :(得分:1)
问题在于foo
块在编译时已解决。因此,foo[0]
,foo[1]
之类的名称是预先生成的,并且是编译时的名称,它们在运行时无法与动态索引解析一起使用。因此foo[j]
无法正常工作。
在这种情况下,解决方案是使用另一个generate块对其进行初始化。类似于以下内容。
generate
for(jj = 0; jj < N; jj = jj + 1) begin : foo_init
initial begin
// initialization of arrays
for(i=0; i<(2**7); i=i+1) begin
foo[jj].bar.array[i] = 0;
end
end
end
endgenerate
同一故事与一系列实例有关。
FOO bar[3:0](); // array of instances
int i,j;
generate
for(jj = 0; jj < 4; jj = jj + 1) begin : foo_init
initial begin
for(i=0; i<(2**7); i=i+1) begin
bar[jj].array[i] = 0;
end
end
end
endgenerate
顺便说一句,在系统Verilog中,您可以避免使用generate/endgenerate
对: