modelsim脚本文件的编写

时间:2022-02-11 09:16:56

第一章 ModelSim介 绍

本指南是为 ModelSim5.5f版本编写的,该版本运行于UNIX和Microsoft Windows 95/98/Me/NT/2000的操作系统环境中。本指南覆盖了VHDL和Verilog模拟仿真,但是你在学习过程中会发现对于单纯的HDL设计工作而言,它是一个很有用的参考。ModelSim具备强大的模拟仿真功能,在设计、编译、仿真、测试、调试开发过程中,有一整套工具供你使用,而且操作起来极其灵活,可以通过菜单、快捷键和命令行的方式进行工作。ModelSim的窗口管理界面让用户使用起来很方面,它能很好的与操作系统环境协调工作。ModelSim的一个很显著的特点就是它具备命令行的操作方式,类似于一个shell有很多操作指令供你使用,给人的感觉就像是工作在Unix环境下,这种命令行操作方式是基于Tcl/Tk的,其功能相当强大,这需要在以后的实际应用中慢慢体会。
ModelSim的功能侧重于编译、仿真,不能指定编译的器件,不具有编程下载能力。不象 Synplify和MAX+PLUS II可以在编译前选择器件。而且ModelSim在时序仿真时无法编辑输入波形,不象MAX+PLUS II可以自行设置输入波形,仿真后自动产生输出波形,而是需要在源文件中就确定输入,如编写测试台程序来完成初始化、模块输入的工作,或者通过外部宏文件提供激励。这样才可以看到仿真模块的时序波形图。另外对于Synplify来说,也只具有编译能力,但是比MAX+PLUS II可编译的verilog的内容要多,所以常常可以现在Synplify下编译,生成编译文件再送到MAX+PLUS II中使用。
ModelSim还具有分析代码的能力,可以看出不同的代码段消耗资源的情况,从而可以对代码进行改善,以提高其效率。

第二章    ModelSim的主要结构

ModelSim的主窗口(Main window)包括菜单栏、工具栏、工作区和命令行操作区。
在工作区可以显示Project Tab、Library Tab、Sim Tab(显示Load Design、Hierarchical Structure);在命令行操作区,可以用命令提示符的方式进行编译、仿真设计,同时打开其他窗口。
在菜单栏View下可以打开,source window、list window、wave window、structure window、 signal window、dataflow window、process window、viarables window等窗口,用来测试仿真、调试仿真。由此也可以看出该软件具有强大的仿真设计能力,它提供的工具很多。
在帮助菜单里有SE的帮助文件和Tcl的帮助文件,是学用ModelSim很好的帮手。

第三章    ModelSim的简要使用方法

ModelSim的简要使用方法这一章里通过一些课程来简单介绍ModelSim的使用方法,更多的需要在实际应用中熟练和掌握。

第一课   Create a Project
1.    第一次打开ModelSim会出现Welcome to ModelSim对话框,选取Create a Project,或者选取File\New\Project,然后会打开Create Project对话框。
2.    在Create Project对话框中,填写test作为Project Name;选取路径Project Location作为Project文件的存储目录;保留Default Library Name设置为work。
3.    选取OK,会看到工作区出现Project and Library Tab。
4.    下一步是添加包含设计单元的文件,在工作区的Project page中,点击鼠标右键,选取Add File to Project。
5.     在这次练习中我们加两个文件,点击Add File to Project对话框中的Browse按钮,打开ModelSim安装路径中的 example目录,选取counter.v和tcounter.v,再选取Reference from current location,然后点击 OK。
6.    在工作区的Project page中,单击右键,选取Compile All。
7.    两个文件编译了,鼠标点击Library Tab栏,将会看到两个编译了的设计单元列了出来。看不到就要把Library的工作域设为work。
8.    最后一不是导入一个设计单元,双击Library Tab中的counter,将会出现Sim Tab,其中显示了counter设计单元的结构。也可以Design\Load design来导入设计。
到这一步通常就开始运行仿真和分析,以及调试设计,不过这些工作在以后的课程中来完成。结束仿真选取Design \ End Simulation,结束Project选取File \ Close \ Project。

