首先,我在填写这个问题的标题时遇到了很多困难。因此,如果您了解我面临的问题,并且有一个更好的方式来表达它并且之前已经回答了问题,我道歉,请指出我如何解决这个问题。无论如何,这里是我为了清晰起见而截断的相关代码段:
parameter RAM_DEPTH = 256;
reg ram [0:RAM_DEPTH-1]; //256 deep memory, 1-bit size per location
parameter NUM_INST = 64;
parameter N = 4;
genvar x;
generate for (x = 0; x < NUM_INST; x = x + 1) begin: xs
//instantiate a module here
//connect N bits to input port
//which N bits depends module number x
mod inst (
.in(ram[x*N : x*N + N - 1]) //the error is here
);
end endgenerate
错误是:
error: Array cannot be indexed by a range.
我理解这是因为ram
被声明为reg ram [0:RAM_DEPTH-1]
而不是reg [0:RAM_DEPTH-1] ram
。但是有没有办法根据N
参数自动连接RAM位,即不必写.in({ram[x*N],ram[x*N+1],ram[x*N+2],ram[x*N+3]})
,而是有一个自动范围选择逻辑,它根据N连接位。你可以想象,如果说N = 256
,我将不得不编写一个很长的连接运算符,并使我的模块参数化程度降低。
在这种情况下,我应该只使用reg [0:RAM_DEPTH-1] ram
声明,并重新编写我的模块以支持单个寄存器阵列上的位更新吗?
感谢。
答案 0 :(得分:0)
我找到的最简单的解决方案是按照您的建议执行,并将reg ram [0:RAM_DEPTH-1]
转换为reg [0:RAM_DEPTH-1] ram
。另一种选择是:
parameter RAM_DEPTH = 256;
parameter NUM_INST = 64;
parameter N = 4;
reg [RAM_DEPTH-1:0] ram; //256 deep memory, 1-bit size per location
reg [N-1:0] ramwires [NUM_INST-1:0];
genvar x;
integer y, z;
generate for (x = 0; x < NUM_INST; x = x + 1) begin: xs
mod inst (
.in(ramwires[x])
);
end endgenerate
always@(*)
for (y = 0; y<NUM_INST; y = y + 1) begin
for (z=0; z<N; z = z + 1) begin
ramwires[y][z] = ram[y*N+z];
end
end
这会将1D数组转换为2D数组,该数组很容易传递到模块中,同时仍然可以参数化。