前言
之前博主在使用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 周期
forceclk00,130-repeat100表示强制clk从0时间单元开始,起始电平为0,结束电平为1,0电平保持时间为30个默认时间单元,周期为100个默认时间单元,占空比为70%。
指令功能:每隔一段的周期重复一定的force命令,用来产生时钟信号,也可用来产生周期的输入信号,如01010101,00110011等。
force指令
forcedin16#40900000 从当前时刻起给din赋值16进制40900000;forcebus16#F @100ns 在100ns时刻给bus赋值16进制F;forceclr1100经历100个默认时间单元延迟后为clr赋值1;forceclr1,0100表示clr赋值1后,经历100个默认时间单元延迟后为clr赋值为0;
run指令
指令格式:run timesteps time_unit,timesteps时间步长,time_unit时间单元,可以是fs、ps、ns、us、ms、sec;
指令功能:运行(仿真)并指定时间及单元;
run100,表示运行100个默认时间单元;run2500ns,表示运行2500ns;run-all,表示运行全过程;run-continue,表示继续运行
force-cancel指令
指令格式:force-cancel period
指令功能:执行period周期时间后取消force命令;
forceclk00,130-repeat60-cancel1000,表示强制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)
一些常用指令
#打开现有工程projectopenC:/Users/jayash/Desktop/sim/ImageProcess#新建一个库vlibmy_lib#将其映射到workvmapmy_libwork#删除制定库vmap-delmy_lib#添加指定设计文件projectaddfilesrc/Verilog/test.v#编译工程内所有文件projectcompileall#编译指定verilog文件vlogsrc/Verilog/test.v#编译指定的vhdl文件,同时检查可综合性vcom–check_synthesissrc/video_cap.vhd##仿真work库下面的test_tb实例,同时调用220model_ver库,不再进行任何优化,仿真分辨率1ns。vsim–t1ns–L220model_ver–gui–novoptwork.test_tb#取消warning,例如‘x’,‘u’,‘z’信号的警告,对提高编译速度很有帮助setStdarithNoWarning1#查看objectViewobjects#查看局部变量Viewlocals#查看sourceViewsource#添加模块顶层所有信号到波形图addwave*#10进制无符号显示Radixusigned#16进制显示Radixhex#重新进行仿真Restart#开始仿真Run#仿真指定时间Run1ms#时钟激励50ns周期 占空比50%Force–repeat50clk00,125#指定信号置0Forcerst_n0#指定信号置1Forcerst_n1#指定信号赋值Forcedin_a123Forcedin_b39
流程说明
第一步:创建库
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(vmapwork ./lib/work)在modelsim界面的library选项卡创建的选项卡名称就是top_xxx,但是编译之后得到的文件还是存放到./lib/work的路径文件夹中vmapwork ./work
第三步:编译Verilog 源代码
将编译得到的信息文件放到④的work逻辑库里面,库名缺省编译到work本地库,文件按顺 序编译。
语法为vlog –work(固定格式) work(逻辑库名字) .v .v(要编译的文件:路径/文件)
主要是编译设计文件,测试文件,调用的IP核.v文件,相应的库文件,通配符./../xxx/*.v,要注意编译的顺序,注意,.v文件应该是放在设计或者仿真的文件里面,不要仿真逻辑库路‘’径里面,逻辑库路径在编译之后会自然得复制过来
#下面代码的意思是:编译xxx.v这两个文件,将编译得到的文件与源文件放到 work这个文件夹里面。
vlog-workwork ./x_tb.vvlog-workwork ./RTL/select_test.v#或写成vlog -work work ./RTL/*.v
第四步:编译完启动仿真
(设置顶层的testbench文件 tb)
语法:vsim –lib name>.level design>,
-t | 表示仿真时间单位为ns |
-novopt | 表示仿真时无优化 |
+notimingchecks | 表示无时序检查 |
vsim-voptargs=+accwork.tbwork.tb表示对work库中的tb进行仿真,实际相当于在界面操作时,展开work库,右键—>SimulatewithoutOptimization,启动仿真。
代码意思是:优化部分参数(-voptargs=+acc),链接前面建立的work逻辑库,启动测试逻辑库(work)里面的x_tb文件
第五步:设置仿真运行时长
语法: run <运行时间> run 1us
do文件模板
目前由于信号较少,所以我们就不用对信号进行过多设置,将所有波形进行添加,下面模板即可够用
最简洁版:
vlibworkvmapworkvlog"my_logic.v"vlog"tb_my_logic.v"vsim-t1ns-novoptwork.tb_my_logicrun-all
实用版:
#退出当前仿真quit-simvlibworkvmapwork#编译设计文件和仿真文件。vlog"../Src.v"vlog"../Sim.v"#开始仿真(条件根据需要改变)vsim-t1ns-voptargs=+acc-novoptwork.tb#添加指定信号#添加顶层所有的信号# 打开波形窗口viewwaveviewstructure# 打开信号窗口viewsignals# 添加波形模板addwave-divider {波形名字} addwavetb/*.mainclear#运行xxmsrun100us