Verilog

时间:2016-04-18 14:34:54

标签: verilog

首先,我在填写这个问题的标题时遇到了很多困难。因此,如果您了解我面临的问题,并且有一个更好的方式来表达它并且之前已经回答了问题,我道歉,请指出我如何解决这个问题。无论如何,这里是我为了清晰起见而截断的相关代码段:

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声明,并重新编写我的模块以支持单个寄存器阵列上的位更新吗?

感谢。

1 个答案:

答案 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数组,该数组很容易传递到模块中,同时仍然可以参数化。