人生有很多的转折,每一个时段有每一个时段的颜色。
基于脚本的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
本文分享自微信公众号 - FPGA开源工作室(leezym0317),作者:OpenSLee
原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。
原始发表时间:2019-12-05
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句