之前调试DDR都是下载板子直接观测ChipScope验证。最近需要搭建自己的DDR仿真平台。尝试在IP核里的sim文件为基础,修改添加适合自己的仿真平台。具体过程如下。

按照硬件对应的片子生成DDR3 IP,去掉IPcore,添加生成的RTL代码

搭建 仿chatgpt 搭建仿真平台_IP

搭建 仿chatgpt 搭建仿真平台_IP_02

 

以下主要利用IP核生成的仿真文件搭建适合自己的仿真平台。

  • 添加文件到工程

DDR3生成的仿真文件夹在“...\ipcore_dir\IP_DDR3\example_design\sim”里文件如下:

搭建 仿chatgpt 搭建仿真平台_实例化_03

这里主要用到的文件为3个.V和一个.vh。

将这3个.V和一个.vh复制到自己的工程源文件夹(“...\sim”)里,如下图:

搭建 仿chatgpt 搭建仿真平台_ISE14.7 DDR3_04

添加这4个文件到工程中:

搭建 仿chatgpt 搭建仿真平台_IP_05

  • 修改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

搭建 仿chatgpt 搭建仿真平台_搭建 仿chatgpt_06

修改2:由于我在内部额外添加了DCM,外部输入时钟为100MHz,实际输入给你DDR3的时钟为200MHz,所以将CLKIN_PERIOD改为10000,但是这个定义不用传到下一层。这里只为了方便仿真激励的产生。DDR3的CLKIN_PERIOD还是使用内部默认定义,没有修改。

搭建 仿chatgpt 搭建仿真平台_实例化_07

搭建 仿chatgpt 搭建仿真平台_搭建 仿chatgpt_08

修改3:屏蔽掉自带的仿真实例化模块:example_top,改为自己的DDR3模块

搭建 仿chatgpt 搭建仿真平台_实例化_09

搭建 仿chatgpt 搭建仿真平台_搭建 仿chatgpt_10

自己生成的DDR3模块添加了测试接口tirg0,trig1,start,Frame_Length等信号。时钟接口由单端改为差分。自己的DDR3模块包括一个DCM,一个用户封装的fifo接口,还有DDR3核源文件。

搭建 仿chatgpt 搭建仿真平台_实例化_11

***同时要注意在实例化DDR3.v时,以下6个信号必须给定,这写信号会影响仿真,不影响实际下板子运行。

搭建 仿chatgpt 搭建仿真平台_搭建 仿chatgpt_12

我最开始自认为这几个信号没有用到,就直接没有声明,导致仿真时DDR3在初始化完成后只写了25个地址的数据后,DDR3_CS_N信号就为2’bX,造成后续写失败。如下图:

搭建 仿chatgpt 搭建仿真平台_IP_13

修改4:屏蔽两个系统函数$finish,以便让仿真继续持续运行。

搭建 仿chatgpt 搭建仿真平台_DDR3搭建仿真平台_14

  • 添加ddr3_model_parameters.vh文件到仿真软件目录下:C:\questasim_10.0b\verilog_src\ovm-2.1.1\src。不然仿真可能会出现找不到这个.vh文件。

搭建 仿chatgpt 搭建仿真平台_实例化_15

在ISE里打开sim软件,添加需要观测的信号,运行仿真。

搭建 仿chatgpt 搭建仿真平台_ISE14.7 DDR3_16

 

搭建 仿chatgpt 搭建仿真平台_ISE14.7 DDR3_17

至此,自己的仿真平台搭建完成。

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.