RAM(Random Access Memory)随机存储器,从功能上主要分为
- DRAM(Dynamic Random Access Memory,动态随机存储器)
- SRAM(Static Random Access Memory,静态随机存储器)
从Verilog语法定义的角度来看,定义一个存储器的语法格式为
reg [ 47 : 0 ] mem [ 0 : 255 ];
上面这句代码的的含义即创建了一个数据位宽为48,地址深度为256的存储器,默认地址为0的是第一层,每个地址有一个48位宽的数据。存储器每次进行写操作时,需要写入的数据和写入的地址两个输入端口。读操作时只需要一个地址即可将该地址下的数据读出。
从ram的结构来看,ram主要分为三种,单端口RAM、伪双端口RAM(Simple Dual)和双端口RAM(True Dual),它们之间的区别是什么呢?先看看它们的接口。
可以看到他们的接口区别
最简单的单端口ram,只有一个输入端口和一个输出端口,以及一个地址接口,代码也很简单。
module mem(
input clk ,
input en_wr,
input [5:0] addr ,
input [47:0]din ,
output reg[47:0]dout
);
reg [47:0] mem [0:255];
always @(posedge clk)
begin
if(en_wr)
mem [addr] <= din;
else
dout <= dout;
end
endmodule
接下来对这个单端口ram进行仿真验证
initial
begin
//写使能时使用for循环遍历每个地址,给地址0写入1,给地址1写入2···给地址255写100
for (i = 0; i < 256; i = i + 1)
begin
@(negedge clk)
begin
address = i;
din = din + 1;
end
end
//读使能时再将 刚才写入的值一一读出来
for (i = 0; i < 256; i = i + 1)
begin
@(negedge clk)
address = i;
end
end
这样就可以在波形上看到一个时序的ram写入和读出,如果我们要对一个真实的ram进行读写验证,将写入的数据和读出的数据进行对比,单纯用上面的方式就无法直观的看到,有没有读写错误和工艺缺陷。
对一个真实的ram进行读写验证,我们就需要测到每一个存储单元的01翻转是否正常,会不会由于工艺问题导致短路,存取数据时就会出现错误,一般常用的测试信号有ALLF、ALL0、5a、3c、69等有规律的01相邻的各个情况,这样的话要在测试时创建一个虚拟ram将写入的数据保存下来,在读使能的时候,将dout和虚拟ram中一位一位进行比较,最后输出一个直观比较结果。
在测试文件中定义一个存储器即为虚拟ram,这个虚拟ram没有真实的ram映射,只是用来存储一些二维的数据,方便进行ram读写验证。