C5 的 DDR3 软核控制器 IP 仿真
Cyclone5 的 DDR3 控制器分两种,一种是硬核控制器,另一种是软核控制器,两者生成
的 IP 文件结构类似,仿真方法也类似,这里以软核控制器为例,介绍 IP 生成的组成部分以
及如何对这个 IP 进行仿真。
注:和本文档配套的 DEMO 为 c5_ddr3_soft_ctrl_ip_sim.zip
本文档的 DEMO 使用的 QII 版本是 13.1
强烈建议使用 Verilog 语言生成 IP
1. 首 先 是 生 成 DDR3 的 软 核 控 制 器 IP , 在 本 说 明 文 档 中 生 成 的 软 核 控 制 器 起 名
c5_ddr3_soft_ctrl。在 IP 参数设置完成,点击 Finish 按钮时会弹出对话框,询问是否需
要生成 Example Design,默认是选中的,这里为了做仿真,这个 Example Design 工程需
要生成。如果不想要生成 Example Design,就不选复选框,并把这个对话框 X 掉。
2. 生成的 DDR3 软核控制器 IP 的文件结构主要分三部分:用于综合的源代码文件,用于仿
真的源代码文件,Example 工程,其中 Example 工程又分两部分:可综合上板测试的源
代码工程,对应的仿真工程,具体如下图所示。
这里强调一下:如果要把这个 IP 添加到自己的大工程中做仿真,不要用 c5_ddr3_soft_ctrl
文件夹下用于综合的源代码文件,要用 c5_ddr3_soft_ctrl_sim 文件夹下专门用于仿真的源代
码文件。
3. 在把 IP 添加到自己的大工程中做仿真之前,我们还需要准备一个 DDR3 存储器的仿真模
型,有两种方法:一种是根据 IP 生成时选用的 DDR3 颗粒型号,到对应的官网上获取仿
真模型,另一种是借助 example 工程的仿真工程,由 QII 生成 DDR3 存储器仿真模型。
这里主要介绍如何通过仿真工程来生成 DDR3 存储器的仿真模型。
打开_example_design/simulation 文件夹,根据 README.txt 中的步骤,先在 QII
中打开这个工程,运行对应的 TCL 文件:
使用 VHDL 语言则选择 generate_sim_vhdl_example_design.tcl
使用 Verilog 语言则选择 generate_sim_verilog_example_design.tcl
运行的方法是:点击菜单 Tools ‐> Tcl Scripts...,在弹出对话框中选择 TCL 文件,点击 Run,
如下图所示,这个 TCL 运行需要一些时间,耐心等待下。。。
等这个 TCL 运行完后,在 Verilog 文件夹(因为我这里运行的是 verilog 的 TCL)下会新生
成一些文件夹和文件,如下图所示。
如果你使用 Modelsim 仿真工具,则打开 Modelsim,把目录定位到 mentor 文件夹,运
行 run.do,就可以对这个 example 工程进行仿真了。需要注意 Modelsim 的版本,太低可能
仿不起来。
这里我们的重点是要获取 DDR3 存储器的仿真模型,所以打开 example 工程仿真的源代
码文件夹 submodules,找到以下两个文件,这两个文件就是 DDR3 存储器的仿真模型。
alt_mem_if_common_ddr_mem_model_ddr3_mem_if_dm_pins_en_mem_if_dqsn_en.sv
alt_mem_if_ddr3_mem_model_top_ddr3_mem_if_dm_pins_en_mem_if_dqsn_en.sv
4. 在获取了 DDR3 存储器的仿真模型后,下面就介绍如何在自己的工程环境中对生成的软
核控制器进行仿真。在第 2 步中特别强调过,仿真要用 c5_ddr3_soft_ctrl_sim 文件夹里
的源代码,c5_ddr3_soft_ctrl_sim 文件夹的文件结构如下所示。
这里是用 Modelsim 来仿真,所以重点关注 Mentor 文件夹下的仿真脚本,其他几个文件
夹(aldec,cadence,synopsys)放着碍眼的话干脆就删掉。
Mentor 文件夹下的 msim_setup.tcl 文件给出了编译器件库和编译仿真源码文件的脚本,
后续我就是基于这个脚本做修改来仿真自己的 DDR3 软核控制器驱动代码的。
5. 在 c5_ddr3_soft_ctrl_sim 文件夹下添加了两个文件:
ddr3_driver.vhd 自己写的 DDR3 软核控制器的驱动代码
c5_ddr3_soft_ctrl_sim.v 自己写的仿真的顶层文件,包含了 tb
另外将 DDR3 存储器的模型拷贝到 c5_ddr3_soft_ctrl_sim/c5_ddr3_soft_ctrl 文件夹下。
c5_ddr3_soft_ctrl_sim.v 中包含了三个模块:ddr3_driver.vhd,c5_ddr3_soft_ctrl.v 以及
DDR3 存储器模型,具体可以参见源代码。
6. 接下来就是解释和修改 mentor 文件加下的 msim_setup.tcl 脚本。打开 msim_setup.tcl 文
件,下面这段代码是设置一些变量,需要特别注意的是 TOP_LEVEL_NAME,在初始的
msim_setup.tcl 文件中 TOP_LEVEL_NAME 的值是 IP 的顶层文件名,这里我们的顶层已经
是 c5_ddr3_soft_ctrl_sim.v,所以将 c5_ddr3_soft_ctrl_sim 替换 c5_ddr3_soft_ctrl。
接下来定义了一些 alias:(按我的理解 alias 相当于一些函数)
file_copy:拷贝一些仿真用的.hex 文件
dev_com:编译库文件
com:编译 IP 仿真的源码文件
elab 和 elab_debug:启动仿真,两者的区别是后者带 novopt 选项
ld 和 ld_debug:是上述 alias 的集合
h:是在 Modelsim 的命令行窗口打印出定义的这些 alias 和变量的帮助信息
因为我们还添加了几个文件:
仿真的顶层文件 c5_ddr3_soft_ctrl_sim.v
DDR3 软核控制器的驱动文件 ddr3_driver.vhd
DDR3 存储器模型文件
alt_mem_if_common_ddr_mem_model_ddr3_mem_if_dm_pins_en_mem_if_dqsn_en.sv
alt_mem_if_ddr3_mem_model_top_ddr3_mem_if_dm_pins_en_mem_if_dqsn_en.sv
所以在 com 这个 alias 中需要添加如下编译源文件的脚本,具体可以参看修改后的
msim_setup.tcl 文件:
注意:上述添加的编译脚本中文件的目录要和你实际放置源文件的目录保持一致
7. 到此整个仿真的环境已经搭建好了,写个简单的.do 文件,如下所示,然后打开 Modelsim,
切换目录到 c5_ddr3_soft_ctrl_sim\mentor 下,输入 do run.do,就可以仿真了!
8. 需要注意的是和该文档配套的 DEMO 中,msim_setup.tcl 脚本中的 QUARTUS_INSTALL_DIR
是 我 电 脑 上 的 QII13.1 安 装 目 录 , 所 以 在 直 接 运 行 DEMO 之 前 , 先 要 把
QUARTUS_INSTALL_DIR 的值改成对应的 QII13.1 安装目录。
然后打开 Modelsim,
输入以下命令:
cd {<文件解压目录> \c5_ddr3_soft_ctrl_sim\mentor}
do run.do
然后就可以仿真了!
如下是仿真波形:
DDR3 控制器 IP 的驱动代码是先对 0BANK 的第 0 行写,然后再读,读出的同时会做校验,
读完后又重新对这一行进行写,再读取校验,如此反复。从下面的这个仿真波形可以看出,
校验标记 test_flag 从读数据开始一直为高,说明读取校验是正确的!