questasim/modelsim独立仿真vivado ddr3控制器(mig)

1.使用场合介绍

当工程中使用DDR做数据缓存时,使用vivado默认仿真器进行功能仿真时速率特别慢,而使用vivado和questasim联合仿真选项虽然能加速仿真(相当于从vivado跳转到questasim进行仿真),但是调试过程中每次修改代码都需要在vivado工具上修改并编译后再跳转到questasim进行波形仿真,流程比较麻烦。本文通过将vivado仿真ddr3控制器所需要的仿真文件扣出来到questasim中进行独立编译仿真。

2.使用vivado联合questasim仿真

为了了解仿真DDR3所需要的文件以及编译流程,先通过vivado跳转到questasim仿真查看编译了哪些文件。

2.1搭建仿真环境

2.1.1导出mig仿真例程

根据自己板子的ddr3芯片型号和使用需求生成mig,本文将mig ip核生成名为ddr3,勾选AXI4 Interface选项,在source框右击ddr3,选择Open Ip Example Design...选项,创建仿真工程ddr3_ex。

仿真工程生成好后找到ddr3_ex文件夹路径下imports文件夹,导入ddr3_model.sv,ddr3_model_parameters.vh,wiredly.v到自己工程目录下,并将sim_tb_top.v中的example_top换成自己需要仿真的顶层文件。最终如下图所示

2.2.2设置vivado仿真工具

点击Tools->setting

修改如下设置

点击Run Simulation跳转到questasim进行仿真,如下图所示

 仿真波形

2.2.3 查看仿真流程

进入工程路径下XX.sim->sim_1->behav->questa,有三个脚本可执行文件compile.bat,elaborate.bat和simulate.bat。分别代表仿真的三个步骤:综合,优化,执行仿真。

compile.bat:综合脚本,对源文件进行综合。脚本调用了DDR_AXI_tb_compile.do

@echo off
REM ****************************************************************************
REM Vivado (TM) v2021.1 (64-bit)
REM
REM Filename    : compile.bat
REM Simulator   : Mentor Graphics Questa Advanced Simulator
REM Description : Script for compiling the simulation design source files
REM
REM Generated by Vivado on Sun Mar 24 21:40:16 +0800 2024
REM SW Build 3247384 on Thu Jun 10 19:36:33 MDT 2021
REM
REM IP Build 3246043 on Fri Jun 11 00:30:35 MDT 2021
REM
REM usage: compile.bat
REM
REM ****************************************************************************
set bin_path=D:\\questa202101\\win64
call %bin_path%/vsim  -c -do "do {DDR_AXI_tb_compile.do}" -l compile.log
if "%errorlevel%"=="1" goto END
if "%errorlevel%"=="0" goto SUCCESS
:END
exit 1
:SUCCESS
exit 0

DDR_AXI_tb_compile.do

包含Mig控制器仿真需要的所有源文件路径,将所有路径下的源文件拷贝出来,后期使用questasim独立综合使用。

######################################################################
#
# File name : DDR_AXI_tb_compile.do
# Created on: Sun Mar 24 21:40:16 +0800 2024
#
# Auto generated by Vivado for 'behavioral' simulation
#
######################################################################
D:\\questa202101\\win64\\vlib questa_lib/work
D:\\questa202101\\win64\\vlib questa_lib/msim

D:\\questa202101\\win64\\vlib questa_lib/msim/xil_defaultlib

D:\\questa202101\\win64\\vmap xil_defaultlib questa_lib/msim/xil_defaultlib

