天天看点

用Verilog设计仿真一个ram

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),它们之间的区别是什么呢?先看看它们的接口。

用Verilog设计仿真一个ram

可以看到他们的接口区别

用Verilog设计仿真一个ram

 最简单的单端口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读写验证。

继续阅读