如何访问 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 对: