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标准进行编译。我只是尝试使用此标志进行编译,但仍然看到相同的错误。