D:\\questa202101\\win64\\vlog  -incr -mfcu -work xil_defaultlib  "+incdir+../../../../../imports" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_ctrl_addr_decode.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_ctrl_read.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_ctrl_reg.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_ctrl_reg_bank.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_ctrl_top.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_ctrl_write.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_mc.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_mc_ar_channel.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_mc_aw_channel.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_mc_b_channel.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_mc_cmd_arbiter.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_mc_cmd_fsm.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_mc_cmd_translator.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_mc_fifo.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_mc_incr_cmd.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_mc_r_channel.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_mc_simple_fifo.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_mc_wrap_cmd.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_mc_wr_cmd_fsm.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_axi_mc_w_channel.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_ddr_axic_register_slice.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_ddr_axi_register_slice.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_ddr_axi_upsizer.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_ddr_a_upsizer.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_ddr_carry_and.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_ddr_carry_latch_and.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_ddr_carry_latch_or.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_ddr_carry_or.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_ddr_command_fifo.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_ddr_comparator.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_ddr_comparator_sel.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_ddr_comparator_sel_static.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_ddr_r_upsizer.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/axi/mig_7series_v4_2_ddr_w_upsizer.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/clocking/mig_7series_v4_2_clk_ibuf.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/clocking/mig_7series_v4_2_infrastructure.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/clocking/mig_7series_v4_2_iodelay_ctrl.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/clocking/mig_7series_v4_2_tempmon.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/controller/mig_7series_v4_2_arb_mux.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/controller/mig_7series_v4_2_arb_row_col.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/controller/mig_7series_v4_2_arb_select.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/controller/mig_7series_v4_2_bank_cntrl.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/controller/mig_7series_v4_2_bank_common.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/controller/mig_7series_v4_2_bank_compare.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/controller/mig_7series_v4_2_bank_mach.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/controller/mig_7series_v4_2_bank_queue.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/controller/mig_7series_v4_2_bank_state.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/controller/mig_7series_v4_2_col_mach.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/controller/mig_7series_v4_2_mc.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/controller/mig_7series_v4_2_rank_cntrl.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/controller/mig_7series_v4_2_rank_common.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/controller/mig_7series_v4_2_rank_mach.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/controller/mig_7series_v4_2_round_robin_arb.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/ecc/mig_7series_v4_2_ecc_buf.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/ecc/mig_7series_v4_2_ecc_dec_fix.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/ecc/mig_7series_v4_2_ecc_gen.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/ecc/mig_7series_v4_2_ecc_merge_enc.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/ecc/mig_7series_v4_2_fi_xor.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/ip_top/mig_7series_v4_2_memc_ui_top_axi.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/ip_top/mig_7series_v4_2_mem_intfc.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_byte_group_io.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_byte_lane.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_calib_top.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_if_post_fifo.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_mc_phy.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_mc_phy_wrapper.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_of_pre_fifo.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_4lanes.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_ck_addr_cmd_delay.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_dqs_found_cal.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_dqs_found_cal_hr.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_init.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_ocd_cntlr.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_ocd_data.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_ocd_edge.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_ocd_lim.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_ocd_mux.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_ocd_po_cntlr.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_ocd_samp.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_oclkdelay_cal.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_prbs_rdlvl.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_rdlvl.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_tempmon.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_top.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_wrcal.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_wrlvl.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_phy_wrlvl_off_delay.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_prbs_gen.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_ddr_skip_calib_tap.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_poc_cc.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_poc_edge_store.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_poc_meta.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_poc_pd.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_poc_tap_base.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/phy/mig_7series_v4_2_poc_top.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/ui/mig_7series_v4_2_ui_cmd.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/ui/mig_7series_v4_2_ui_rd_data.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/ui/mig_7series_v4_2_ui_top.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/ui/mig_7series_v4_2_ui_wr_data.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/ddr3_mig_sim.v" \
"../../../../project_1.gen/sources_1/ip/ddr3/ddr3/user_design/rtl/ddr3.v" \
"../../../../../src/fdma_test.v" \
"../../../../../src/signal_sync.v" \
"../../../../../src/uiFDMA.v" \
"../../../../../imports/wiredly.v" \

D:\\questa202101\\win64\\vlog  -incr -mfcu -sv -work xil_defaultlib  "+incdir+../../../../../imports" \
"../../../../../imports/ddr3_model.sv" \

D:\\questa202101\\win64\\vlog  -incr -mfcu -work xil_defaultlib  "+incdir+../../../../../imports" \
"../../../../../tb/DDR_AXI_tb.v" \

# compile glbl module
D:\\questa202101\\win64\\vlog -work xil_defaultlib "glbl.v"

quit -force

elaborate.bat:优化

@echo off
REM ****************************************************************************
REM Vivado (TM) v2021.1 (64-bit)
REM
REM Filename    : elaborate.bat
REM Simulator   : Mentor Graphics Questa Advanced Simulator
REM Description : Script for elaborating the compiled design
REM
REM Generated by Vivado on Sun Mar 24 21:40:34 +0800 2024
REM SW Build 3247384 on Thu Jun 10 19:36:33 MDT 2021
REM
REM IP Build 3246043 on Fri Jun 11 00:30:35 MDT 2021
REM
REM usage: elaborate.bat
REM
REM ****************************************************************************
set bin_path=D:\\questa202101\\win64
call %bin_path%/vsim  -c -do "do {DDR_AXI_tb_elaborate.do}" -l elaborate.log
if "%errorlevel%"=="1" goto END
if "%errorlevel%"=="0" goto SUCCESS
:END
exit 1
:SUCCESS
exit 0

 DDR_AXI_tb_elaborate.do

