verilog里面的RAM的初始化问题
比如设计一个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
