Modelsim 利用 TCL 快速仿真(gowin 与 pango 仿真解析)

此处介绍一种可以不必新建工程,快速进行仿真的方法,也是目前 gowinpango 例程中使用的方法。其本质就是利用 .bat 批处理文件启动 Modelsim,然后再利用 tcl 文件(gowin 使用 .do 文件)将编译、仿真等操作自动化,从而节省操作

.bat 文件

基本上都是调用 Modelsim,然后使用 -do 参数执行 TCL 脚本,其参数可为单个 TCL 文件(gowin 仿真例程),或者是一行在 Transcript 中执行的指令

pangu 仿真例程

由于 PDS 中可以直接启动仿真,PDS 通过 .bat 文件的返回值判断 Modelsim 是否成功启动

PDS 玩的比较花,将编译与仿真分为两个 TCL 文件。为了执行两个 TCL 文件,故使用一行在 Transcript 中执行的指令,两个指令用分号分隔

1
2
3
4
5
6
7
8
9
10
11
12
REM run_behav.bat

@echo off
set bin_path=C:/path/to/ModelSim/win64
cd D:/path/to/demo/2_Demo/01_led_test/sim/behav
call "%bin_path%/modelsim" -do "do {run_behav_compile.tcl};do {run_behav_simulate.tcl}" -l run_behav_simulate.log
if "%errorlevel%"=="1" goto END
if "%errorlevel%"=="0" goto SUCCESS
:END
exit 1
:SUCCESS
exit 0
gowin 仿真例程
1
2
3
REM do.bat

D:\Program_Files\ModelSim_2020.4\win64\modelsim.exe -do cmd.do

TCL 文件

基本上都是新建库,编译器件到库,然后再进行仿真,最后启动各个界面,比如波形等等
TCL 文件其实就是将一般 Modelsim 仿真操作进行自动化。对照下面的 TCL 文件,不难发现,其中的各个参数与指令就是手动仿真的各个操作

pangu 仿真例程

每次在 PDS 中进行仿真时,都会自动生成对应的 TCL 脚本
虽然看着方便,但反而带来了一些额外的问题,比如编译和仿真的参数无法修改
PDS 这种仿真的优点是不会重复编译库文件,工程中不需要携带未编译的库文件,一次编译,到处运行(不过也可能由于库的编译选项与期待的不同导致仿真报错或者仿真结果错误)

run_behav_compile.tcl 文件主要就是使用 vlib 新建库,然后再使用 vmap 将已编译好的库添加至 Modelsim,最后再使用 vlog 编译当前工程内的 Verilog 文件至 work

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# run_behav_compile.tcl

# ----------------------------------------
# Created on: xxxxxx
# Auto generated by Pango
# ----------------------------------------

vlib work
vmap work ./work
vmap usim "E:/Program_Files/ModelSim_2020.4/pango_sim_libraies_v/usim"
vmap adc "E:/Program_Files/ModelSim_2020.4/pango_sim_libraies_v/adc"
vmap ddrc "E:/Program_Files/ModelSim_2020.4/pango_sim_libraies_v/ddrc"
vmap ddrphy "E:/Program_Files/ModelSim_2020.4/pango_sim_libraies_v/ddrphy"
vmap hsst_e2 "E:/Program_Files/ModelSim_2020.4/pango_sim_libraies_v/hsst_e2"
vmap iolhr_dft "E:/Program_Files/ModelSim_2020.4/pango_sim_libraies_v/iolhr_dft"
vmap ipal_e1 "E:/Program_Files/ModelSim_2020.4/pango_sim_libraies_v/ipal_e1"
vmap pciegen2 "E:/Program_Files/ModelSim_2020.4/pango_sim_libraies_v/pciegen2"
vlog "E:/FPGA/2_Demo/01_led_test/source/Desktop/01_led_test.v" -work work
vlog "E:/FPGA/2_Demo/01_led_test/source/Desktop/tb_led_test.v" -work work
vlog "E:/FPGA/2_Demo/01_led_test/source/source/Desktop/01_led_test.v" -work work

# ----------------------------------------

run_behav_simulate.tcl 文件的功能是启动仿真
vsim 进行仿真,-L 指定使用的库,最后的参数为进行仿真的模块。-novopt 会导致新版本的 Modelsim 报错,需要替换为 -voptargs="+acc" 选项
add 是添加信号至示波器
view 是打开指定的窗口
run 是进行指定时长的仿真

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# run_behav_simulate.tcl

# ----------------------------------------
# Created on: xxxxxx
# Auto generated by Pango
# ----------------------------------------

vsim -novopt -L work -L usim -L adc -L ddrc -L ddrphy -L hsst_e2 -L iolhr_dft -L ipal_e1 -L pciegen2 tb_led_test usim.GTP_GRS
add wave *
view wave
view structure
view signals

run 1000ns

# ----------------------------------------
gowin 仿真例程

gowin 仿真比较直接,每个工程都包含了对应器件的未编译库文件,也就是 xxxx\tb\prim_sim.v 文件(所以从示例工程中直接复制仿真相关文件可能导致器件不同而导致仿真出错,千万记得修改)

原始版本基本与 pango 仿真相同,也需要将 -novopt 选项更换为 -voptargs="+acc",只不过 gowin 是二合一,并且每次都重新编译库文件

下面是我修改版本,使用预先编译好的库,并且在 vlog 中使用 -f 参数指定需要编译的文件
顺带一提,gowin 库文件的源文件在 Gowin\IDE\simlib

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# cmd.do

## part 1: new lib
vlib work
vmap work work

## part 2: load design
# vlog -sv -incr -work work "../tb/prim_sim.v"
vlog -sv -L gowin_gw1n -L work +incdir+../tb -work work "../tb/tb.v"
vlog -sv -L gowin_gw1n -L work +incdir+../src/ -incr -work work -f "../vflist.txt"

## part 3: sim design
vsim -L gowin_gw1n -L work work.tb -voptargs="+acc"

## part 4: add signals
# add wave -group "group_name" {sim:/tb/xxx_test_tb/*}
add wave -position insertpoint sim:/tb/xxx_test_tb/xxxx

## part 5: show ui
view wave
view structure
view signals

## part 6: run
run 0.5ms

关于禁止仿真优化

仿真中的优化是在 Simulate->Start Simulation 中勾选 Optimization 中的 Enable optimization,然后点击 Optimization Options...,在其中的 Visiblity 选项卡,选中 Apply full visibility to all modules(full debug mode) 选项,就是禁用仿真中的优化。其实相当于在 vsim 仿真指令中加入 -voptargs="+acc" 选项

如果没有去掉优化,在 Library 界面中进行仿真的库中会出现一个 _opt 文件,代表是被优化后的