这是代码片段:我正在尝试在寄存器中加载一个文本文件(256 行,32 个二进制值)。但我的寄存器是分层设计的。所以我正在尝试执行以下循环:
reg [31:0] data [ 0:255];
initial $readmemb("vectors.txt", data);
generate
for ( j=0;j<32;j=j+1) begin: BLOCK
assign ITR_MAC_AF.IAF.IREG3_31_.IREG2_7_.IREG[j]=data[0];
end
endgenerate
但它不喜欢循环遍历实例。对此有什么解决方法吗?我有 32 个IREG_3实例,每个 IREG3 有 8 个 IREG2,每个 IREG 内部有 32 个闩锁。
谢谢。
如果网表创建了像 IREG3_0_
、 IREG3_1_
、...IREG3_31_
,没有办法创建访问 _ NNN_ 部分的循环语句。你不妨用IREG3_dog_
,IREG3_milk_
,...以命名索引。
您需要让您的网络列表保留实例数组,以便您可以作为嵌套的 for 循环进行访问。或者,您可能需要手动编写网表。
您可能可以使用生成块实现类似的东西。虽然它看起来会和你所拥有的有点不同。生成块创建包含索引的块名称,这些索引可以从其他生成块引用。
下面的示例分层实例化 regA 和 regB。 后者包含变量 REG。下面的代码以分层方式初始化 REG(使用 initial
块)。初始化和顶部实例化在模块 top
中完成。您可以编译它并查看结果。
顺便说一句,如果您在系统验证模式下编译,则可以摆脱generate/endgenerate
关键字并使用i++
语法。
module top();
regTOP regTOP();
genvar i, j, k;
generate
for (i = 0; i < 3; i = i + 1) begin
for (j = 0; j < 3; j = j + 1) begin
for (k = 0; k < 3; k = k + 1) begin
initial regTOP.R[i].regA.R[j].regB.REG[k] = (i << 4) | (j << 2) | k;
end
end
end
endgenerate
endmodule
module regA();
genvar i;
generate
for(i = 0; i < 3; i = i + 1) begin: R
regB regB();
end
endgenerate
endmodule
module regB();
integer i;
reg[6:0] REG[3:0];
always @*
for (i=0; i < 3; i = i + 1)
$display("%m: reg[%0d]=%0d", i, REG[i]);
endmodule
module regTOP();
genvar i;
generate
for (i = 0; i < 3; i = i + 1) begin: R
regA regA();
end
endgenerate
endmodule