我试图将我的内存初始化为零,以便稍后我可以用文件初始化我的内存。我的内存由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
语句中引用生成循环中的模块?
答案 0 :(得分:1)
阵列模块实例的索引需要保持不变。因此,b
和k
必须为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。