专栏首页FPGA开源工作室基于脚本的modelsim自动化仿真

基于脚本的modelsim自动化仿真

人生有很多的转折,每一个时段有每一个时段的颜色。

基于脚本的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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • FPGA仿真篇-使用脚本命令来加速仿真二

    FPGA的仿真与调试在FPGA开发过程中起着至关重要的作用,也占用了FPGA开发的大部分时间。所以适当减少或简化FPGA的仿真与调试过程无疑是对FPGA开发的加...

    FPGA开源工作室
  • 一种MXN维的手写字符识别算法

    本文的灵感来源于杨淑莹老师的一张PPT(手写数字识别),在此特别鸣谢杨淑英老师。

    FPGA开源工作室
  • fpga实现YCbCr444转RGB

    颜色空间(color space)是颜色集合的数学表示。三个最常用的颜色模型是:RGB(用于计算机图像学中);YIQ、YUV或YCbCr(用于视频系统中);CM...

    FPGA开源工作室
  • 05. OCR学习路径之文本检测(下)EAST算法简介

    本次分享主要是讲EAST这篇文章,按照之前的计划是分享两种文本检测思路,即one-stage和two-stage的。已经分享的有《03.OCR学习路径之文本检测...

    Aalto
  • 使用交叉点观察器延迟加载图像以提高性能

    在自己平时浏览一些大量图片类的网站时,你会发现无论是你pc端下拉滚动条,还是移动端手动滑屏时,最终呈现的图片有时候会有所延迟,这是一种预先加载图片资源的方式,也...

    itclanCoder
  • 逻辑回归

    iOSDevLog
  • 一份简明的 Base64 原理解析

    书接上回,在 记一个 Base64 有关的 Bug 一文里,我们说到了 Base64 的编解码器有不同实现,交叉使用它们可能引发的问题等等。

    mzlogin
  • 超实用,Linux中查看文本的小技巧

    查看文本的中间某些行范围之间的内容,例如说查看文本文件100-120行之间的内容:

    cxuan
  • CentOS + Jenkins

    (adsbygoogle = window.adsbygoogle || []).push({});

    拓荒者
  • 剑指offer - 数组中出现次数超过一半的数字 - JavaScript

    注意,这里要使用 ES6 的 Map,不要使用 json 对象。因为 json 对象的键存在着“隐式类型转换”,所有的键会被转换为字符串,从而导致不易排查的 b...

    心谭博客

扫码关注云+社区

领取腾讯云代金券