人生有很多的转折,每一个时段有每一个时段的颜色。
基于脚本的modelsim自动化仿真
1. 背景知识
FPGA的仿真与调试在FPGA开发过程中起着至关重要的作用,也占用了FPGA开发的大部分时间。所以适当减少或简化FPGA的仿真与调试过程无疑是对FPGA开发的加速,所对产品成型的时间。这里我们将利用三篇给大家讲解使用脚本命令来加速FPGA的仿真过程。
FPGA的仿真又分为前仿真和后仿真,前仿真即功能仿真,是在不考虑器件的布局布线和延时的理想情况下对源代码进行的仿真;后仿真即时序仿真,时序仿真主要在布局布线后进行,与特定的器件有关,在仿真时还要包含器件和布线延时信息。
FPGA的仿真工具也很多,其中用各公司软件自带的仿真工具,也有其他公司的仿真工具。其中Mentor公司的Modelsim是业界比较优秀的仿真软件,它提供了友好的仿真界面。
Modelsim完美支持tcl脚本语言及批处理命令do文件。使用脚本文件可以大大减少工作量,提高工作效率。
2. modelsim自动化仿真示例
下面简单讲讲仿真的步骤。首先我们要对一个设计进行仿真呢,我们一般需要进行以下几个步骤:
①创建一个工程和工程库;
②加载设计文件(包括你编写好的testbench);
③编译源文件;
④运行仿真,并查看结果;
⑤最后进行工程调试。
do文件,就是把上述的步骤①---④用tcl脚本语言来编写出来,让Modelsim来运行该do文件宏命令,并自动执行仿真的步骤。这种好处也许在小设计中没怎么表现,但是如果在一个大的工程中,常常需要对一个设计单元进行反复的修改和仿真,但是仿真时的设置是不变的,这时如果使用了do文件,把仿真中使用到的命令都保存下来了,就可以节省大量的人力,提高了工作效率。
工程示例:
1,创建sim.bat
vsim -do sim.do
2,创建sim.do
#Build a new library
vlib work
#Switch to the emulation source file directory
vlog +acc "tb_image.v"
vlog +acc "vga_parameter.vh"
vlog +acc "vga_ctl.v"
vlog +acc "rgb2gray.v"
vlog +acc "emboss.v"
#Start simulation
vsim -voptargs=+acc work.tb_image
#Add all the signals on the top layer
#add wave *
do rgb2gray.do
view structure
view signals
run -all
onerror {resume}
quietly WaveActivateNextPane {} 0
add wave -noupdate /tb_image/U_rgb2gray/pixelclk
add wave -noupdate /tb_image/U_rgb2gray/reset_n
add wave -noupdate /tb_image/U_rgb2gray/din
add wave -noupdate /tb_image/U_rgb2gray/i_hsync
add wave -noupdate /tb_image/U_rgb2gray/i_vsync
add wave -noupdate /tb_image/U_rgb2gray/i_de
add wave -noupdate /tb_image/U_rgb2gray/dout
add wave -noupdate /tb_image/U_rgb2gray/o_hsync
add wave -noupdate /tb_image/U_rgb2gray/o_vsync
add wave -noupdate /tb_image/U_rgb2gray/o_de
add wave -noupdate /tb_image/U_rgb2gray/r
add wave -noupdate /tb_image/U_rgb2gray/g
add wave -noupdate /tb_image/U_rgb2gray/b
add wave -noupdate /tb_image/U_rgb2gray/gray_r
add wave -noupdate /tb_image/U_rgb2gray/hsync_r
add wave -noupdate /tb_image/U_rgb2gray/vsync_r
add wave -noupdate /tb_image/U_rgb2gray/de_r
TreeUpdate [SetDefaultTree]
WaveRestoreCursors {{Cursor 1} {0 ps} 0}
quietly wave cursor active 0
configure wave -namecolwidth 150
configure wave -valuecolwidth 100
configure wave -justifyvalue left
configure wave -signalnamewidth 0
configure wave -snapdistance 10
configure wave -datasetprefix 0
configure wave -rowmargin 4
configure wave -childrowmargin 2
configure wave -gridoffset 0
configure wave -gridperiod 1
configure wave -griddelta 40
configure wave -timeline 0
configure wave -timelineunits ps
update
WaveRestoreZoom {0 ps} {1 ns}
3,迭代调试
quit -sim
ls
do sim.do
视频演示:
3 一些modelsim自动化仿真常用脚本的介绍
Modelsim 常用脚本总结
vlib 创建 library,如创建名为 work的library的指令为,vlib work
vmap 通过修改modelsim.ini文件,在逻辑库名(如 work)与指定目录之间定义 一个映射。
vmap –del<logical_name> 删除名为 logical_name的映射;
vmap <logical_name>[<path>] 把逻辑库映射到指定的物理库上,若不定义 <path>,此命令返回现有映射。
vencrypt 用于 verilog加密,加密在预处理中进行,所以宏和`指令不做加密处 理,加密后的文件格式被修改为.vp/.svp。加密命令后面需要加上编译命令,如vlog。
vencrypt –d <dirname> 定义加密文件保存的地址;
vencrypt –f <filename> 调用文件,文件中定义多条指令,可以避免重复输入复杂 的指令集,-f可以嵌套调用。
vopt 编译后进行全局优化。
vlog 编译.v文件;
vlog –work <library name> 定义编译映射到的 library;
vlog +define+<macro_name>=<macro_text> 命令行中定义宏的方式,例如 `define one r1可以写为 vlog +define+one=r1;如果定义多个宏,在后面继 续加+<macro_name>=<macro_text>即可;
vlog –L <libname> 搜索指定的资源库提供给预编译模块;也可用在 vsim中;
vlog –v <library_file> 指定一个库文件包含模块和用户数据包协议的定义。在 vlog编译后,编译器用-v来找到并编译引用过但未定义的模块。
vsim 调用 VSIM仿真器。
vsim –l <filename> 将脚本窗口内容保存在指定文件中;
vsim –keepstdout 让仿真器不重复直接访问 stdout stream;
vsim –t 定义仿真时间分辨率;
vsim –novopt 禁止自动运行 vopt;
vsim –voptargs=+acc 规定当自动运行 vopt时,vsim应当跳转至 vopt;其中 +acc最常用,意思是使能 PLI并调试与指定对象相关的指令。
setenv <varname>[<value>] 改变或报告环境变量的现有值,仅用于现有 modelsim模块;
virtual type 在图形界面中将信号值显示为字符串,最高支持64位整形数据。
virtual type –delete<name> 删除之前定义的 virtual type;
virtual type {<list_of_strings>} 添加字符串显示;
virtual function 在图形界面中建立新的信号。方便将需要的信号放在一个波形窗 口查看。
add wave 添加波形。
add wave -divider <divider_name> 在波形列表中添加分类名。
add wave –radix <type> 定义显示进制形式,有 binary, ascii, decimal, octal, hex, symbolic, time, and default。
#切换到工作目录
cd F:/Projects/BeiJing/sim
vsim -novopt work.histogram_2d_new_tb
#结束仿真
quit -sim
#仿真video_cap模块 不优化
vsim -novopt work.video_cap_tb
##退出当前仿真
quit -sim
##仿真image_src模块 不优化
vsim -novopt work.image_src
##设置仿真时间分辨率
##vsim -t 1ps -lib work image_src
add wave -position insertpoint \
sim:/image_src/iw \
sim:/image_src/ih \
sim:/image_src/dw \
sim:/image_src/h_total \
sim:/image_src/v_total \
sim:/image_src/sync_b \
sim:/image_src/sync_e \
sim:/image_src/vld_b \
sim:/image_src/reset_l \
sim:/image_src/clk \
sim:/image_src/src_sel \
sim:/image_src/test_vsync \
sim:/image_src/test_dvalid \
sim:/image_src/clk_out \
sim:/image_src/test_data \
sim:/image_src/test_data_reg \
sim:/image_src/test_vsync_temp \
sim:/image_src/test_dvalid_tmp \
sim:/image_src/test_dvalid_r \
sim:/image_src/h_cnt \
sim:/image_src/v_cnt \
sim:/image_src/fp_r \
##sim:/image_src/fp_w \
##sim:/image_src/r \
sim:/image_src/cnt
##restart
##≈48MHz clk
force -freeze sim:/image_src/clk 1 0, 0 {12 ns} -r 24
##reset
force reset_l 0
run 5005 ns
force reset_l 1
run 21 ms
restart
force rst_n 0
run 30 ns
force rst_n 1
force -repeat 20 clk 0 0,1 10
force -repeat 20000000 din_valid 0 0,1 3000
force din 23
run 20 ns
vsim -novopt work.vga_ctrl
#restart
radix unsigned
add wave -position insertpoint sim:/vga_ctrl/*
force -repeat 40 clk 0 0,1 20
force reset 0
#force key_in 11111
run 1ms
force reset 1
#force key_in 11110
force rgb_in 010
force din_valid 1
run 17 ms
radix unsigned
add wave -position insertpoint sim:/uart_tx_data/*
restart
force -repeat 40 clk 0 0,1 20
force reset_n 0
force tx_fifo_empty 0
force tx_fifo_dout 85
run 100ns
force reset_n 1
run 2 ms
clear
radix hex
force -repeat 50 clk 0 0,1 25
force reset 0
force ctrl 0
run 200 ns
force reset 1
force read_addr 32098
force num_read 39
##
force reg1 16#0A1F
##设置仿真时间分辨率
vsim -t 1ns -lib work AES256_tb
##添加顶层所有的信号
add wave *
radix hex ##16进制显示
radix unsigned ##10进制显示
##编译xilinx库 VHDL
vcom –work simprim d:Xilinx/VHDL/src/simprims/simprim_Vcomponents.vhd
vcom –work simprim d:Xilinx/VHDL/src/simprims/simprim_Vpackage.vhd
vcom –work simprim d:Xilinx/VHDL/src/simprims/simprim_VITAL.vhd
vcom –work unisim d:Xilinx/VHDL/src/unisims/unisim_VCOMP.vhd
vcom –work unisim d:Xilinx/VHDL/src/unisims/unisim_VPKG.vhd
vcom –work unisim d:Xilinx/VHDL/src/unisims/unisim_VITAL.vhd
vcom –work unisim d:Xilinx/VHDL/src/unisims/unisim_VCFG4K.vhd
vcom –work xilinxcorelib d:Xilinx/VHDL/src/ XilinxCoreLib/*.vhd
##编译xilinx库 Verilog
vlog –work simprim d:Xilinx/VHDL/src/simprims/simprim_Vcomponents.v
vlog –work simprim d:Xilinx/VHDL/src/simprims/simprim_Vpackage.v
vlog –work simprim d:Xilinx/VHDL/src/simprims/simprim_VITAL.v
vlog –work unisim d:Xilinx/VHDL/src/unisims/unisim_VCOMP.v
vlog –work unisim d:Xilinx/VHDL/src/unisims/unisim_VPKG.v
vlog –work unisim d:Xilinx/VHDL/src/unisims/unisim_VITAL.v
vlog –work unisim d:Xilinx/VHDL/src/unisims/unisim_VCFG4K.v
vlog –work xilinxcorelib d:Xilinx/VHDL/src/ XilinxCoreLib/*.v
#新建工程
project new D:/work/test
project open test
project addfile test.vhd
project compileall
vsim -L lpm -L altera