基于脚本的modelsim自动化仿真是提高工作效率的大杀器,此文基于此做了些记录汇总,基于脚本的modelsim自动化仿真的一些知识和模板,同时可以参照给的例程进行练习学习下载双击 .bat 文件就会自动调取您已经安装好的modelsim并完成一些列操作。您就坐等看波形吧

**

例程下载链接:https://download.csdn.net/download/u010530232/11885416
或者天翼云盘:https://cloud.189.cn/t/BfQNJn2qEBFj(访问码:6qrp)
(天翼云盘不限速,所以方便大家下载)
**
  
  这里介绍一下如何利用脚本调用modelsim进行自动化仿真,随笔前面先介绍一下前仿真,随笔结尾处介绍后仿真。前仿真的基本介绍如下所示,注释写在.do文件中,因此我这里也给代码的格式,如下所示:

#表示注释,modelsim不支持中文,因此可能不能识别注释以下是步骤,

基础介绍

#①退出当前仿真功能,退出当前的工程,跟在modelsim界面的命令行敲入命令的效果一样,之后就可以创建其他的工程
quit -sim
#②清除命令行显示信息;在命令行‘敲入这个命令,回车’的效果一样
.main    clear
#③创建库:vlib:创建库到一个物理目录中,也就是创建文件夹目录了。默认在.do文件所在的文件夹下
#可以理解库为某一个路径的文件夹,用来存储modelsim的一些数据文件;
#创建库的格式vlib <library name>,默认库的名字为work
#下面的代码意思是:1-在当前路径(.do文件的路径)下,创建lib文件夹;相当于在命令行敲‘vlib lib  回车’
#2-在当前路径的lib文件夹下,创建work文件夹库;相当于在命令行敲‘vlib    ./lib/work’
vlib    ./work#④映射逻辑库到物理目录;也就是说,在modelsimGUI界面的Library选项卡里面创建子选项,这个子选项就叫做逻辑库,
#编译工程之后,得到一堆编译文件,这些文件名就放在这个逻辑库选项卡里面。但是编译得到的是实体文件,这些文件必须
#有一个目录存储,因此就需要把逻辑库映射到物理(文件夹)目录,也就是把那些得到的实体文件放在某一个文件夹目录(路径当中)
#这样,就可以在实际文件夹里面查看编译得到的文件内容,而不是单单从选项卡里面看到名字而已
#注意,在映射之前,一定要先创建好对应的物理路径
#语法为 vmap work(逻辑库名称)  <library name>(库的路径)
#下面的代码意思是:在modelsim界面的library选项卡创建一个叫work的选项卡(逻辑库),编译之后得到的文件名称就在,
#相应的文件就放在./lib/work这个文件夹里面。
#当然逻辑库的名字不一定是work(modelsim默认是work就一般取做work),也可以是top_xxxx,如果是top_xxx(vmap     work ./lib/work)
#在modelsim界面的library选项卡创建的选项卡名称就是top_xxxx,但是编译之后得到的文件还是存放到./lib/work的路径文件夹中
vmap     work ./work#⑤编译Verilog 源代码,将编译得到的信息文件放到④的work逻辑库里面,库名缺省编译到work本地库,文件按顺序编译。
#语法为vlog –work(固定格式)  work(逻辑库名字)  <file1>.v <file2>.v(要编译的文件:路径/文件)
#主要是编译设计文件,测试文件,调用的IP核.v文件,相应的库文件,通配符./../xxx/*.v,要注意编译的顺序
#注意,.v文件应该是放在设计或者仿真的文件里面,不要仿真逻辑库路径里面,逻辑库路径在编译之后会自然得复制过来
#下面代码的意思是:编译xxx.v这两个文件,将编译得到的文件与源文件放到 work这个文件夹里面。
vlog    -work    work    ./x_tb.v
vlog    -work    work    ./RTL/select_test.v
#或写成vlog    -work    work    ./RTL/*.v#⑥编译完启动仿真(即顶层的testbench文件  x_tb),语法:vsim –lib <library name>.<top level design>,
#下面的代码意思是:优化部分参数(-voptargs=+acc),链接前面建立的work逻辑库,启动测试逻辑库(work)里面的x_tb文件
vsim    -voptargs=+acc    work.x_tb#⑦添加波形与分割线。
#添加显示波形:总体语法:add wave <mydesign>/<signal>
#如果添加的波形不只是顶层模块的,还有顶层下面的例化模块的信号,
#语法:add wave <测试顶层的名字>/<例化子模块的例化名字>/<子模块信号的名字>  (可以使用通配符)
#add wave -radix hexadecimal x_tb/test_i_data  "-radix" 参数是约束bus是以那种进制显示。
#例如:binary 、ascii、unsigned、octal、hex
#add wave –format logic tb_top/mydesign/clk   “-format” 参数是约束波形为那种类型,
#包括 logic ;literal; analog-step; analog-interpolated;
#add    wave    -radix bin    tb_ex_shift_reg/o_lvds_d  以二进制格式显示test_o_select_data波形信号
#添加不同类信号之间的分割线,语法:add    wave    -divider  {分割线的名字}。
#信号建组, 语法:add wave -group <组名> -radix unsigned tb_x/*  意思将x_tb中所有信号分一个组以无符号显示
add wave -group xx -radix unsigned tb_x/*
add wave ./x_tb/*
add wave ./x_tb/u_select_test/*
#以下几种在给的练习工程中没有用到
add  wave    -divider    {tb_ex_shift_reg_111}
add  wave    tb_ex_shift_reg/lvds_clock
add  wave    tb_ex_shift_reg/rst_n
add  wave    tb_ex_shift_reg/lvds_d
add  wave    tb_ex_shift_reg/i_30
add  wave    -radix bin    x_tb/test_o_select_data
add  wave    -divider    {ex_shift_reg_inst_888}#⑧设置仿真运行时长,语法: run <运行时间>
run    1us

前仿真进阶

上面的仿真基础能够仿真基本的模块了,下面再来引入一些“酷炫”的知识:前仿真脚本与过程(优化、状态机名称、颜色等)内容,如下所示:

#①退出当前仿真功能,退出当前的工程,跟在modelsim界面的命令行敲入命令的效果一样,之后就可以创建其他的工程
quit -sim
#②清除命令行显示信息
.main clear
#③创建库
vlib    ./lib/
vlib    ./lib/work_a/
vlib    ./lib/design/
vlib    ./lib/altera_lib/
#④映射逻辑库到物理目录
vmap    base_space ./lib/work_a/
vmap    design    ./lib/design/
vmap    altera_lib ./lib/altera_lib/
#⑤编译Verilog 源代码
vlog    -work base_space    ./tb_mealy.v
vlog    -work design        ./../design/*.vo
vlog    -work altera_lib    ./altera_lib/*.v
#⑥编译完后启动仿真
#-t 运行仿真的时间精度是ns
#-L 是链接库关键字
#......-t 时间单位,表示仿真的时间精度
#代码中-t ns:表示以ns为单位的精度进行仿真
#......首先是 -voptargs=+acc 后面的-L解释:
#由于创建了多个逻辑映射库,而启动仿真的时候的是需要链接库,因此 -L 逻辑映射库1 -L 逻辑映射库2... 就把映射库链接起来。
#映射完库之后,需要启动顶层的测试设计文件,而顶层测试设计文件是在某一个库中,因此是 顶层文件所在的逻辑.顶层文件了。
#后面的意思就是:链接 altera_lib  base_space  design这三个逻辑库,启动仿真顶层测量逻辑库base_space名字叫tb_mealy的文件
vsim    -t ns  -voptargs=+acc    -L altera_lib -L base_space -L design base_space.tb_mealy#信号显示成字符的方法
#创建虚拟的结构体,用来产生虚拟信号。为什么要产生虚拟信号呢?因为在波形上面看111之类的,不知道状态的变化
#因此要在状态机中,可以添加虚拟先后,把4'b0001,显示成S1这里的,方便观看
#语法:virtual    type { {被替换16进制  用来显示的符号} {} {} ...} 结构体名字
#创建完虚拟类型的结构体类型后,要进行转换显示的信号还需要两步:
#首先进行强制转换:例如  virtual    function {(vir_new_signal)tb_mealy/mealy_inst/Curr_st} new_state
#就是 将要显示的 Curr_st信号 用一个类型为虚拟信号类型的  new_state 强制转换代替
#然后在添加波形显示就可以了如: #add wave  -color red    tb_mealy/mealy_inst/new_state
#-color red 是以什么颜色显示
virtual    type {{01 S1}
{02 S2}
{04 S3}
{08 S4}
{10 S5}
{20 S6}
} vir_new_signal
#⑦添加波形与分割线
add wave    -divider {tb_mealy_1}
add wave    tb_mealy/*
add wave    -divider {mealy}
#add wave 测试顶层的名字/例化模块的例化名字/信号的名字
add    wave    tb_ex_shift_reg/ex_shift_reg_inst/*#顶层/例化的名字/* 其中*号是通配符,匹配所有信号
add wave    tb_mealy/mealy_inst/*
#创建一个vir_new_signal 类型的信号,也就是把Currt_st进行类型转换
virtual    function {(vir_new_signal)tb_mealy/mealy_inst/Curr_st} new_state
add wave  -color red    tb_mealy/mealy_inst/new_state
#⑧运行,格式是 run 运行时间
run 1us

仿真模板

当我们设计当中有IP核的时候,我们就添加相应的库,一个简单的调用了IP的自动化仿真脚本如下所示:

```bash
quit -sim
.main clearvlib     workvlog    ./tb_ex_ipcore.v
vlog    ./altera_lib/*.v
vlog    ./../design/*.v
vlog    ./../quartus_prj/ipcore_dir/pll1.v
vlog    ./../quartus_prj/ipcore_dir/rom_8x256.vvsim    -voptargs=+acc    work.tb_ex_ipcoreadd wave tb_ex_ipcore/ex_ipcore_inst/*run 1000ns

上面介绍的知识中,既介绍了普通模块的仿真脚本,也介绍了有IP核设计的脚本仿真,下面给出一个通用的脚本文件,当然这个文件只适合用于前仿真(即功能仿真),至于后仿真后面介绍。模板如下所示:

#Exit current simulation
quit -sim
#Clear command line information
.main    clear
#Creating Libraries(Folder path),example : vlib ./
#基本不用改,除非你要改变库名称和路径
#vlib    ./lib/
#vlib    ./lib/work_a/
#vlib    ./lib/design/
#vlib    ./lib/altera_lib/
vlib     work#map logic lib to folder path ,example:
#基本不用改,除非你要改变逻辑库名称
#vmap    base_space ./lib/work_a/        modelsim will creat a tab named base_space
#vmap    design    ./lib/design/
#vmap    altera_lib ./lib/altera_lib/    simulat the IP core will use
vmap    work    work#Compile verilog Code ,exmaple : vlog -work [logic library's name] [the will Compiled file's path and name ]
#vlog    -work base_space    ./tb_mealy.v-----the tb file -->altera_lib file --> design file name-->ip core name(not_inst)
#这里要添加你的RTL文件、TB文件、IP核的.文件、IP核需要用到的库文件
vlog    -work    work    ./tb_module.v#Start-up simulation example :
#vsim    -t ns  -voptargs=+acc    -L [logic library1] -L [logic library2] ... [logic library of the tb file].[tb'sname]
#当你的TB文件的名字不是tb_module时,需要修改;
#当你需要添加其他优化选项时需要改
vsim    -t ns  -voptargs=+acc    work.tb_module#add wave and divider
#当你需要添加分割线时需要修改
#add    wave    -divider        {divider's name}
#add     wave      (-color red)    tb_xxx/*  |||||| #add     wave      (-color red)    tb's name/xxx_inst/signal
add        wave    tb_module/*#run time
run 1ms

后仿真

前面介绍的都是前仿真,这里就记录一下后仿真,脚本内容如下所示,其中有些内容是跟前仿真类似的:

#①退出当前仿真功能,退出当前的工程,跟在modelsim界面的命令行敲入命令的效果一样,之后就可以创建其他的工程
quit -sim
#②清除命令行显示信息
.main clear
#③创建库
vlib    ./lib/
vlib    ./lib/work_a/
vlib    ./lib/design/
vlib    ./lib/altera_lib/
#④映射逻辑库到物理目录
vmap    base_space ./lib/work_a/
vmap    design    ./lib/design/
vmap    altera_lib ./lib/altera_lib/
#⑤编译Verilog 源代码
vlog    -work base_space    ./tb_mealy.v
vlog    -work design        ./../design/*.vo
vlog    -work altera_lib    ./altera_lib/*.v
#⑥编译完后启动仿真
# -t 运行仿真的时间精度是ns
# -L 是链接库关键字
#......-t 时间单位,表示仿真的时间精度
#代码中-t ns:表示以ns为单位的精度进行仿真
#......-sdfmax加后面的信号文件,表示添加后仿真中的延时信息
#语法格式是 -sdfmax 仿真模块顶层/仿真模块的例化名字=仿真模块的.sdo文件
#......首先是 -voptargs=+acc 后面的-L解释:
#由于创建了多个逻辑映射库,而启动仿真的时候的是需要链接库,因此 -L 逻辑映射库1 -L 逻辑映射库2... 就把映射库链接起来。
#映射完库之后,需要启动顶层的测试设计文件,而顶层测试设计文件是在某一个库中,因此是 顶层文件所在的逻辑.顶层文件了。
#后面的意思就是:链接 altera_lib  base_space  design这三个逻辑库,启动仿真顶层测量逻辑库base_space名字叫tb_mealy的文件
vsim    -t ns -sdfmax tb_mealy/mealy_inst=ex_mealy_v.sdo -voptargs=+acc    -L altera_lib -L base_space -L design base_space.tb_mealy#信号显示成字符的方法,但是后仿真中不用虚拟信号
#......创建虚拟的结构体,用来产生虚拟信号。为什么要产生虚拟信号呢?因为在波形上面看111之类的,不知道状态的变化
#因此要在状态机中,可以添加虚拟先后,把4'b0001,显示成S1这里的,方便观看
#语法为:virtual    type { {被替换16进制  用来显示的符号} {} {} ...} 结构体名字
#......创建完虚拟类型的结构体类型后,要进行转换显示的信号还需要两步:
#首先进行强制转换:例如  virtual    function {(vir_new_signal)tb_mealy/mealy_inst/Curr_st} new_state
#就是 将要显示的 Curr_st信号 用一个类型为虚拟信号类型的  new_state 强制转换代替
#然后在添加波形显示就可以了如: #add wave  -color red    tb_mealy/mealy_inst/new_state
# -color red 是以什么颜色显示
virtual    type {{01 S1}
{02 S2}
{04 S3}
{08 S4}
{10 S5}
{20 S6}
} vir_new_signal
#⑦添加波形与分割线
add wave    -divider {tb_mealy_1}
add wave    tb_mealy/*
add wave    -divider {mealy}
#顶层/例化的名字/* 其中*号是通配符,匹配所有信号
add wave    tb_mealy/mealy_inst/*
#创建一个vir_new_signal 类型的信号,也就是把Currt_st进行类型转换
#virtual    function {(vir_new_signal)tb_mealy/mealy_inst/Curr_st} new_state
#add wave  -color red    tb_mealy/mealy_inst/new_state
#⑧运行,格式是 run 运行时间
run 1us

仿真工具选择心得

最后在仿真代码的时候,可以使用了独立的modelsim、altera自带的modelsim、ISE自带的Isim。在这里总结一下,也算是一种心得体会吧:

(1)建议使用FPGA工具自带的仿真工具的情况:
1.(带IP核的)简单的设计
2.仿真时间不需要太长的
3.Vivado自带的仿真也是非常方便的

使用自带的工具,只需把可综合代码(包括IP核.qip文件)读进QuartusII工程、设置仿真的tb文件。然后在工具那里执行仿真就可以了。

(2)建议使用独立modelsim仿真的情况:
①复杂的设计,代码总行数达到上万的代码(包含IP核)----使用脚本设计。
②需要仿真很久的、很精细的设计(比如计数器)
③混合语言仿真的时候

(3)前仿真(功能仿真),一般只需要设计文件跟测试文件,因此直接使用独立版本的modelsim就可以了。如果是后仿真或者带有各种IP核的仿真,则可以这样做:用QII/ISE/Vivado调用独立的modelsim进行仿真。

本文为参考编辑,添加补充了些内容,并给出了基本仿真例程代码。如有疑问欢迎留言交流
重点参考文章:https://www.cnblogs.com/IClearner/p/7273441.html

Modelsim自动化仿真及do文件编写相关推荐

  1. modelsim之inout类型tb文件编写及仿真

    很久没更新了,这边文章是笔者在隔离期间写的,之前接触过inout类型的仿真,但很久未使用有些生疏了,查阅了相关资料编写了这篇文章,一来是当作笔记,忘记时随时查阅,二来是为了供广大FPGA爱好者学习参考 ...

  2. Verilog语法_5(状态机、modelsim自动化仿真高级部分和后仿真)

    September 23, 2016 作者:dengshuai_super 出处:http://blog.csdn.net/dengshuai_super/article/details/526393 ...

  3. modelsim 自动化 独立仿真vivado ip核工程

    1.简述 自动化的独立仿真提高FPGA的仿真效率,加快FPGA开发.初学时使用Altera的FPGA,独立仿真带ip核的工程时,还能自己添加IP核的仿真文件实现.但是后来转到xilinx,好像没有办法 ...

  4. Modelsim独立仿真DDR4

    前言 DDR4 MIG可以使用vivado自带的仿真器作仿真:也可以使用vivado软件打开modelsim的方式,使用modelsim仿真.如果,独立使用modelsim对DDR4 MIG进行仿真, ...

  5. 脚本化Questasim/Modelsim自动仿真——脱离联合仿真

    目录 引言 脚本仿真步骤分析 完整的脚本代码 保姆级使用教程 扩展 引言 之前对于工程一直采用的是vivado+questasim联合仿真的模式,对于大型工程来说这个是合适的,因为需要调用一些ip库和 ...

  6. FPGA学习笔记(五)Testbench(测试平台)文件编写进行Modelsim仿真

    系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...

  7. modelsim仿真中 do文件的写法技巧

    Modelsim之 DO文件简介 网上的关于DO文件的编写好像资料不多,比较杂,所以本人总结一下常用的简单语法,方便大家查看.其实本人也刚接触DO文件没多久,有纰漏很正常,欢迎指正批评,互相学习.PS ...

  8. 搭建Modelsim SE仿真环境-使用do文件仿真

    本章我们介绍仿真环境搭建是基于Modelsim SE的.Modelsim有很多版本,比如说Modelsim-Altera,但是笔者还是建议大家使用Modelsim-SE,Modelsim-Altera ...

  9. 【懒人专用】Python实现Modelsim独立仿真Vivado工程的自动化脚本

    引言 有两种方法可以使用 Modelsim 对 Vivado 工程进行仿真,即级联仿真和独立仿真.        级联仿真就是通过设置使 Vivado 调出 Modelsim 仿真界面并启动仿真,这种 ...

最新文章

  1. shell中竖线的作用_如何在 Linux 中安装、配置和使用 Fish Shell?
  2. swift4 attributedText简单使用以及改变链接字体颜色
  3. 运行代码后总是会出现很多的的debug [main请问如何解决_Flutter的Hot Reload是如何做到的...
  4. iOS 项目中包含多个 FFMPEG 方法冲突的通用解决办法。
  5. maven配置junit5_JUnit 5和Selenium –改善项目配置
  6. mysql还是mdb2_mysql两种表存储结构myisam和innodb的性能比较测试
  7. gmake与make的区别
  8. NuGet version
  9. 如何高效的学习前端的网页设计?
  10. 字节跳动在 Spark SQL 上的核心优化实践
  11. 市场营销分析--页面广告统计
  12. Kubernetes部分Volume类型介绍及yaml示例
  13. GD32F103RC官方移植IAR
  14. 无缘无故的推荐弹窗,wps的锅,解决办法
  15. 如何优化内存?Unity中的内存种类;冯乐乐的总结的优化技术
  16. 华为2019校招笔试-逻辑计算
  17. 一款基于Zigbee技术的智慧鱼塘系统研究与设计
  18. OpenCV动作识别
  19. 关于ThinkPHP
  20. 深度linux禁用独立显卡,deepin显卡设置

热门文章

  1. java通过HtmlUnit工具和J4L实现模拟带验证码登录
  2. java安装配置jdk环境
  3. android 两张电信_两张图片合成一张app-2张图片合成一张app下载1.2.9 官方安卓版-西西软件下载...
  4. ICRA 2022杰出论文:把自动驾驶2D图像转成鸟瞰图,模型识别准确率立增15%
  5. 鼠标侧键BetterTouchTool过期、设置问题解决
  6. lazarus 初探
  7. RobotStudio 机器人工具坐标的创建
  8. 十,iOS 健康数据获取权限和写入权限
  9. 造作吧!让AirSelfie迷你无人机带你随时随地体验航拍
  10. Adobe Photoshop cc2019版本安装时提示“安装时出错,请退出安装程序并重新开始(错误代码143)”的解决方法