前面的课程主要讲使用ModelSim的交互模式:通过图形界面或主窗口的命令行一条条的执行单一的命令。当需要完成重复的任务时,可用DO文件提高效率。
DO文件是一次执行多条命令的脚本。这个脚本可以像带有相关参数的一系列ModelSim命令一样简单,或者是带有变量,执行条件等等的Tcl程序。可在GUI里或系统命令提示符后执行Do文件。
注意:
本课假设你已经添加<install_dir>/modeltech/<platform>到你的环境变量的PATH。否则,要指定工具(如,vlib,vmap, vlog,vcom,和vsim)的绝对路径。
用户手册:Tcl and Macros ( DO Files )。
Practical Programming in Tcl and Tk, Brent B. Welch, Copyright 1997
创建DO文件就像在文本文件里输入命令一样。或者,可保存主窗口的transcript作为一个DO 文件。本练习将用在主窗口transcript输入的命令来创建一个DO文件以添加信号到波形窗口,添加激励,然后仿真。
1. 加载test_counter设计单元。
a) 启动ModelSim。
b) 切换目录至在基本仿真那课创建的目录。
c) 输入vsim test_counter来加载设计单元。
2. 输入命令给波形窗口添加信号,激励信号,然后运行仿真。
选择File > New > Source > Do来创建一个新的DO文件。
在源码窗口输入以下命令:
add wave count
add wave clk
add wave reset
force –freeze clk 0 0, 1 {50 ns} –r 100
force reset 1
run 100
force reset 0
run 300
force reset 1
run 400
force reset 0
run 200
3. 保存文件。
a) 选择File > Save As。
b) 在File name栏输入sim.do并保存到当前目录。
4. 再次加载仿真并使用DO文件。
a) 在VSIM>后输入quit –sim。
b) 在ModelSim>后输入vsim test_counter。
c) 在VSIM>后输入do sim.do。
ModelSim执行保存的命令并在波形窗口生成波形。
5. 当完成本练习,选择File > Quit退出ModelSim。
1. 创建一个新目录并拷贝文件。
开始本练习前,创建一个新目录,并拷贝以下文件:
l /<install_dir>/examples/tutorials/verilog/automation/counter.v
l /<install_dir>/examples/tutorials/verilog/automation/stim.do
2. 创建一个新的设计库并编译源文件。
在系统提示符后输入以下命令。
a) 输入vlib work。
b) 输入vlog counter.v。
3. 创建一个DO文件。
a) 打开文本编辑器。
b) 输入以下内容:
# list all signals in decimal format
add list –decimal *
# read in stimulus
do stim.do
# output results
write list counter.lst
#quit the simulation
quit –f
c) 把文件命名为sim.do,然后保存在当前文件夹。
4. 运行批处理仿真
a) 在提示符后输入以下命令:
vsim –c –do sim.do counter –wlf counter.wlf
这里-c表示不打开GUI。-wlf保存仿真结果为一个WLF文件。调试时可在GUI查看仿真结果。
5. 查看输出列表。
a) 打开counter.lst并查看仿真结果。类似下图:
6. 在GUI下查看结果。
如果在counter.wlf保存了仿真结果,就可在GUI下通过-view参数查看。
注意:
确定你的环境变量的PATH设置的路径为当前ModelSim的路径。
a) 在系统提示符后输入vsim –view counter.wlf。
打开GUI和一个名为“counter”资料组标签(图8-1)。
b) 右击counter实例并选择Add > To Wave > All items in region。
波形窗口显示波形。
7. 当查看完结果。选择File > Quit关闭ModelSim。
前面的练习的DO文件只使用了ModelSim的命令。但是,DO文件实质上是Tcl脚本。可以包含很多Tcl结构,比如程序,条件运算符,数学和三角函数,正则表达式等等。
本练习创建一个Tcl脚本,用来识别信号的确定值,如果存在,在波形窗口放置标签。标签可将波形窗口的滑动和放大区域记录下来。
1. 创建脚本。
a) 在文本编辑器,新建一个文件并输入以下行:
proc add_wave_zoom {stim num} {
echo “Bookmaking wave $num”
bookmark add wave “bk$num” “[expr $stime – 50] [expr $stime +
100]” 0
}
这些命令的作用:
l 创建一个名为“add_wave_zoom”的程序,它有stime和num两个参数。
l 从当前仿真时间的前50个单位时间到后100个单位时间的范围创建一个书签。
b) 在脚本末添加以下行:
add wave –r /*
when {clk’event and clk=”1”}{
echo “Count is [xa count]”
if {[examine count]==”00100111”}{
add wave_zoom $now 1
} elseif {[examine count]==”01000111”}{
add_wave_zoom $now 2
}
}
这些命令的作用:
l 给波形窗口添加所有的信号。
l 使用when语句识别clk跳变为1的时刻。
l 在这些跳变检测count的值,如果它是某个确定值,添加一个书签。
c) 将这个脚本以”add_bkmrk.do”为名存到在基本仿真那课创建的目录里。
2. 加载test_counter设计单元。
a) 启动ModelSim。
b) 选择File > Change Directory 切换至上面第一步保存DO文件的目录。
c) 在QuestaSim>后输入vsim test_counter
3. 执行DO文件并运行设计。
a) 在VSIM>后输入do add_bkmrk.do。
b) 在VSIM>后输入run 1500 ns
仿真运行,DO文件创建两个书签。
c) 如果波形窗口停靠在主窗口,激活它,然后选择Wave > Bookmarks >bk1。如果那个窗口独立出来了,选择View > Bookmarks > bk1.
查看波形窗口,放大并滑到count是00100111的时刻。
同样试试bk2。
本课到此结束。
1. 选择File > Quit关闭ModelSim.