问个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二维寄存器初始化的问题的主要内容,如果未能解决你的问题,请参考以下文章