######################################################################
#
# File name : DDR_AXI_tb_elaborate.do
# Created on: Sun Mar 24 21:40:34 +0800 2024
#
# Auto generated by Vivado for 'behavioral' simulation
#
######################################################################
D:\\questa202101\\win64\\vopt +acc=npr -L xil_defaultlib -L unisims_ver -L unimacro_ver -L secureip -L xpm -work xil_defaultlib xil_defaultlib.DDR_AXI_tb xil_defaultlib.glbl -o DDR_AXI_tb_opt

quit -force

simulate.bat:启动仿真

@echo off
REM ****************************************************************************
REM Vivado (TM) v2021.1 (64-bit)
REM
REM Filename    : simulate.bat
REM Simulator   : Mentor Graphics Questa Advanced Simulator
REM Description : Script for simulating the design by launching the simulator
REM
REM Generated by Vivado on Sun Mar 24 21:40:47 +0800 2024
REM SW Build 3247384 on Thu Jun 10 19:36:33 MDT 2021
REM
REM IP Build 3246043 on Fri Jun 11 00:30:35 MDT 2021
REM
REM usage: simulate.bat
REM
REM ****************************************************************************
set bin_path=D:\\questa202101\\win64
call %bin_path%/vsim   -do "do {DDR_AXI_tb_simulate.do}" -l simulate.log
if "%errorlevel%"=="1" goto END
if "%errorlevel%"=="0" goto SUCCESS
:END
exit 1
:SUCCESS
exit 0

 DDR_AXI_tb_simulate.do

######################################################################
#
# File name : DDR_AXI_tb_simulate.do
# Created on: Sun Mar 24 21:40:47 +0800 2024
#
# Auto generated by Vivado for 'behavioral' simulation
#
######################################################################
vsim -lib xil_defaultlib DDR_AXI_tb_opt

set NumericStdNoWarnings 1
set StdArithNoWarnings 1

do {DDR_AXI_tb_wave.do}

view wave
view structure
view signals

do {DDR_AXI_tb.udo}

run 1000ns

3.移植到questasim进行独立仿真

参照上面仿真步骤以及之前博文(使用tcl脚本在questasim中仿真vivado工程)中questasim脚本仿真流程,编写仿真脚本

sim_axi_ddr.tcl


set system_name      DDR_MIG
set TOP_LEVEL_NAME   DDR_AXI_tb

