Menu Close

Modelsim之TCL脚本自动化前仿真

作者: 谢建宁

工作效率——Modelsim之TCL脚本自动化前仿真

一.DO文件的简介和工作方式

DO文件是一次执行多条命令的脚本。这个脚本可以像带有相关参数的一系列ModelSim命令一样简单,或者是带有变量,执行条件等等的Tcl程序。可在GUI里或系统命令提示符后执行Do文件。

由于TCL脚本语言内容很多,本人是刚学不久,菜鸟一个。但是针对我们这门课程的话,有些基本常用的语法还是值得提一下的,方便大家一起学习交流,如果以下内容有什么写错了,希望大家提出并批评,互相进步。

首先,我们如何建立DO文件呢?

方法挺多,一种是可以打开Modelsim,执行File/New/Source/Do命令,进入Do文件编辑方式,在编辑窗口输入仿真批处理文件的代码,以.do为扩展名保存文件。当然也可以在windows系统中新建一个记事本,在“另存为”的时候写上.do的后缀名,也是一种方法。调用方式是在Modelsim的Transcript窗口中使用指令:do filename.do,完成对设计的自动化仿真。

 

下面简单讲讲仿真的步骤。首先我们要对一个设计进行仿真呢,我们一般需要进行以下几个步骤:

①创建一个工程和工程库;

②加载设计文件(包括你编写好的testbench);

③编译源文件;

④运行仿真,并查看结果;

⑤最后进行工程调试。

而do文件,就是把上述的步骤①—④用tcl脚本语言来编写出来,让Modelsim来运行该do文件宏命令,并自动执行仿真的步骤。这种好处也许在小设计中没怎么表现,但是如果在一个大的工程中,常常需要对一个设计单元进行反复的调试和仿真,但是仿真时的设置是不变的,这时如果使用了do文件,把仿真中使用到的命令都保存下来了,就可以节省大量的人力,提高了工作效率。

 

下面将对照一个简单的例子counter.do,讲一下我们常用的一些基本指令。

PS:  do文件的注释是由#开始的,但不可以在代码行后面添加,只能另起一行。

正确的是:

vlib work

#新建一个work库

错误的是:

vlib work  #新建一个work库

 

编写名为counter.do的文件,其内容为下:
vlib work (对应仿真步骤①:新建work库。该命令的作用是在当前目录下建立一个work目录,请注意不要直接在windows中新建一个work的文件夹,因为用操作系统建立的work文件夹并没有ModelSimSE自动生成的_info文件。)
vmap work  work(对应仿真步骤①:该命令的作用是将目前的逻辑工作库work和实际工作库work映射对应。也可以直接用指令“vmap work”表示将work库映射到当前工作目录下。)
vlog counter.v  counter_tb.v (对应仿真步骤②③:编译counter.v和counter_tb.v文件,默认编译到work库下。该命令的作用是编译这些文件,要注意的是文件可以单独分开编译,但是一定要先编译被调用的文件。假如是VHDL文件,只需要把指令vlog换成vcom即可。)
vsim work.counter_tb  -t 1ns (对应仿真步骤④:仿真work库中名为counter_tb的模块,最小时间单位为1ns。)
add  wave/counter_tb/ * (该命令的作用是将testbench文件camera_tb.v中模块camera_tb下所有的信号变量加到波形文件中去,注意在“*”前要加空格。这时候你也可以看到wave文件被打开。当然也可以单个信号的添加,例如添加时钟:addwave clk 等等。)
run 2000  (该命令的作用是运行2000个单位时间的仿真。也可以用run–all命令来一直仿真下去。)

这时候就可以在wave窗口文件中看到你的仿真结果。当然也可以观察其它窗口的结果,用view*命令显示 。view*命令可以观察包括signals、wave、dataflow等窗口文件,也可以分别打开。例如用view signals来观察信号变量。

以上就是do文件的一些基本TCL脚本语言的使用,写得比较简单,但是其实复杂的也就是在添加信号线那里add wave 有比较多的参数设置而已,主要的指导仿真流程的指令还是这几条。

