模块参考错误

时间:2014-04-22 17:55:02

标签: verilog

我试图将我的内存初始化为零,以便稍后我可以用文件初始化我的内存。我的内存由sram块组成,每个块都是32行,每行32位。 sram32x32在模块中有一个名为reg [31:0] mem [31:0]的成员。每个银行包含一些blocksPerBank个这些32x32块。现在有sramBanks=8家银行。

连续的存储器地址在每个存储体之间交错。经过每个银行后,它进入下一行。经过所有线路后,它会进入下一个区块。之后,它会回滚(这可以在initial块中的嵌套for循环排序中看到)。这是我实例化和初始化我的记忆的方法。我认为这应该是足够的信息,但如果有必要,请告诉我。

  generate
    for(i=0; i<sramBanks; i=i+1) begin : bank
      sram32x32$ block [blocksPerBank-1:0]
        (obtag[tagLineMSB:tagLineLSB], 
         cdb[i*32 +: 32], 1'b0, 
         FSM_memWR, FSM_ceEnAdj
        );
    end

    integer b, l, k;
    initial begin
      for(b=0; b<blocksPerBank; b=b+1) begin : bpb
        for(l=0; l<32; l=l+1) begin : ln
          for(k=0; k<sramBanks; k=k+1) begin : sbnk
            bank[k].block[b].mem[l] = 32'b0;
          end
        end
      end
    end
  endgenerate

但我得到的错误是:

Error-[XMRE] Cross-module reference resolution error
MainMemory.v, 149
  Error found while trying to resolve cross-module reference.
  token 'bank'.  Originating module 'MainMemory'.
  Source info: bank[k].block[b].mem[l] = 32'b0;

如何在initial语句中引用生成循环中的模块?

1 个答案:

答案 0 :(得分:1)

阵列模块实例的索引需要保持不变。因此,bk必须为genvar

genvar b, k;
generate
  for(b=0; b<blocksPerBank; b=b+1) begin : bpb
    for(k=0; k<sramBanks; k=k+1) begin : sbnk
      integer l;
      initial begin
        for(l=0; l<32; l=l+1) begin : ln
          bank[k].block[b].mem[l] = 32'b0;
        end
      end
    end
  end
endgenerate

请注意,在for循环中定义了integer l。每个外观都会创建一个l,可以看到本地范围。当生成的b*k初始块并行执行时,这可以防止clobber。