vlib   questa_lib
vlib ./questa_lib/work
vlib ./questa_lib/msim
vlib ./questa_lib/msim/work
# compile system, only need to run once (without IP and src changes)
alias build {
  # compile ddr3 simulation model
   vlog  -mfcu -work work -f  filelist.f
   vlog  -mfcu -work work   ../../../src/axi_ddr/imports/wiredly.v
   vlog  -mfcu -sv -work work   ../../../src/axi_ddr/imports/ddr3_model.sv
   # compile glbl module
   vlog -work work "glbl.v"
   # compile user module
   vlog -incr -mfcu -work work ../../../src/axi_ddr/*.v
   vlog  -incr -mfcu -work work DDR_AXI_tb.v
}
alias elab_ddr3 {
  vopt +acc=npr -L work -L unisims_ver -L unimacro_ver -L secureip -L xpm -work work work.DDR_AXI_tb work.glbl -o DDR_AXI_tb_opt
  vsim -lib work DDR_AXI_tb_opt
  set NumericStdNoWarnings 1
  set StdArithNoWarnings 1
  do {DDR_AXI_tb_wave.do}
  view wave
  view structure
  view signals

}


alias rerun {
   elab_ddr3
   log -rec /*
   run -all
}

 源文件filelist.f

../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_ctrl_addr_decode.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_ctrl_read.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_ctrl_reg.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_ctrl_reg_bank.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_ctrl_top.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_ctrl_write.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_mc.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_mc_ar_channel.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_mc_aw_channel.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_mc_b_channel.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_mc_cmd_arbiter.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_mc_cmd_fsm.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_mc_cmd_translator.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_mc_fifo.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_mc_incr_cmd.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_mc_r_channel.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_mc_simple_fifo.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_mc_wrap_cmd.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_mc_wr_cmd_fsm.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_axi_mc_w_channel.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_ddr_axic_register_slice.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_ddr_axi_register_slice.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_ddr_axi_upsizer.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_ddr_a_upsizer.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_ddr_carry_and.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_ddr_carry_latch_and.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_ddr_carry_latch_or.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_ddr_carry_or.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_ddr_command_fifo.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_ddr_comparator.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_ddr_comparator_sel.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_ddr_comparator_sel_static.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_ddr_r_upsizer.v
../../../src/axi_ddr/rtl/axi/mig_7series_v4_2_ddr_w_upsizer.v
../../../src/axi_ddr/rtl/clocking/mig_7series_v4_2_clk_ibuf.v
../../../src/axi_ddr/rtl/clocking/mig_7series_v4_2_infrastructure.v
../../../src/axi_ddr/rtl/clocking/mig_7series_v4_2_iodelay_ctrl.v
../../../src/axi_ddr/rtl/clocking/mig_7series_v4_2_tempmon.v
../../../src/axi_ddr/rtl/controller/mig_7series_v4_2_arb_mux.v
../../../src/axi_ddr/rtl/controller/mig_7series_v4_2_arb_row_col.v
../../../src/axi_ddr/rtl/controller/mig_7series_v4_2_arb_select.v
../../../src/axi_ddr/rtl/controller/mig_7series_v4_2_bank_cntrl.v
../../../src/axi_ddr/rtl/controller/mig_7series_v4_2_bank_common.v
../../../src/axi_ddr/rtl/controller/mig_7series_v4_2_bank_compare.v
../../../src/axi_ddr/rtl/controller/mig_7series_v4_2_bank_mach.v
../../../src/axi_ddr/rtl/controller/mig_7series_v4_2_bank_queue.v
../../../src/axi_ddr/rtl/controller/mig_7series_v4_2_bank_state.v
../../../src/axi_ddr/rtl/controller/mig_7series_v4_2_col_mach.v
../../../src/axi_ddr/rtl/controller/mig_7series_v4_2_mc.v
../../../src/axi_ddr/rtl/controller/mig_7series_v4_2_rank_cntrl.v
../../../src/axi_ddr/rtl/controller/mig_7series_v4_2_rank_common.v
../../../src/axi_ddr/rtl/controller/mig_7series_v4_2_rank_mach.v
../../../src/axi_ddr/rtl/controller/mig_7series_v4_2_round_robin_arb.v
../../../src/axi_ddr/rtl/ecc/mig_7series_v4_2_ecc_buf.v
../../../src/axi_ddr/rtl/ecc/mig_7series_v4_2_ecc_dec_fix.v
../../../src/axi_ddr/rtl/ecc/mig_7series_v4_2_ecc_gen.v
../../../src/axi_ddr/rtl/ecc/mig_7series_v4_2_ecc_merge_enc.v
../../../src/axi_ddr/rtl/ecc/mig_7series_v4_2_fi_xor.v
../../../src/axi_ddr/rtl/ip_top/mig_7series_v4_2_memc_ui_top_axi.v
../../../src/axi_ddr/rtl/ip_top/mig_7series_v4_2_mem_intfc.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_byte_group_io.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_byte_lane.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_calib_top.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_if_post_fifo.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_mc_phy.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_mc_phy_wrapper.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_of_pre_fifo.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_4lanes.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_ck_addr_cmd_delay.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_dqs_found_cal.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_dqs_found_cal_hr.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_init.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_ocd_cntlr.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_ocd_data.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_ocd_edge.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_ocd_lim.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_ocd_mux.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_ocd_po_cntlr.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_ocd_samp.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_oclkdelay_cal.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_prbs_rdlvl.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_rdlvl.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_tempmon.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_top.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_wrcal.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_wrlvl.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_phy_wrlvl_off_delay.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_prbs_gen.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_ddr_skip_calib_tap.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_poc_cc.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_poc_edge_store.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_poc_meta.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_poc_pd.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_poc_tap_base.v
../../../src/axi_ddr/rtl/phy/mig_7series_v4_2_poc_top.v
../../../src/axi_ddr/rtl/ui/mig_7series_v4_2_ui_cmd.v
../../../src/axi_ddr/rtl/ui/mig_7series_v4_2_ui_rd_data.v
../../../src/axi_ddr/rtl/ui/mig_7series_v4_2_ui_top.v
../../../src/axi_ddr/rtl/ui/mig_7series_v4_2_ui_wr_data.v
../../../src/axi_ddr/rtl/ddr3_mig_sim.v
../../../src/axi_ddr/rtl/ddr3.v

打开questasim执行仿真脚本,结果与vivado联合questasim仿真结果一致

3.1在transcript命令行中cd到脚本文件路径下

3.2 source脚本文件,并执行build编译源文件

3.3 rerun,启动波形仿真

波形界面

4.注意事项

4.1 MEM_BITS

*如果需要仿真的地址空间太大需要修改ddr3_parameters.vh文件中的MEM_BITS,否则会报ERROR: Memory overflow. Write to Address 7000fe with data xxx will be lost You must increase the MEM_BITS parameter of define MAX_MEM.

MEM_BITS定义了ddr3_model.sv中地址位宽,默认为15
    在ddr3_parameters.vh文件中, 根据需要扩充MEM_BITS参数,比如修改至20。

### 关于DDR仿真的技术资料、教程和工具 #### DDR仿真概述 DDR(Double Data Rate)内存的仿真通常涉及验证其接口逻辑的功能性和时序特性。为了实现这一目标,工程师们常依赖EDA工具以及厂商提供的IP核来进行功能测试和性能评估。Xilinx提供了专门用于DDR控制器设计的MIG(Memory Interface Generator)IP核[^1]。 #### MIG IP核及其仿真支持 MIG IP核不仅简化了DDR控制流程的设计复杂度,还内置了大量的仿真模型和支持文件。这些资源可以帮助开发者快速搭建并验证DDR系统的功能性与时序匹配情况。具体来说: - **功能仿真**:通过VHDL或Verilog描述的语言级建模,能够模拟DDR控制器的行为模式。这一步骤主要关注数据流路径上的正确性,而不考虑实际物理层的具体延迟参数。 - **时序仿真**:此阶段引入精确的时间约束条件来检验信号传输过程中是否存在违反规定的情况。例如,在读取操作期间是否有足够的稳定窗口时间让接收端捕捉到来自存储器的数据位序列[^2]。 #### 推荐的技术文档与教程 以下是几类重要的参考资料供参考学习之用: - Xilinx官方发布的《UG583 - LogiCORE IP Memory Interface Solutions》手册详细介绍了如何配置使用MIG生成各种类型的动态随机存取存储器解决方案,并附带丰富的实例说明指导用户完成整个开发周期内的各项任务包括但不限于综合编译下载调试等环节。 - 另外还有针对特定型号如Zynq系列器件所编写的应用指南(APG),它们会进一步细化讲解有关该平台架构特点下的最佳实践方法论等内容。 - 对于初学者而言,《【FPGADDR3学习笔记(二)丨从SDRAM到DDR3MIG IP核设计》一文中提到的实际案例分析非常有价值,它涵盖了从基础概念理解直到最终项目实施全过程中的关键技术要点解析。 #### 常见使用的仿真工具列表 目前行业内主流可选用作DDR相关工作的软件环境有以下几个选项可供选择: - ModelSim/Questa Sim: Mentor Graphics出品的支持多标准协议验证的强大波形查看编辑工具集;特别适合做高层次抽象级别以上的纯RTL代码质量保障工作。 - Vivado Simulator: 自家产品线内部集成的一体化解方案之一,专为加速基于赛灵思硬件描述语言项目的进展速度而打造而成。 - Synopsys VCS: 商业化程度极高的一款高性能C++/System Verilog混合编程风格兼容型引擎驱动程序包组合形式呈现给客户群体作为购买决策依据考量因素之一考虑进去的话可能会更加稳妥一些吧! ```python # 示例Python脚本展示自动化运行Modelsim命令行版进行批处理作业的方式 import subprocess def run_modelsim_simulation(tcl_script_path): try: result = subprocess.run(['vsim', '-c', '-do', tcl_script_path], check=True, text=True) print(result.stdout) except subprocess.CalledProcessError as e: print(f"An error occurred while running the simulation: {e}") if __name__ == "__main__": script_file = "./simulate_ddr.tcl" run_modelsim_simulation(script_file) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值