这里记录一下基于脚本的modelsim自动化仿真的一些知识和模板,以后忘记了可以到这里查找。转载请标明出处:http://www.cnblogs.com/IClearner/ 。

一、基本介绍

  这里介绍一下如何利用脚本调用modelsim进行自动化仿真,随笔前面先介绍一下前仿真,随笔结尾处介绍后仿真。前仿真的基本介绍如下所示,由于我的笔记是写在.do文件中,因此我这里也给代码的格式,如下所示:

# #表示注释,modelsim不支持中文,因此可能不能识别注释
#①退出当前仿真功能,退出当前的工程,跟在modelsim界面的命令行敲入命令的效果一样,之后就可以创建其他的工程
quit -sim
#②清除命令行显示信息;在命令行‘敲入这个命令,回车’的效果一样
.main clear
#③创建库:vlib:创建库到一个物理目录中,也就是创建文件夹目录了。
#可以理解库为某一个路径的文件夹,用来存储modelsim的一些数据文件;
#创建库的格式vlib <library name>,默认库的名字为work
#下面的代码意思是:1-在当前路径(.do文件的路径)下,创建lib文件夹;相当于在命令行敲‘vlib lib 回车’
#2-在当前路径的lib文件夹下,创建work文件夹库;相当于在命令行敲‘vlib ./lib/work’
vlib ./lib
vlib ./lib/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 ./lib/work #⑤编译Verilog 源代码,将编译得到的信息文件与编译的文件放到④的逻辑库里面,库名缺省编译到work本地库,文件按顺序编译。
#语法为vlog –work(固定格式) work(逻辑库名字) <file1>.v <file2>.v(要编译的文件:路径/文件)
#主要是编译设计文件,测试文件,调用的IP核.v文件,相应的库文件,通配符./../xxx/*.v,要注意编译的顺序
#注意,.v文件应该是放在设计或者仿真的文件里面,不要仿真逻辑库路径里面,逻辑库路径在编译之后会自然得复制过来
#下面代码的意思是:编译xxx.v这两个文件,将编译得到的文件与源文件放到 work这个文件夹里面。
vlog -work work ./tb_ex_shift_reg.v
vlog -work work ./../design/*.v #⑥编译完后启动仿真,语法格式为vsim –lib <library name>.<top level design>,
#下面的代码意思是:优化部分参数(-voptargs=+acc),链接到默认的work 库,启动仿真顶层测试逻辑库(work)里面的tb_ex_shift_reg文件
vsim -voptargs=+acc work.tb_ex_shift_reg
#⑦添加波形与分割线。
#添加波形:就是添加要显示波形,语法格式:add wave <mydesign>/<signal>
#。。。如果添加的波形不只是顶层模块的,还有顶层下面的例化模块的信号,
#就是#add wave 测试顶层的名字/例化子模块的例化名字/子模块信号的名字
#。。。add wave #-radix ?hexadecimal tb_top/mydesign/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 以二进制格式显示o_lvds_d波形信号
#添加分割线:不同的信号之间进行分割,语法格式是add wave -divider {分割线的名字}。
#分割线所处的位置是相对于波形信号的。下面代码的意思就是在lvds_clock信号上面添加了一条分割线。
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 tb_ex_shift_reg/o_lvds_d
add wave -divider {ex_shift_reg_inst_888}
#add wave 测试顶层的名字/例化模块的例化名字/信号的名字
add wave tb_ex_shift_reg/ex_shift_reg_inst/*
#⑧运行,格式是 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 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的自动化仿真脚本如下所示:

quit -sim
.main clear vlib work vlog ./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.v vsim -voptargs=+acc work.tb_ex_ipcore add 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工具自带的仿真工具的情况:
①(带IP核的)简单的设计
②仿真时间不需要太长的

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

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

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

基于脚本的modelsim自动化仿真笔记的更多相关文章

  1. Modelsim自动化仿真之do文件书写

    创建本地库 vlib ./work You must use vlib rather than operating system commands to creat a library directo ...

  2. Modelsim调用用do脚本自动化仿真

    前言 EDA发展的趋势是自动化,使用脚本自动化仿真可以减少不必要的时间浪费. 流程 在windows下新建批处理脚本bat文件(linux下可用shell脚本或者其他,注意给脚本运行权限即可:chmo ...

  3. Modelsim中使用TCL脚本编写do文件实现自动化仿真

    通常我们使用Modelsim进行仿真,是通过图形界面点点点来进行操作,殊不知Modelsim完美支持TCL脚本语言及批处理命令do文件.简单来说就是从你修改完代码后到你重新编译把需要的信号拉出来查看, ...

  4. Android自动化学习笔记:编写MonkeyRunner脚本的几种方式

    ---------------------------------------------------------------------------------------------------- ...

  5. ModelSim之tcl自动化仿真

    摘要: ModelSim的tcl最大的优势就在于它可以让整个仿真自动运行,免除每次进行各种用户界面控制操作的麻烦.用tcl就可以自动完成建库.映射库到物理目录.编译源代码.启动仿真器.运行仿真等一系列 ...

  6. modelsim 独立仿真vivado的IP核及仿真脚本

    Modelsim独立仿真vivado的IP 最近一直在做local dimming项目的FPGA硬件实现,算法的其中一步就是直方图统计,即数字图像的某一灰度级的像素数,这个直方图的源码找了半天才搞到, ...

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

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

  8. 基于modelsim-SE的专业进阶仿真流程

    基于modelsim-SE的专业进阶仿真流程 通过<基于modelsim-SE的简单仿真流程>和<调用altera IP核的仿真流程>是否感受到仿真流程中的繁琐步骤,特别是在m ...

  9. Android自动化学习笔记之MonkeyRunner:官方介绍和简单实例

    ---------------------------------------------------------------------------------------------------- ...

随机推荐

  1. Mybatis中javaType和jdbcType对应和CRUD例子

    JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR String NUMERIC java.math.BigDecimal DECIM ...

  2. DB2简介和安装部署

    一.DB2相关概念 1.DB2体系结构: DB2体系结构中的最高一层是系统,一个系统表示DB2的一个安装.在由很多机器组成 的网络环境中,我们有时=也称系统为数据库分区,一个系统可以包含多个DB2实例 ...

  3. 二叉树问题(区间DP好题)

    二叉树问题 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Petya Bulochkin很幸运:他得到了一份在"Macrohard"公司的工作.他想要展现他的才华, ...

  4. Python入门(2)

    一.    基础语法 1.Print print 是 python 里很基本很常见的一个操作,它的操作对象是一个字符串. 直接在 print 后面加一段文字来输出的话,需要给文字加上双引号或者单引号. ...

  5. UE4 difference between servertravel and openlevel(多人游戏的关卡切换)

    多人游戏的关卡切换分为无缝和非无缝.非无缝切换时,客户端将跟服务器断开连接,然后重新连接到同一个服务器,服务器则加载一个新地图.无缝切换不会发生这样的情况. 有三个函数供我们使用:UEngine::B ...

  6. 理解容器之间的连通性 - 每天5分钟玩转 Docker 容器技术(34)

    通过前面小节的实践,当前 docker host 的网络拓扑结构如下图所示,今天我们将讨论这几个容器之间的连通性. 两个 busybox 容器都挂在 my_net2 上,应该能够互通,我们验证一下: ...

  7. php获取二维数组中某一列的值集合

    $result //二维数组$uid_list = array_column($result, 'uid');

  8. JavaScript中的栈及通过栈操作的实例

    <script> /*栈操作*/ function Stack() { this.dataStore = []; this.top = 0; this.push = push; this. ...

  9. Ext 创建workspace package

    Ext 创建workspace package Package ExtJs Project 1. 创建工作区间文件目录 md wpt 2. 进入目录 cd wpt 3. 创建 创建工作区间 sench ...

  10. (转载)jConsole,jvisualvm和jmap使用

    原文链接:http://my.oschina.net/freegarden/blog/286372 摘要 Oracle JVM自带了一些工具,观察java程序的运行,用于排错调优.正文将会对 jCon ...