Questasim入门教程

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

你可能感兴趣的:(modelsim,fpga开发)