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

简介: 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 周期

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
目录
相关文章
|
6月前
|
算法 异构计算
基于FPGA的Lorenz混沌系统verilog开发,含testbench和matlab辅助测试程序
基于FPGA的Lorenz混沌系统verilog开发,含testbench和matlab辅助测试程序
|
7月前
|
算法 异构计算
m基于FPGA的OFDM系统中降PAPR技术的实现,包含testbench测试文件和MATLAB辅助测试
m基于FPGA的OFDM系统中降PAPR技术的实现,包含testbench测试文件和MATLAB辅助测试
50 0
|
3天前
|
算法
LabVIEW开发仿真转矩加载系统
LabVIEW开发仿真转矩加载系统
|
4天前
|
测试技术 Windows
LabVIEW如何调用.m脚本LabVIEW调用MATLAB
LabVIEW如何调用.m脚本LabVIEW调用MATLAB
13 2
|
4天前
|
测试技术
LabVIEW程序测试
LabVIEW程序测试
|
10月前
|
监控 算法 Linux
【乌拉喵.教程】编写TestBench,quartus与modelsim时序仿真
【乌拉喵.教程】编写TestBench,quartus与modelsim时序仿真
134 0
【乌拉喵.教程】编写TestBench,quartus与modelsim时序仿真
|
10月前
【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真
【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真
113 0
【乌拉喵.教程】进一步学习编写TestBench(VHDL语言),quartus与modelsim时序仿真
|
机器学习/深度学习 算法 异构计算
基于FPGA的低通滤波器,通过verilog实现并提供testbench测试文件
基于FPGA的低通滤波器,通过verilog实现并提供testbench测试文件
103 0
|
C语言
PC模拟仿真LVGL(CodeBlocks环境)
PC模拟仿真LVGL(CodeBlocks环境)
|
算法 C语言 异构计算
Verilog HDL仿真常用命令
⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。
163 0
Verilog HDL仿真常用命令