问个verilog二维寄存器初始化的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问个verilog二维寄存器初始化的问题相关的知识,希望对你有一定的参考价值。

在同步设计的verilog代码里,一般都会对寄存器进行异步复位比如:
reg [width:0] reg_a;

always@(posedge clk or negedge rst_n)
if (!rst_n)
reg_a <= 0;
else if (condition 1)
reg_a <= value_a;

那如果我定义了个二维寄存器,怎么对其初始化呢?比如:
reg [width:0] reg_a [depth:0];

请哪位大侠给出具体点的code,谢谢!!!

首先你应该明白二维寄存器是个神马。。。。
在综合时设置合适的选项,二维寄存器就会被优化为RAM(ROM)
那么如何对rom或ram初始化呢?这个就应该是很明晰的啦。
就是控制地址,向固定的地址写你需要的数据。

reg [SIGNAL_DATA_WIDTH-1:0] SignalRom [SIGNAL_DATA_DEPTH-1:0];
reg [DATA_WIDTH-1:0] SignalAddr = 0;
always @ (posedge...) begin
if (!rst) SignalAddr <= 0;
else if (SignalAddr == SIGNAL_LENGTH) SignalAddr <= SignalAddr;
else SignalAddr <= SignalAddr + 1;
end
always @ (posedge ...) begin
......................
SignalRom[SignalAddr]<= ......;
........................................
end
程序临时写的,仅供参考。。。
当然你可以用其他方式控制地址和数据,都没问题。
但是需要说的一点,如果你只是写testbench可以使用寄存器组,也很方便
但是实际设计中最好调用ram或rom的实例。 也是说上面的代码最好只出现在仿真的testbench中。
参考技术A Verilog是一种硬件描述语言,如果定义成二维数组会被综合工具当成存储器,也就是RAM。
在真实电路设计中是不会这样用的,如果是为了生成测试向量那最好选择现成的存储器行为模型。

不明白就追问吧。
参考技术B always@(posedge clk or negedge rst_n)
if (!rst_n)
begin
reg_a[0] <= 0;
reg_a[1] <= 0;
reg_a[2] <= 0;
……
end
……
看明白了吧。
参考技术C 可以用for语句对其进行初始化。
integer m,n;

for(n=0;n<=depth;n=n+1)
begin
for(m=0;m<=width;m=m+1)
begin
reg[m]<=0;
end
end

verilog模块端口为二维数组如何调用?

参考技术A 必须分解为一维数组,然后再端口上一一列出。所以这点不如VHDL。 \\x0d\\x0a其实你如果嫌麻烦,可以变通一下的,比如做个接口,将两者对接。举例如下:\\x0d\\x0a你需要调用一个128*64存储器,但是设计128个64位宽的线组/寄存器组,管理起来很不方便,比如\\x0d\\x0aa0[63:0],a1[63:0],a2[63:0]..............a127[63:0],在外界调用时还得设计一个查找表。\\x0d\\x0a因此,你可以设计一个如下的寄存器组aa[128*64-1:0],在外界调用时,将二维数组的两个地址相乘就行了。\\x0d\\x0amoudle jiekou(aa,a0,a1.......a127);\\x0d\\x0ainput [8191:0] aa;\\x0d\\x0aoutput [63:0] a0,a1.....a127;\\x0d\\x0aassign a0=aa[63:0];\\x0d\\x0aassign a1=aa[127:64];\\x0d\\x0a.,,,,,,,\\x0d\\x0aendmodule

以上是关于问个verilog二维寄存器初始化的问题的主要内容,如果未能解决你的问题,请参考以下文章

systermverilog中二维数组含义

verilog模块端口为二维数组如何调用?

verilog 寄存器初始化

verilog中寄存器的初始值问题,

verilog HDL状态机 赋初值问题

verilog 怎么给二维数组赋值