Modelsim使用TCL脚本编写do文件进行快速仿真(前仿真)

前言

之前博主在使用modelsim进行仿真的时候是用图形化的界面进行仿真,但是如果仿真任务量很大的话,这就不是一个很好的办法来操作,这样我们TCL的脚本语言进行仿真的优势就出来了,ModelSim的tcl最大的优势就在于它可以让整个仿真自动运行,(方便快捷),下面我就简单的整理下这部分的内容。

工作环境

Modelsim (版本不限)

流程介绍

  1. 自动完成建库
  2. 映射库到物理目录
  3. 编译源代码
  4. 启动仿真器
  5. 运行仿真

常用语法说明

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 item_name value time,value time;item_name为端口信号或内部信号,支持通配符号,但只能匹配一个;value不能默认,time,可选项,支持时间单元;

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 01 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 <library name>.<top 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

猜你喜欢

转载自blog.csdn.net/weixin_41445387/article/details/104709826