如何访问 Verilog genvar 生成的实例及其信号
How to access Verilog genvar generated instances and their signals
我需要通过 Verilog 中的生成块在生成的实例中初始化数组。我正在尝试使用下面的语法,但是,我得到一个错误
External reference foo[0].bar.array[0] remains unresolved.
在赛灵思 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
正确的做法是什么?
问题是 foo
块在编译时得到解决。因此,foo[0]
、foo[1]
等名称是预先生成的并且是编译时名称,它们不适用于 运行 时的动态索引解析。因此 foo[j]
将不起作用。
这种情况下的解决方案是使用另一个生成块来初始化它们。类似于以下内容。
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
顺便说一句,在 system verilog 中你可以避免使用 generate/endgenerate
对:
我需要通过 Verilog 中的生成块在生成的实例中初始化数组。我正在尝试使用下面的语法,但是,我得到一个错误
External reference foo[0].bar.array[0] remains unresolved.
在赛灵思 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
正确的做法是什么?
问题是 foo
块在编译时得到解决。因此,foo[0]
、foo[1]
等名称是预先生成的并且是编译时名称,它们不适用于 运行 时的动态索引解析。因此 foo[j]
将不起作用。
这种情况下的解决方案是使用另一个生成块来初始化它们。类似于以下内容。
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
顺便说一句,在 system verilog 中你可以避免使用 generate/endgenerate
对: