之前调试DDR都是下载板子直接观测ChipScope验证。最近需要搭建自己的DDR仿真平台。尝试在IP核里的sim文件为基础,修改添加适合自己的仿真平台。具体过程如下。
按照硬件对应的片子生成DDR3 IP,去掉IPcore,添加生成的RTL代码
以下主要利用IP核生成的仿真文件搭建适合自己的仿真平台。
- 添加文件到工程
DDR3生成的仿真文件夹在“...\ipcore_dir\IP_DDR3\example_design\sim”里文件如下:
这里主要用到的文件为3个.V和一个.vh。
将这3个.V和一个.vh复制到自己的工程源文件夹(“...\sim”)里,如下图:
添加这4个文件到工程中:
- 修改sim_tb_top.v文件
注意这两个信号SIM_BYPASS_INIT_CAL和SIMULATION这两个信号,在sim_tb_top.v文件里定义为:
parameter SIMULATION = "TRUE";
parameter SIM_BYPASS_INIT_CAL = "FAST";
适用于仿真模式,在implementation时应该是
parameter SIMULATION = "FALSE";
parameter SIM_BYPASS_INIT_CAL = "OFF";
修改1:屏蔽P84到P106
修改2:由于我在内部额外添加了DCM,外部输入时钟为100MHz,实际输入给你DDR3的时钟为200MHz,所以将CLKIN_PERIOD改为10000,但是这个定义不用传到下一层。这里只为了方便仿真激励的产生。DDR3的CLKIN_PERIOD还是使用内部默认定义,没有修改。
修改3:屏蔽掉自带的仿真实例化模块:example_top,改为自己的DDR3模块
自己生成的DDR3模块添加了测试接口tirg0,trig1,start,Frame_Length等信号。时钟接口由单端改为差分。自己的DDR3模块包括一个DCM,一个用户封装的fifo接口,还有DDR3核源文件。
***同时要注意在实例化DDR3.v时,以下6个信号必须给定,这写信号会影响仿真,不影响实际下板子运行。
我最开始自认为这几个信号没有用到,就直接没有声明,导致仿真时DDR3在初始化完成后只写了25个地址的数据后,DDR3_CS_N信号就为2’bX,造成后续写失败。如下图:
修改4:屏蔽两个系统函数$finish,以便让仿真继续持续运行。
- 添加ddr3_model_parameters.vh文件到仿真软件目录下:C:\questasim_10.0b\verilog_src\ovm-2.1.1\src。不然仿真可能会出现找不到这个.vh文件。
在ISE里打开sim软件,添加需要观测的信号,运行仿真。
至此,自己的仿真平台搭建完成。
ddr3_model.v模型文件里默认定义的地址位宽是15。如果想仿真更多的地址空间,需要修改ddr3_model.v里的MEM_BITS定义。
// Size Parameters
P184 parameter MEM_BITS = 15; // Set this parameter to control how many write data bursts can be stored in memory. The default is 2^10=1024.