第二课   Basic VHDL Simulation
准备仿真
1.    为这次练习新建一个目录,然后拷贝example目录中所有的vhd文件到该目录下。设置该目录为当前工作目录,这一步通过从该目录调用ModelSim或是选取File\Change Directory命令来完成。
2.     在编译任何HDL代码前,要建立一个设计库来存放编译结果。选取Design \ Create a New Library生成一个新的设计库。确定选取Create: a new library and a logical mapping to it,在Library Name域中键入work,然后选取OK。这就在当前目录中建立了一个子目录,即你的设计库。ModelSim在这个目录中保存了名为_info的特殊文件。
( Prompt : vlib work
vmap work work )
3.     选取工具栏里的Compile命令来编译counter.vhd文件到新库中。这将打开Compile HDL Source Files对话框。使用vcom命令是看不到的。从列表中选取counter.vhd再点击Compile,完成后选取Done。可以编译多个文件,按照设计的需要依次选取进行编译。
( Prompt : vcom counter.vhd )
4.    选取工具栏里的Load design按钮,导入设计单元。Load design对话框可以让你选择库和*( top-level )设计单元来仿真,你也可以为仿真选取Simulation Resolution限制。这次仿真运行,下述是缺省的显示:
• Simulator Resolution: default (the default is 1 ns)
• Library: work
• Design Unit: counter
   如果设计单元是一个实体,你可以点击前面的加号,来浏览其关联的结构。
   ( Prompt : vsim counter )
