微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > verilog里面的RAM的初始化问题

verilog里面的RAM的初始化问题

时间:10-02 整理:3721RD 点击:

比如设计一个RAM代码如下:
请问除了用reset信号赋初始值,还有别的办法吗?有没有办法在test bench里面给初始值啊?只是用于仿真。
希望有高手给个建议啊,先谢谢了!


module memory_8x8_1r_1w(clk, addr_r0, addr_w0, ctrl_rw0, mem_i0,  mem_o0);
     input               clk;
     
     input  [2:0] addr_r0;        // memory address for reading
     input  [2:0] addr_w0;        // memory address  for writing
     
     
     input               ctrl_rw0;        // 1: write,  0: read
   
     input  [7:0] mem_i0;     // input data for writing
   
     output [7:0] mem_o0;      // output data  from reading
     reg   [7:0] mem_o0;
     
     reg [7:0] mem_arr [7:0];
always @ (posedge clk) begin
         if (ctrl_rw0) mem_arr[addr_w0] <= mem_i0;
         else    mem_o0 <= mem_arr[addr_r0];
  end
endmodule

用initial载入文件进行初始化,只用于仿真!

reset不能用于RAM的初始化(除非仿真)。
所以你要明确问题的着重点,是RTL代码还是做仿真



    能给个简单的例子,或者简单的verilog语句吗?我尝试在test bench里面的initial里面写,但是好像不对,最后读出来的是xxx.



    谢谢回复。
    不好意思,我没把我的问题说清楚。我只是用于仿真,看看我的代码对不对的。

用于仿真的话,
memory_8x8_1r_1w.mem_arr[0] =
memory_8x8_1r_1w.mem_arr[1] =
一直这样写下去,在initial里面赋值

仿真的话,可以通过readmemh直接对整块memory赋初值。

如果你用xilinx的ISE可以偷个懒,呵呵!在菜单EDIT下有一个language Templates/verilog/coding examples/RAM下有例子



    非常感谢!我开始是这么写的,但是不知道要在mem_arr前面加上实例化的名字。



    谢谢建议!

/* synthesis translate_off */
initial begin: RAM_INIT
    integer    i;
    for (i=0; i<NUM_WORDS; i=i+1) begin
        ram_mem[i] = {DATA_WIDTH{1'b0}};
    end
end
/* synthesis translate_on */

NUM_WORDS表示RAM深度,DATA_WIDTH表示数据宽度

准备一个初始化文件,
用readmemh/readmemb就可以了,

我也一头雾水,学习中

做个工具生成VERILOG初始化代码,仿真时候可以用。用SYNPLIFY PRO 也可以直接用

总结一下
1.ISE/Quastus II 都会有这样的功能,通过使用某个特殊格式的文件。能够对Memory赋值 用于仿真
2.通过initial在语句,使用readmemh读某个文件给memory赋值

文件初始化可以哈

怎么不用coe文件初始化?

既然是用寄存器搭建存储器的话,应该加上复位端口吧。

还是觉得*.coe文件比较好用~不过个人有个人的习惯

只是仿真的话,你可以直接在源代码里加这么一段用于初始化
integer i;
initial
begin
for(i=0;i<=xxx;i=i+1)
ram[i]= yyy;
end

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top