编写好DO文件之后,在Modelsim中,将工作目录切换到counter.v、counter_tb.v和counter.do三个文件所在目录下,然后在Transcript窗口中的命令行输入 do counter.do即可。切换工作目录的方法如下图1,点击Change Directory:

IMG_256

图1

PS: 如果在仿真的时候要修改.do文件,需要现在modelsim里运行quit -sim,退出仿真,然后修改.do文件,再保存,然后再重新执行do filename.do指令即可。

小技巧Tips:

为了区分仿真波形窗口中的各种信号线,需要信号波形作设置,如不同信号线的颜色、显示基数、显示方式等要有区别,这时就需要在仿真波形窗口单独对每一个信号线手动进行设置,这对于不断修改源代码然后再不断地进行仿真来说,非常麻烦。

这里,我说一下有个简单的自动生成这类个性化设置DO文件的方法。首先,我们需要先进行一次仿真,在波形窗口的时候先手动对需要的信号线进行一定的设置,如下图2所示:

IMG_257

图2

 

然后,点击wave窗口左上角的save图标,会出现一个保存DO文件的窗口,如图3所示:

IMG_258

图3

它的路径Pathname表示Modelsim自动在当前的默认目录下新建了一个wave.do的DO文件,我们可以自己修改保存的路径和DO文件名。

接下来我们来看一下上面保存的wave.do文件,打开如下图4所示:

IMG_259

图4

 

         由wave.do文件中,可以见到我们定义的那些不同颜色、不同显示方式所用的TCL脚本语言,如add wave -color Yellow /freq_meter_tb/i1/freq_data表示让该freq_data信号显示黄色…如add wave-noupdate -radix decimal /freq_meter_tb/i1/div_coef 表示让div_coef信号用十进制decimal来显示…其他的信息可以对照自己的波形设置一一对应上,其他依次类推。

细心的同学会发现这个DO文件根本不完整,基本都是一些add wave,即是对每个信号的各种设置的TCL代码而已。不错,因为它缺少了我们之前所讲的仿真步骤①②③④,那么我们可以利用上面已学过的TCL语言来补完整它。

如在前面加上一下语句,使这个DO文件包括了仿真过程的完整指令,包括新建工作库、编译源文件、仿真testbench文件等:

vlib work

vmap work work

vlog freq_meter.v

vlog freq_meter_direct.v

vlog freq_meter_tb.v

新的DO文件如下所示: IMG_260

IMG_256

图5

add wave–position  insertpoint  sim:/tb_clk_div_even/clk_div_even_inst/*:表示将clk_div_even_inst中的所有信号添加到wave窗口中去,执行这句以后,我们每次仿真时,就不用每次都手动去添加仿真波形了。但是这句话实际是Modelsim生成的,不需要我们自己编写。最开始我们写的do文件是不包含这条语句的,当我们运行到如下图状态时,选择要添加的信号,右键—>add wave后,下面的脚本窗口会弹出相应操作的tcl脚本语句。这样我们把这条语句赋值到我们的do文件中即可。第二次再调用sim.do文件时,就不用再手动添加波形了。

run –all :  运行全过程。当然也可以运行一段时间。run 10us 表示运行10us。

掌握这些最基本的tcl脚本,使用do文件仿真会为我们节省很多时间。后续的教程里我们都会默认以这种方式进行仿真。当然这里只是介绍了最基本的仿真脚本语言,今后我们仿真时可能还会有第三方的IP核文件,如altera的PLL、FIFO、RAM等需要添加到仿真用例中,这些我们后面在介绍IP核使用时会给大家介绍如何利用do文件仿真含有IP核的设计。

现在我们可以体验一下do文件仿真所用的时间,双击“modelsim_run.bat”,即可运行仿真。也可以点击Tools–Td–Execute Macro ,找到你的do文件,就能重新仿真。

————————————————

 

Posted in FPGA, FPGA 教材教案, 教材与教案, 文章

发表回复

相关链接