5.    选取counter,然后选择Load接受设置。
6.    下面,选取View \ All打开所有的窗口,关于窗口的描述,参阅ModelSim User’s Manual。
( Prompt : view * )
7.    在Signals window选取View\List\Signals in Region,这个命令显示List window中的*( top-level )信号。
   ( Prompt : add list /counter/* )
8.    下步,通过从Signals window选取View\Wave\Signals in Region添加*( top-level )信号到Wave window。
   ( Prompt : add wave /counter/* )
运行仿真
通过应用始终输入激励来开始仿真。
1.    点击主窗口,在vsim提示符下敲如下面的命令:
   ( force clk 1 50 , 0 100 –repeat 100 )
   ( MENU : Signals\Edit\Clock )
   ModelSim解释force命令如下:
    force clk to the value 1 at 50 ns after the current time
    then to 0 at 100 ns after the current time
    repeat this cycle every 100 ns
2.    现在你可以练习来自于主窗口或波形窗口工具条按钮的两个不同的Run功能。(Run功能在主窗口和波形窗口中定义,即这两个窗口中有Run功能)。首先选取Run按钮,运行完成之后选取Run All。
Run. 运行仿真,在100ns后停止。
(PROMPT: run 100) (MENU: Run \ Run 100ns)
Run-All. 一直运行仿真,直到选取Break。
(PROMPT: run -all) (MENU: Run \ Run -All)
3.    选取主窗口或波形窗口的Break按钮来中断仿真,一旦仿真到达一个可接受的停止点,它就停止运行。
在源文件窗口中的箭头指向下一条将被执行的语句。(如果暂停发生时,仿真没在评测一个过程,则没有箭头显示在源文件窗口上)。
下面,你将在18行的函数内部设置一个断点。
4.    移动鼠标到源文件窗口,在18行上点击设置断点,可以看到紧挨着行号有一个红点,可以用鼠标点击切换断点的使能与否,断点禁止后看到是一个小的红色的园环。可以在断点上点击鼠标右键,选取Remove BreakPoint 18来取消断点。
( PROMPT : bp counter.vhd 18 )
5.    选取Continue Run按钮恢复中断了的运行,ModelSim会碰上断点,通过源文件中的一个箭头或是在主窗口中的一条中断信息来显示出来。
   (PROMPT: run -continue) (MENU: Run \ Continue)
6.    点击Step按钮可以单步执行仿真,注意Variables window中值的变化。如果你愿意可以持续点击Step。
   (PROMPT: run -step) (MENU: Step)
7.    当你完成了,敲入以下命令结束仿真。
quit -force
8.    命令没有寻求确认就结束了ModelSim。

第三课   Basic verilog Simulation
1.    新建一个目录,并设置该目录为当前工作目录,通过从该目录调用ModelSim或是选取File\Change Directory命令来完成。
2.     拷贝example目录中verilog文件到当前目录下。在你编译verilog文件前,你需要在新目录下生成一个设计库。如果你仅仅熟悉解释性verilog仿真器,诸如Cadence Verilog-XL,那么对于你来说这是一个新的方法。因为ModelSim是一个编译性Verilog 仿真器,对于编译它需要一个目标设计库。如果需要的话,ModelSim能够编译VHDL和Verilog代码到同一个库中。
3.    在编译任何HDL代码前,要建立一个设计库来存放编译结果。选取Design \ Create a New Library生成一个新的设计库。确定选取 Create: a new library and a logical mapping to it,在Library Name域中键入work,然后选取OK。这就在当前目录中建立了一个子目录,即你的设计库。ModelSim在这个目录中保存了名为_info的特殊文件。
( Prompt : vlib work
vmap work work )
4.    下面你将编译Verilog设计。
这个设计例子由两个Verilog源文件组成,每一个都包含一个唯一的模块。文件counter.v包含一个名为counter的模块,它执行一个简单的八位加法计数器。另一个文件tcounter.v是一个测试台模块(test_counter),通常用来校验counter。在仿真下,你可以看到这两个文件,通过一个被测试台例示了的模块counter的一个简单的实例(名为dut的实例),来层次化的设置了。稍候你将有机会看一下这个代码的结构,现在,你需要编译两个文件到work设计库。
5.    通过选取工具条中的Compile按钮来编译两个文件。
   ( PROMPT : vlog counter.v tcounter.v )
   这就打开了Compile HDL Source Files对话框。
   选取两个文件后,选择Compile,编译完成后选取Done。
6.    选取工具条中的Load Design按钮开始仿真。
   ( PROMPT : vsim test_counter )
   Load Design对话框允许你从指定的库中选取一个设计单元仿真。你也可以
   为仿真选取Simulation Resolution限制,缺省的库是work,缺省的Simulation Resolution是1ns。
7.    选取test_counter,点击Load接受这些设置。
8.    通过在主窗口下的vsim提示符下敲入下述命令来调出Signals、List and Wave window:
   view signals list wave
   (MENU: View\<window name\)
9.    为了列示*( top-level )信号,移动鼠标到Signals window,选取View\List\Signals in Region。
   ( Prompt : add list /test_counter/* )
10.    现在向Wave window添加信号。在Signals window选取Edit\Select All选择三个信号,拖动三个信号到Wave window的路径名或是数值窗格的任一个中。
HDL条目也能够从一个窗口拷贝到另一个窗口(或者是在Wave and List window内部),通过Edit \ Copy和Edit \ Paste菜单命令。也能删除选取的条目Edit \ Delete。
11.    下面打开Source window,选取View \ Source
   ( Prompt : view source )
12.    导入设计的时候会在工作去开出一个新的Sim Tab栏。这个Structure Pane展示了设计的层次结构。你可以点即“+”(expand)或“-”(contract)来观察。
13.     点击其中的Function increment可以注意到其他窗口是怎么适当的自动更新的。明确地说,Source window显示了你在 Structure window所选的层次水平的Verilog代码.在这种方式下使用Structure Pane类似于解释性Verilog的范围命令。现在,点击Structure Pane的顶层线,确定test_counter模块显示在Source window。
运行仿真
1.    Run运行100ns,缺省设置。
   (PROMPT: run ) (MENU: Run\Run 100ns)
2.    设置Run Length为500ns,然后Run。
现在仿真运行了600ns,在工作取底部状态栏可以看到这些信息。
3.    上个命令使仿真器前进了500ns,也可以设置仿真器推进的时间
run @ 3000
实际仿真器向前推进了2400ns(3000-600)
4.    选取主窗口Run All。
   (PROMPT: run -all ) (MENU: Run\Run -All)
5.    选取Break中断运行。
看Source window,察看中断执行的语句。
调试仿真
1.    在List window选取/test_counter/count。从List window菜单条中选取 Prop \ Signal Props。Modify Signal Properties (list) 对话框打开了。
为信号counter选取十进制(在Radix),相应的List window的输出也发生改变,成为十进制数,而不是缺省的二进制了。
2.    我们选取工作区Structure Pane中的dut:counter,然后在counter.v中的30行(这里包含一个到Verilog功能增量的调用)设置断点。
3.    选取Restart按钮,重载设计组件和重置仿真时间为零。
   (PROMPT: restart ) (MENU: File\Restart)
   确认Restart对话框中所有条目被选中,然后点击Restart。
   例子中的Verilog代码中19行有一个stop语句,如果不Restart的话,将会停
   在这一句上。
4.    选取Run –All(主窗口),恢复执行仿真。中断后看Source window。
   (PROMPT: run -all ) (MENU: Run\Run -All)
5.    正常的,当中断到达后你对一个或多个信号的值感兴趣,你有几个选项可以检测这些值。你能看显示在Signals window中的值;可以在Source window中,在变量上点右键;或者使用examine命令。
examine count
命令的结果是,值会输出在主窗口。
6.    执行单步跳使命令Step,遍历Verilog源函数。
7.    结束仿真的命令为:quit –force。

第四课   Mixed VHDL/verilog simulation
准备仿真
1.    生成一个新的工作目录,拷贝..\examples\mixedhdl\下的*.vhd和*.v文件到新目录中。设置为为当前工作目录。运行软件,如果Welcome对话框出现,选取Proceed to ModelSim。
2.    Select Design\Create a New Library
(PROMPT:vlib work)
Type Library Name:work
Select OK!
3.    编译文件
(PROMPT : vlog cache.v memory.v proc.v)
(PROMPT : vcom util.vhd set.vhd top.vhd)
打开Compile HDL Source Files对话框。 逐个编译Verilog文件。
cache.v memeory.v proc.v
4.    依赖设计,VHDL的编译次序是特定的。在这个例子中,top.vhd文件必须最后编译。按照下面的顺序编译文件:
util.vhd set.vhd top.vhd
5.    编译完成,点Done。
运行仿真
1.    选取Load Design开始仿真。Load Design对话框打开,选取top实体点击Load。
(PROMPT : vsim top)
2.    View\All,(PROMPT : view *)
3.    add list *
add wave *
(Signals MENU: View\List\Signals in Region)
(Signals MENU: View\Wave\Signals in Region)
4.    观察一下工作区的Structure pane。注意设计中两者的层次混合,VHDL级的用一个方框前缀指示,Verilog级的用一个圆形前缀指示。
5.    在Structure pane中点击模块c:cache,它的源代码出现在源文件窗口。
6.    用查找功能定位cache.v文件中cache_set的声明。
Edit\Find。
找到了可以发现,cache_set是cache.v文件内例示了的VHDL实体。
7.    在Structure window,点击行“s0:cache_set(only)”。则Source window显示了cache_set实体的VHDL代码。
8.    Quit -force

第五课   Debugging a VHDL simulation
准备仿真
1.    拷贝..\example\下的gates.vhd,adder.vhd,testadder.vhd文件到新建的工作目录,并定位为当前工作目录。
2.    生成一个新库:vlib library_2。
3.    在命令行的方式下敲入以下命令将源文件编译到新库中
vcom –work library_2 gates.vhd adder.vhd testadder.vhd
4.    下一步是映射新库到工作库,可以编辑modelsim.ini文件来生成映射,或者用vmap命令生成一个逻辑库名字来完成。
vmap work library_2
ModelSim为你修改modelsim.ini文件。
5.    选取Design\Load Design,打开Load Design对话框。
6.    确认simulation resolution为缺省;在设计单元中选取名为test_adder_structural的配置;单击Load接受设置。
   (PROMPT : vsim –t ns work.test_adder_structural)
7.    打开所有的窗口。(PROMPT:View *)(MENU:View\All)
8.    在Signals window中选区所有信号Edit\Select All然后拖到List window中。
   (MENU:View\List\Signals in Region) (PROMPT:add list *)
9.    同样地,把信号加到Wave window中。键入命令:add wave *
   (MENU:View\Wave\Signals in Region)(DRAG&Drop)
10.    在主工具条上的运行时间选择器中,改变运行时间设置为1000ns。
   (MENU:Option\Simulation\Defaults)
运行调试仿真
1.    选取Run,运行仿真。(PROMPT:run)
主窗口中的一条消息将通报你有一个判断错误。执行下面步骤查找错误。
2.    首先,改变仿真判断选项。选取Option\Simulation。
3.    选取Assertions页面。改变选择为Break on Assertion to Error并点击OK。这将使仿真停在HDL判断语句上。
4.    选取Restart。(MENU:File\Restart) (PROMPT:restart)
确定Restart对话框中所有条目被选,然后点击Restart。
5.    选取Run。可以看到Source window中的箭头指向判断语句。
   (MENU:Run\Run 1000 ns) (PROMPT:run)
6.    在Variables window中,你可以看到i=6。这表示仿真停留在测试模式环路的第六次重复中。
7.    点击加号“+”展开名为test_patterns的变量。
8.    也要展开排列test_patterns(6)的第六次纪录。
判断表明了Signal window中的 sum不等于Variables window中的sum字段。输入a,b和cin的和应该等于输出sum。但是在测试向量内有一个错误。为了改正这个错误,你需要重仿真且修改测试向量的初始值。
9.    执行restart –f命令
参数-f使ModelSim不出现确认对话框就重新仿真。
10.    在test Process window中选取 testbench process更新 Variables window。
11.    再次展开Variables window中的test_patterns和test_patterns(6)。点击变量名字,高亮显示.sum纪录,然后选取Edit\Change。
12.    把value中数值的最后四位(1000),替换为0111,并点击Change。(这只是暂时编辑,你必须用文本编辑器永久地改变源代码。)
13.    选取Run。
   (MENU:Run\Run 1 us) (PROMPT:run)
   这样,仿真运行时就不会报错了。
改变new-line触发
缺省的,对于列出信号的每一次变化一条新线显示在List window中。下面的步骤将改变触发因而每100ns就列出这些值。
1.    在List window中,选取Prop\Display Props。
2.    在Triggers页面完成这些步骤。
   •取消选取Trigger On:Signals以禁止在信号上触发
   •选取Trigger On:Strobe以开启strobe
   •在Strobe Period域键入100
   •在First Strobe at域键入70
   •单击OK接受设置
3.    最后一步将把信号a,b和sum改为十进制。选取Prop\Signal Props,打开Modify Signal Properties(list)对话框。
4.    选取信号,改变其属性。然后结束ModelSim,quit –force。

第六课   Running a batch-mode simulation
批处理模式仿真必须运行在DOS或UNIX提示符下。
1.    生成一个新目录,设置成当前工作目录。拷贝..\examples\counter.vhd到该目录下。
2.    生成一个新的设计库:vlib work
3.    映射库:vmap work work
4.    编译源文件:vcom counter.vhd
5.    使用宏文件为计数器提供激励。拷贝..\example\stim.do文件到当前工作目录中。
6.    生成批处理文件,内容为:
add list –decimal *
do stim.do
write list counter.lst
7.    执行下面的命令,运行批处理模式仿真:
vsim –do yourfile –wlf saved.wlf counter
•在名为“counter”的设计单元调用vsim仿真器
•通过-wlf这个可选项通知仿真器在名为saved.wlf的日志文件中保存仿真结果
•运行yourfile指定:值以十进制的方式列示出来;执行名为stim.do的激励;并将结果写到名为counter.lst的文件中。缺省的设计名为counter。
8.    浏览仿真结果 vsim –view saved.wlf
9.    打开一些窗口 view signals list wave
10.    在窗口中放置信号 add wave *
                        add list *
11.    运用Variables windows实验保存的仿真结果。完成了结束仿真:
quit –f
有关批处理和命令行模式更多的信息,请参阅ModelSim User’s Manual。

第七课   Executing Commands at startup
本课与第六课所介绍的工作于相同的目录,也是以命令行方式操作。
1.    这里将用到宏文件(DO)提供启动信息。拷贝..\examples\startup.do到当前工作目录。
2.    拷贝modeltech目录下的modelsim.ini文件到当前工作目录。然后编辑该文件,指定一个在设计导入之后被执行的命令。用notepad打开ini文件,取消下属语句的注释,它位于文件的[vsim]部分:(修改后保存)
Startup=do startup.do
3.    浏览这个DO文件,可以发现它用了一个预定义变量$entity来为不同的设计在启动时作不同的事情。
4.    键入以下指令指定将被仿真的*设计单元,开始仿真:vsim counter
注意到没有显示对话框仿真器就导入了设计单元。对于一再地仿真同一个设计单元,这样做是很便捷的。还可以注意到所有的窗口都打开了,这是因为命令view *包括在启动宏里面。
5.    结束ModelSim,执行quit –f命令。
6.    在其他例子中是不需要startup.do文件的,所以用文本编辑器注释掉modelsim.ini文件中的Startup这一行。

第八课   Finding names and values
Finding items by name in tree windows
你可以使用各个窗口(List,Process,Signal,Source,Structure,Variables,and Wave window)中的查找对话框找寻你需要的HDL条目。Edit\Find
Searching for item values in the List and Wave windows
你可以在List and Wave windows中搜寻HDL条目的值。Edit\Search
你能够为Signal Name(s)定位值,搜寻基于以下的选项:
Search Type:Any Transition搜寻选取信号的任何变化
Search Type:Rising Edge搜寻选取信号的上升沿
Search Type:Falling Edge搜寻选取信号的下降沿
Search Type:Search for Signal Value
搜寻Value域中指定的值(符合VHDL or Verilog的数值格式)
Search Type:Search for Expression
搜寻评测一个布尔真值的Expression域中的表达式
表达式可以调用一个以上的信号,但是限制在纪录于List windows上的信号。表达式可以包括常量、变量和Tcl宏。如果没有指定表达式,搜寻将返回一个错误。参阅ModelSim Command Reference以获取更多关于表达式语法的信息。
Search Options:Match Count
你能够搜寻关于值的第n个变化或者是第n个匹配。Match Count指示了搜寻到的变化或匹配的数量。
Search Options:Ignore Glitches
忽略VHDL信号和Verilog网表中的零宽度的脉冲干扰。
搜寻的结果显示在对话框的底部。

第四章    ModelSim使用中的注意事项

1.    如果打开ModelSim,没有出现Welcom to ModelSim对话框,可以在主窗口点击Help \ Enable Welcome,则以后打开ModelSim就会出现该对话框。
2.    在工作区底部的状态栏里会显示一些有用的信息。
3.    操作哪个目录中的文件一定要定位到该目录,或者是设置为当前工作目录。
4.    不能用UNIX或window命令来生成work子目录,因为里面没有_info文件,只能用菜单或vlib命令。
5.    断点只能设置在可执行的行上,这些行以绿色行号指示
6.     在Basic Verilog Simulation一课里面,编译两个文件的次序是不重要的(不同于被编译器指示生成的源码的从属性)。Verilog -Xl的用户可能再次感到奇怪,他们了解设计单元之间的接口检测或是编译器指示的继承关系上可能存在的问题。ModelSim推迟了这样的检测,直到设计被导入。所以在这里,如果你选择在tcounter.v之前或之后编译counter.v不存在任何问题。
7.    一组Verilog文件可以以任意次序编译,但是在一个混合VHDL/Verilog设计中,Verilog文件必须在VHDL文件值前编译。
8.    force命令可以驱动clk,相当于给仿真初始化。