Verilog中RAM位的级联

Verilog中RAM位的级联,verilog,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

首先,我很难用措辞来表达这个问题的标题。因此,如果你理解我面临的问题,并且有更好的表达方式,而且这个问题之前已经得到了回答,我道歉,请你向我指出如何解决这个问题。无论如何,以下是为清晰起见我截短的相关代码片段:

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
我理解这是因为
ram
被声明为
reg-ram[0:ram\u-DEPTH-1]
而不是
reg[0:ram\u-DEPTH-1]ram
。但是有没有一种方法可以基于
N
参数自动连接RAM位,也就是说,不必写
。在({RAM[x*N],RAM[x*N+1],RAM[x*N+2],RAM[x*N+3]})
中,有一种自动范围选择逻辑可以基于N连接位。你可以想象,如果,
N=256
,我将不得不编写一个很长的连接运算符,这也会降低模块的参数化程度

在这种情况下,我应该只使用
reg[0:RAM\u DEPTH-1]RAM
声明,并重新写入模块以支持单个寄存器阵列上的位更新吗


谢谢。

我找到的最简单的解决方案是按照您的建议,将
reg-ram[0:ram\u-DEPTH-1]
转换为
reg[0:ram\u-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
参数RAM_DEPTH=256;
参数NUM_INST=64;
参数N=4;
reg[RAM_深度-1:0]RAM//256深内存,每个位置1位大小
reg[N-1:0]冲压线[NUM_INST-1:0];
genvar x;
整数y,z;
为(x=0;x对于(y=0;y我找到的最简单的解决方案是按照您的建议,将
reg-ram[0:ram\u-DEPTH-1]
转换为
reg[0:ram\u-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
参数RAM_DEPTH=256;
参数NUM_INST=64;
参数N=4;
reg[RAM_DEPTH-1:0]RAM;//256深内存,每个位置1位大小
reg[N-1:0]冲压线[NUM_INST-1:0];
genvar x;
整数y,z;
为(x=0;x对于(y=0;y您是否尝试过中描述的方法?我似乎记得它在类似这样的情况下工作得很好…在Verilog 2001中应该是可能的。您使用的是什么标准版本?@wilcroft链接中的解决方案在概念上是相同的。如果您查看变量声明,它是一个单N位寄存器,而我声明的是N 1-b它注册(像一个分布式内存块)。无论如何,我尝试了
+:
运算符,但仍然出现相同的错误。@EugeneSh。我使用的是Icarus verilog,根据文档,它支持使用-g2001编译标志使用verilog 2001标准进行编译。我刚刚尝试使用此标志进行编译,但仍然看到相同的错误。您尝试过中描述的方法吗?我似乎记得它对这样的事情很有效……在Verilog 2001中应该是可能的……您使用的是什么标准版本?@wilcroft链接中的解决方案在概念上是相同的。如果您查看变量声明,它是一个单N位寄存器,而我声明的是N个1位寄存器(如分布式内存块)。无论如何,我尝试了
+:
操作符,但仍然得到相同的错误。@EugeneSh。我使用的是Icarus verilog,根据文档,它支持使用-g2001编译标志使用verilog 2001标准进行编译。我只是尝试使用此标志进行编译,但仍然看到相同的错误。