Questasim仿真脚本
1.仿真目录层级:
D:.
├─run
│ clean.sh
│ compile.sh
│ filelist.f
└─tb
│ case_List.txt
│ monitor.sv
│ tb_top.sv
└─case
tc001.sv
tc002.sv
tc003.sv
run下面保存的是仿真相关的脚本或者makefile,tb下是case列表,tb的顶层,激励driver,monitor等模块。仿真时,在run目录下执行make vcs或者bash compile.sh等命令启动仿真,make clean或者执行clean.sh清空run下仿真生成的中间文件。
2.compile.sh脚本
rm wave.vcd
vlib work
vmap work work
vlog -f filelist.f -work work
if [ $# -ge 1 ];then
vsim -gui -novopt work.tb_top -do “run -all”
else
vsim -c -novopt work.tb_top -do “run -all”
fi
- 先删除生成的vcd波形文件
- 创建一个库work,映射工作区到work库(这个我不知道该怎么描述)
- 用vlog -f filelist.f -work work去编译所有的源文件。如果有fpga的ip,也可以在这里写相应的vlog去编译。编译ip库常见的有2种,编译ip目录下的行为级仿真模块,_sim.v结尾的,另一种是编译源文件,可以用vivado工具导出questasim的脚本,查看具体需要编译哪些文件,拷贝过来即可。
- vsim就是启动仿真,-c是不启动gui,可以靠查看仿真中的判断打印来了解仿真信息。-gui启动gui。 -do后面跟do文件,或者双引号内直接引用命令,run -all是一直运行,直到stop或者finish。
3. tb的编写
大多数前端设计或者FPGA开发都不需要用uvm,但可以借鉴uvm的思路。
- tb里可以用include把case的代码引用进来
- tb顶层只有dut模块和driver 2个模块。
- case的.v文件里是task。task修改driver内部的寄存器配置,使driver发数据。
- monitor模块去获取dut的输出,做数据的获取,counter的锁存等。
- case里还有check模块,检查数据,检查counter,检查每个关键值,如fifo的写满,读空,错误的计数等。
- 每个case task内部就是,control driver,wait end,check。
4. filelist的编写
还没详细看过questasim的手册,不知道questasim如何支持filelist的相对路径嵌套。synopsis的工具都支持用-F调用相对路径的filelist,用-f调用绝对路径。我比较推荐使用相对路径,拷贝时可以不用做修改。
例如如下的filelist.f
+define+SIM
+incdir+../../../src/include
../../../src/include/BUS_DEFINE.sv
../../../src/1553b_app/1553b_app.sv
../../../src/1553b_app/APP_rx.sv
../../../src/1553b_app/APP_tx.sv
../../../src/1553b_app/AXIS_pack.sv
filelist中最重要的就是3种定义:
- +define+ 定义宏
- +incdir+定义include的路径
- .v .sv 指定加源文件
Questasim仿真vivado ip核
compile脚本需要修改,加入work.top和work.glbl,一定要加work.glbl,不然仿真会报找不到glbl,哪怕你编译到work里了。
vsim -c -novopt work.tb_top work.glbl -do “run -all”
filelist.f中要加入以下库文件:
+libext+.v
-y /opt/Xilinx/Vivado/2019.2/data/verilog/src/retarget
-y /opt/Xilinx/Vivado/2019.2/data/verilog/src/unisims
-y /opt/Xilinx/Vivado/2019.2/data/verilog/src/unimacro
-y /opt/Xilinx/Vivado/2019.2/data/verilog/src/retarget
-f filelist2.f
设计文件可以写到filelist2.f里,也可以直接追加到filelist.f的内容后面。filelist2.f中加入ip目录下的xxx_sim_netlist.v,该文件下有所有这个ip要用到的模块。该模块只能仿真用,是行为级的代码。有的ip核仿真用这个文件会有功能问题。ddr4仿真,就会出现init_done一直不拉高。需要导出questasim仿真脚本,用脚本中添加的源文件来仿真。
-y 是指编译这个文件夹下面的文件,+libext+指识别.v的扩展文件
要特别注意,vhdl和verilog混合仿真时,vhdl和verilog代码中会调用同一个组件,但是他们分别来自不同的library,如unisim和unisim_ver,它们相互并不通用,及verilog不能调用unisim_ver的组件,会造成组件找到却没办法绑定的错误,如:“Port ‘Q’ not found in the connected module”?所以当仿真时,由于vhdl代码中会指定从那个库文件里面提取,而verilog代码中没有,所以使用vsim命令时,把verilog所需的库放在第一个,而后放vhdl所需的库,这样,verilog会从unisim_ver代码开始查询组件。引用自MODELISM 仿真遇到glbl问题。
如果要仿真加密的ip核,还需要根据仿真报告加入缺少的库,例如仿真gtp时还要加入以下几个源文件。
/opt/Xilinx/Vivado/2019.2/data/secureip/gtpe2_common/gtpe2_common_001.vp
/opt/Xilinx/Vivado/2019.2/data/secureip/gtpe2_common/gtpe2_common_002.vp
/opt/Xilinx/Vivado/2019.2/data/secureip/gtpe2_channel/gtpe2_channel_001.vp
/opt/Xilinx/Vivado/2019.2/data/secureip/gtpe2_channel/gtpe2_channel_002.vp
/opt/Xilinx/Vivado/2019.2/data/secureip/gtxe2_common/gtxe2_common_001.vp
/opt/Xilinx/Vivado/2019.2/data/secureip/gtxe2_common/gtxe2_common_002.vp
/opt/Xilinx/Vivado/2019.2/data/secureip/gtxe2_channel/gtxe2_channel_001.vp
/opt/Xilinx/Vivado/2019.2/data/secureip/gtxe2_channel/gtxe2_channel_002.vp
/opt/Xilinx/Vivado/2019.2/data/secureip/pcie_2_1/pcie_2_1_001.vp
/opt/Xilinx/Vivado/2019.2/data/secureip/pcie_2_1/pcie_2_1_002.vp