一文学会Modelsim的DO文件仿真方法

在之前的博文“ModelsimSE 10.5 仿真教程”中介绍了 Modelsim10.5 的仿真步骤,基本都是靠鼠标点击相应功能来实现仿真的,如果是比较大的工程,需要经常修改被调用文件或者激励文件,那么就会重复这样的操作,仿真效率是极低的,好在 Modelsim 集成了 TCL 脚本文件功能,可以通过 do 文件来实现仿真。

一、Modelsim DO 文件的仿真步骤

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

1.1 建立 Modelsim DO 文件

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

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

  1. 创建一个工程和工程库;
  2. 加载设计文件(包括编写好的 testbench);
  3. 编译源文件;
  4. 运行仿真,并查看结果;
  5. 最后进行工程调试。

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

1.2 Modelsim DO 文件的仿真实例

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

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

正确的是:

vlib work
#新建一个 work 库

错误的是:

vlib work  #新建一个 work 库

编写名为 fifo.do 的文件,其内容为下:

vlib work
vmap work work

vlog -novopt -incr -work work "../src/fifo_test_tb.v"
vlog -novopt -incr -work work "../src/fifo_test.v"

vsim -novopt work.fifo_test_tb -L altera_mf  -t 1ns 

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

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

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

编写好 DO 文件之后,在 Modelsim 中,将工作目录切换到 work 的上一层级目录下,然后在 Transcript 窗口中的命令行输入 do fifo.do 即可。切换工作目录的方法,点击 File –> Change Directory。

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

1.3 Modelsim DO 文件个性化设置

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

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

一文学会Modelsim的DO文件仿真方法

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

一文学会Modelsim的DO文件仿真方法

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

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

一文学会Modelsim的DO文件仿真方法

由 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 文件如下所示:

一文学会Modelsim的DO文件仿真方法

至此,该 DO 文件才能用来实现较完整的自动化仿真。

二、交互式命令

通过在主窗口的命令窗口输入命令来实现,具有更好的调试和交互功能,提供多种指令,既可以是单步指令,也可以构成批处理文件,用来控制编辑、编译和仿真流程;

常见交互式命令如下:

2.1 force-repeat 指令

指令格式:force 开始时间 开始电平值,结束电平值 忽略时间(即 0 电平保持时间) -repeat 周期

force clk 0 0,1 30 -repeat 100 表示强制 clk 从 0 时间单元开始,起始电平为 0,结束电平为 1,0 电平保持时间为 30 个默认时间单元,周期为 100 个默认时间单元,占空比为 70%。

指令功能:每隔一段的周期重复一定的 force 命令,用来产生时钟信号,也可用来产生周期的输入信号,如 01010101,00110011 等。

2.2 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;

2.3 run 指令

指令格式:run timesteps time_unit,timesteps 时间步长,time_unit 时间单元,可以是 fs、ps、ns、us、ms、sec;

指令功能:运行(仿真)并指定时间及单元;

run 100, 表示运行 100 个默认时间单元;

run 2500ns, 表示运行 2500ns;

run -all, 表示运行全过程;

run -continue, 表示继续运行

2.4 force-cancel 指令

指令格式:force-cancel period

指令功能:执行 period 周期时间后取消 force 命令;

force clk 0 0,1 30 -repeat 60-cancel 1000,表示强制 clk 从 0 时间单元开始,直到 1000 个时间单元结束;

2.5 view 指令

指令格式:view 窗口名

指令功能:打开 Modelsim 的窗口

view souce,打开源代码窗口;

view wave,打开波形窗口;

view list,打开列表窗口;

view varibles,打开变量窗口;

view signals,打开信号窗口;

view all,打开所有窗口;

扫码关注尚为网微信公众号

尚为网微信公众号
每天学习电路设计嵌入式系统的专业知识,关注一波,没准就用上了。

原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/685.html

(1)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020年7月22日
下一篇 2020年8月20日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注