如何访问Verilog genvar生成的实例及其信号

时间:2018-11-16 14:08:18

标签: verilog system-verilog hdl xilinx-ise

我需要通过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

正确的方法是什么?

1 个答案:

答案 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对: