本文转载自:Modelsim使用TCL脚本编写do文件进行快速仿真(前仿真)-阿里云开发者社区 (aliyun.com)
原文作者:Vuko-wxh
声明:本文仅仅是为了方便个人使用,侵删。
前言
之前博主在使用modelsim进行仿真的时候是用图形化的界面进行仿真,但是如果仿真任务量很大的话,这就不是一个很好的办法来操作,这样我们TCL的脚本语言进行仿真的优势就出来了,ModelSim的tcl最大的优势就在于它可以让整个仿真自动运行,(方便快捷),下面我就简单的整理下这部分的内容。
工作环境
Modelsim (版本不限)
流程介绍
自动完成建库
映射库到物理目录
编译源代码
启动仿真器
运行仿真
常用语法说明
quit -sim
退出当前仿真功能,退出当前的工程,跟在modelsim界面的命令行敲入命令的效果一样,
之后就可以创建其他的工程
.main clear
清除命令行显示信息;在命令行‘敲入这个命令,回车’的效果一样
添加显示波形
总体语法:add wave <mydesign>/<signal>
如果添加的波形不只是顶层模块的,还有顶层下面的例化模块的信号
语法:add wave <测试顶层的名字>/<例化子模块的例化名字>/<子模块信号的名字> (可以使用通配符)
代码 | 解释 |
-radix | 约束进制显示,如:binary 、ascii、unsigned、octal、hex |
-format | 约束波形为那种类型 包括 logic ;literal; analog-step; analog-interpolated |
打开波形窗口,输入命令:view wave
添加不同类信号之间的分割线
语法:add wave -divider {分割线的名字}。
信号建组
语法:add wave -group <组名> -radix unsigned tb_x/*
意思将tb_x中所有信号分一个组以无符号显示
如:add wave -group xx -radix unsigned tb_x/*
force-repeat指令
指令格式:force 开始时间 开始电平值,结束电平值 忽略时间(即0电平保持时间) -repeat 周期
force clk 0 0,1 30 -repeat 100 表示强制clk从0时间单元开始,起始电平为0,结束电平为1,
0电平保持时间为30个默认时间单元,周期为100个默认时间单元,占空比为70%。
指令功能:每隔一段的周期重复一定的force命令,用来产生时钟信号,也可用来产生周期的输入信号,如01010101,00110011等。
force指令
force din 16#40900000 从当前时刻起给din赋值16进制40900000;
force bus 16#F @100ns 在100ns时刻给bus赋值16进制F;
force clr 1 100 经历100个默认时间单元延迟后为clr赋值1;
force clr 1,0 100 表示clr赋值1后,经历100个默认时间单元延迟后为clr赋值为0;
run指令
指令格式:run timesteps time_unit,timesteps时间步长,time_unit时间单元,可以是fs、ps、ns、us、ms、sec;
指令功能:运行(仿真)并指定时间及单元;
run 100, 表示运行100个默认时间单元;
run 2500ns, 表示运行2500ns;
run -all, 表示运行全过程;
run -continue, 表示继续运行
force-cancel指令
指令格式:force-cancel period
指令功能:执行period周期时间后取消force命令;
force clk 0 0,1 30 -repeat 60-cancel 1000,
表示强制clk从0时间单元开始,直到1000个时间单元结束;
view指令
指令格式:view 窗口名
指令功能:打开Modelsim的窗口
view souce,打开源代码窗口;
view wave,打开波形窗口;
view list,打开列表窗口;
view varibles,打开变量窗口;
view signals,打开信号窗口;
view all,打开所有窗口;
为时钟信号添加驱动
输入命令:force clk 0 0,1 10 -r 20,
将仿真时钟设为50MHz;(设时间单位为ns)
一些常用指令
#打开现有工程
project open C:/Users/jayash/Desktop/sim/ImageProcess
#新建一个库
vlib my_lib
#将其映射到work
vmap my_lib work
#删除制定库
vmap -del my_lib
#添加指定设计文件
project addfile src/Verilog/test.v
#编译工程内所有文件
project compileall
#编译指定verilog文件
vlog src/Verilog/test.v
#编译指定的vhdl文件,同时检查可综合性
vcom –check_synthesis src/video_cap.vhd
##仿真work库下面的test_tb实例,同时调用220model_ver库,不再进行任何优化,仿真分辨率1ns。
vsim –t 1ns –L 220model_ver –gui –novopt work.test_tb
#取消warning,例如‘x’,‘u’,‘z’信号的警告,对提高编译速度很有帮助
set StdarithNoWarning 1
#查看object
View objects
#查看局部变量
View locals
#查看source
View source
#添加模块顶层所有信号到波形图
add wave*
#10进制无符号显示
Radix usigned
#16进制显示
Radix hex
#重新进行仿真
Restart
#开始仿真
Run
#仿真指定时间
Run 1ms
#时钟激励50ns周期 占空比50%
Force –repeat 50 clk 0 0,1 25
#指定信号置0
Force rst_n 0
#指定信号置1
Force rst_n 1
#指定信号赋值
Force din_a 123
Force din_b 39
流程说明
第一步:创建库
vlib:创建库到一个物理目录中,也就是创建文件夹目录了。默认在.do文件所
在的文件夹下可以理解库为某一个路径的文件夹,用来存储modelsim的一些数据文件;
创建库的格式vlib ,默认库的名字为work
代码意思是:
1-在当前路径(.do文件的路径)下,创建lib文件夹;相当于在命令行敲‘vlib lib 回车’
2-在当前路径的lib文件夹下,创建work文件夹库;相当于在命令行敲‘vlib ./lib/work’
第二步:映射逻辑库到物理目录
也就是说,在modelsimGUI界面的Library选项卡里面创建子选项,
这个子选项就叫做逻辑库,编译工程之后,得到一堆编译文件,这些文件名就放在这个逻
辑库选项卡里面。但是编译得到的是实体文件,这些文件必须有一个目录存储,因此就需
要把逻辑库映射到物理(文件夹)目录,也就是把那些得到的实体文件放在某一个文件夹
目录(路径当中)这样,就可以在实际文件夹里面查看编译得到的文件内容,而不是单单
从选项卡里面看到名字而已,注意,在映射之前,一定要先创建好对应的物理路径
语法为 vmap work(逻辑库名称) (库的路径)
代码意思是:在modelsim界面的library选项卡创建一个叫work的选项卡(逻辑库),编译之
后得到的文件名称就在,相应的文件就放在./lib/work这个文件夹里面。当然逻辑库的名字不
一定是work(modelsim默认是work就一般取做work),也可以是top_xxx,如果是top_xxx
(vmap work ./lib/work)在modelsim界面的library选项卡创建的选项卡名称就是top_xxx,
但是编译之后得到的文件还是存放到./lib/work的路径文件夹中 vmap work ./work
第三步:编译Verilog 源代码
将编译得到的信息文件放到④的work逻辑库里面,库名缺省编译到work本地库,文件按顺
序编译。
语法为vlog –work(固定格式) work(逻辑库名字) .v .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文件 tb)
语法:vsim –lib name>.level design>,
-t | 表示仿真时间单位为ns |
-novopt | 表示仿真时无优化 |
+notimingchecks | 表示无时序检查 |
vsim -voptargs=+acc work.tb
work.tb表示对work库中的tb进行仿真,实际相当于在界面操作时,展开work库,
右键—>Simulate without Optimization,启动仿真。
代码意思是:优化部分参数(-voptargs=+acc),链接前面建立的work逻辑库,
启动测试逻辑库(work)里面的x_tb文件
第五步:设置仿真运行时长
语法: run <运行时间>
run 1us
do文件模板
目前由于信号较少,所以我们就不用对信号进行过多设置,将所有波形进行添加,下面模板即可够用
最简洁版:
vlib work
vmap work
vlog "my_logic.v"
vlog "tb_my_logic.v"
vsim -t 1ns -novopt work.tb_my_logic
run -all
实用版:
#退出当前仿真
quit -sim
vlib work
vmap work
#编译设计文件和仿真文件。
vlog "../Src.v"
vlog "../Sim.v"
#开始仿真(条件根据需要改变)
vsim -t 1ns -voptargs=+acc -novopt work.tb
#添加指定信号
#添加顶层所有的信号
# 打开波形窗口
view wave
view structure
# 打开信号窗口
view signals
# 添加波形模板
add wave -divider {波形名字}
add wave tb/*
.main clear
#运行xxms
run 100us