原创 Modelsim 6.0 使用教程

2008-3-6 18:24 3256 5 6 分类: FPGA/CPLD




Modelsim 6.0 使用教程



1. Modelsim简介



Modelsim仿真工具是Model公司开发的。它支持VerilogVHDL以及他们的混合仿真,它可以将整个程序分步执行,使设计者直接看到他的程序下一步要执行的语句,而且在程序执行的任何步骤任何时刻都可以查看任意变量的当前值,可以在Dataflow窗口查看某一单元或模块的输入输出的连续变化等,比quartus自带的仿真器功能强大的多,是目前业界最通用的仿真器之一。



对于初学者,modelsim自带的教程是一个很好的选择,在Help->SE PDF
Documentation->Tutorial
里面.它从简单到复杂、从低级到高级详细地讲述了modelsim的各项功能的使用,简单易懂。但是它也有缺点,就是它里面所有事例的初期准备工作都已经放在example文件夹里,直接将它们添加到modelsim就可以用,它假设使用者对当前操作的前期准备工作都已经很熟悉,所以初学者往往不知道如何做当前操作的前期准备。



2.
安装



同许多其他软件一样,Modelsim SE同样需要合法的License,通常我们用Kengen产生license.dat



             
⑴. 解压安装工具包开始安装,安装时选择Full
product
安装。当出现Install Hardware Security Key Driver时选择否。当出现Add Modelsim To Path选择是。出现Modelsim License
Wizard
时选择Close



             
⑵. 在C盘根目录新建一个文件夹flexlm,用Keygen产生一个License.dat,然后复制到该文件夹下。



             
⑶. 修改系统的环境变量。右键点击桌面我的电脑图标,属性->高级->环境变量->(系统变量)新建。按下图所示内容填写,变量值内如果已经有别的路径了,请用将其与要填的路径分开。LM_LICENSE_FILE = c:\flexlm\license.dat



 





⑷.安装完毕,可以运行。



 



3.
Modelsim
仿真方法



Modelsim的仿真分为前仿真和后仿真,下面先具体介绍一下两者的区别。



3.1
前仿真



前仿真也称为功能仿真,主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟,主要是验证电路与理想情况是否一致。可综合FPGA代码是用RTL级代码语言描述的,其输入为RTL级代码与Testbench.



3.2
后仿真



后仿真也称为时序仿真或者布局布线后仿真,是指电路已经映射到特定的工艺环境以后,综合考虑电路的路径延迟与门延迟的影响,验证电路能否在一定时序条件下满足设计构想的过程,是否存在时序违规。其输入文件为从布局布线结果中抽象出来的门级网表、Testbench和扩展名为SDOSDF的标准时延文件。SDOSDF的标准时延文件不仅包含门延迟,还包括实际布线延迟,能较好地反映芯片的实际工作情况。一般来说后仿真是必选的,检查设计时序与实际的FPGA运行情况是否一致,确保设计的可靠性和稳定性。



3.3
Modelsim
仿真的基本步骤



Modelsim的仿真主要有以下几个步骤:建立库并映射库到物理目录;编译原代码(包括Testbench;执行仿真。



3.3.1
建立库



在执行一个仿真前先建立一个单独的文件夹,后面的操作都在此文件下进行,以防止文件间的误操作。然后启动Modelsim将当前路径修改到该文件夹下,修改的方法是点File->Change
Directory
选择刚刚新建的文件夹见下图。



 













2



仿真库是存储已编译设计单元的目录,modelsim中有两类仿真库,一种是工作库,默认的库名为work,另一种是资源库。Work库下包含当前工程下所有已经编译过的文件。所以编译前一定要建一个work库,而且只能建一个work库。资源库存放work库中已经编译文件所要调用的资源,这样的资源可能有很多,它们被放在不同的资源库内。例如想要对综合在cyclone芯片中的设计做后仿真,就需要有一个名为cyclone_ver的资源库。



映射库用于将已经预编译好的文件所在的目录映射为一个modelsim可识别的库,库内的文件应该是已经编译过的,在Workspace窗口内展开该库应该能看见这些文件,如果是没有编译过的文件在库内是看不见的。



建立仿真库的方法有两种。一种是在用户界面模式下,点File->New->Library出现下面的对话框,选择a
new library and a logical mapping to it,
Library
Name
内输入











3



要创建库的名称,然后OK,即可生成一个已经映射的新库。另一种方法是在Transcript窗口输入以下命令:



vlib
work



/*
库名 */



vmap
work work



/*
映射的逻辑名称 存放的物理路径 */



如果要删除某库,只需选中该库名,点右键选择Delete即可。



需要注意的是不要在modelsim外部的系统盘内手动创建库或者添加文件到库里;也不要modelsim用到的路径名或文件名中使用汉字,因为modelsim可能无法识别汉字而导致莫名其妙的错误。



3.3.2
编写与编译测试文件



在编写Testbench之前最好先将要仿真的目标文件编译到工作库中,点Compile->Compile或,将出现下面的对话框,



Library中选择工作库,在查找范围内找到要仿真的目标文件,然后点CompileDone。或在命令行输入vlog
fulladder.v
。此时目标文件已经编译到工作库中,在Library中展开工作库会发现该文件。











4



当对要仿真的目标文件进行仿真时需要给文件中的各个输入变量提供激励源,并对输入波形进行的严格定义,这种对激励源定义的文件称为Testbench,即测试台文件。下面先讲一下Testbench的产生方法。



我们可以在modelsim内直接编写Testbench,而且modelsim还提供了常用的各种模板。具体步骤如下:



⑴.执行File->New->Source->verilog,或者直接点击工具栏上的新建图标,会出现一个verilog文档编辑页面,在此文档内设计者即可编辑测试台文件。需要说明的是在Quartus中许多不可综合的语句在此处都可以使用,而且testbench只是一个激励源产生文件,只要对输入波形进行定义以及显示一些必要信息即可,切记不要编的过于复杂,以免喧宾夺主。



⑵.Modelsim提供了很多Testbench模板,我们直接拿过来用可以减少工作量。点View->Source->Show
Language Templates
然后会出现一个加载工程,接着你会发现在刚才的文档编辑窗口左边出现了一个Language
Templates
窗口,见下图。展开Verilog项,双击Creat
Testbench
会出现一个创建向导,见下图。











5



选择Specify
Design Unit
工作库下的目标文件,点Next,出现下面对话框可以指定Testbench的名称以及要编译到的库等,此处我们使用默认设置直接点Finish。这时在Testbench内会出现对目标文件的各个端口的定义还有调用函数接下来,设计者可以自己往Testbench内添加内容了,然后保存为.v格式即可。按照前面的方法把Testbench文件也编译到工作库中。



 



 



3.3.3
执行仿真



因为仿真分为前仿真和后仿真,下面分别说明如何操作。



.
前仿真



 



前仿真,相对来说是比较简单的。在上一步我们已经把需要的文件编译到工作库内了,现在我们只需点simulate->Start
Simulation
或快捷按钮会出现start
simulate
对话框。点击Design标签选择Work库下的Testbench文件,然后点OK即可,也可以直接双击Testbench文件,此时会出现下面的界面。













6



在主界面中会多出来一个Objects窗口,里面显示Testbench里定义的所有信号引脚,Workspace里也会多出来一个Sim标签。右键点击fuladder_tb.v,选择Add->Add
to Wave
,如下图所示。然后将出现Wave窗口,现在就可以仿真了,见下图。





窗口里面已经出现了待仿真的各个信号,点将开始执行仿真到100ns,继续点仿真波形也将继续延伸,见下图.











7



若点,则仿真一直执行,直到点才停止仿真。也可以在命令行输入命令:



run
@1000



则执行仿真到1000ns,后面的1000也可以是别的数值,设计者可以修改。在下一次运行次命令时将接着当前的波形继续往后仿真。



对于复杂的设计文件,最好是自己编写testbench文件,这样可以精确定义各信号以及各个信号之间的依赖关系等,提高仿真效率。对于一些简单的设计文件,也可以在波形窗口自己创建输入波形进行仿真。具体方法是双击work库里的目标仿真文件fulladder.v,然后点workspace窗口中出现的sim标签,右键点击fuladder,选择Add->Add
to Wave
,如下图所示。然后将 出现Wave窗口。





wave窗口中选中要创建波形的信号,如此例中的a,然后右键点击,选择











8



Create/Modify/Wave项出现下面的窗口,





Patterns中选择输入波形的类型,然后分别在右边的窗口中设定起始时间、终止时间以及单位,再点Next出现下面的窗口,我们把初始值的HiZ改为0



 



然后修改时钟周期和占空比,然后点Finish.接着继续添加其他输入波形,出现下面的结果。前面出现的红点表示该波形是可编辑的。后面的操作与用testbench文本仿真的方法相同





 



如果设计者只想查看指定信号的波形,可以先选中objects窗口中要观察的信号,然后点右键选择Add
to Wave->Selected signals,
见下图,那么在Wave窗口中只添加选中的信号。











9



如果要保存波形窗口当前信号的分配,可以点File->Save->Format,在出现的对话框中设置保存路径及文件名,保存的格式为.do文件。如果是想导出自己创建的波形(在文章最后有详细的解释)可以选择File->Export
Waveform
在出现的对话框中选择EVCD File并进行相关设置即可,如果导入设计的波形选择File->Import
ECVD
即可。



在主界面中点View->Debug
Windows->Dataflow
可以看到会出现dataflow窗口,在objects窗口中拖一个信号到该窗口中,你会发现在dataflow窗口中出现你刚才选中信号所在的模块,如果双击模块的某一引脚,会出现与该引脚相连的别的模块或者引线,见下图。





dataflow窗口中点View->Show
Wave
,会在dataflow窗口中出现一个wave窗口,双击上面窗口中的某一模块,则在下面的wave窗口中出现与该模块相连的所有信号,如果已经执行过仿真,在wave窗口中还会出现对应的波形,见下图。



 











10



在波形窗口中拖动游标,上面模块的引脚信号的值也会随着游标当前位置的改变而改变。



如果要在modelsim中修改原设计文件,在文档页面点击右键,取消Read
Only
,即可修改,修改后继续仿真。如果想结束仿真可以点Simulate->End
Simulation,
或直接在命令行输入quit -sim,此时quartus也会显示结束所有编译过程。



⑵.后仿真



后仿真与前仿真的步骤大体相同,只不过中间需要加添加仿真库、网表和延时文件的步骤。



后仿真的前提是quartus已经对要仿真的目标文件进行编译,并生成modelsim仿真所需要的.vo文件(网表文件).sdo文件(时延文件),具体操作过程又有两种方法,一种是通过Quartus调用ModelsimQuartus在编译之后自动把仿真需要的.vo文件以及需要的仿真库加到modelsim中,操作简单;一种是手动将需要的文件和库加入modelsim进行仿真,这种方法可以增加主观能动性,充分发挥modelsim的强大仿真功能。



。通过Quartus调用Modelsim



 



使用这种方法时首先要对Quartus进行设置。



先运行Quartus,打开要仿真的工程,点菜单栏的Assignments,点EDA
Tool settings
,选中左边Category中的Simulation.,在右边的Tool
name
中选ModelSim(Verilog),选中下面的Run
Gate Level Simulation automatically after complication.
见下图。











11



Quartus中的工程准备好之后点击start
complication
按钮,此时modelsim会自动启动,而quartus处于等待状态(前提是系统环境变量中用户变量中PATH要设置好modelsim安装路径,如:D:\Modeltech_6.0\win32)。在打开的modelsimWorkspace窗口中你会发现多了工作库和资源库,而且work库中出现了需要仿真的文件。Modelsim自动将quartus生成的.vo文件编译到work库,并建立相应的资源库。如图所示。











12



编写测试台程序fuladder_tb.v
,最好放在生成的.vo文件所在的目录,以方便在需要手动仿真时使用。点Compile在出现的对话框中选中fuladder_tb.v文件,然后点Compile按钮,编译结束后点Done,这时在Work库中会出现测试台文件。点击simulate->Start
Simulation
或快捷按钮会出现start
simulate
对话框。点击Design标签选择Work库下的fuladder_tb.v文件,然后点击Libraries标签在Search
Library
中点击Add按钮,选择仿真所需要的资源库(如果不知道需要选择哪个库,可以先直接点Compile看出现的错误提示中说需要的库名,然后再重复上述步骤),见下图。再点start
simulate
对话框的SDF标签。在出现的对话框的SDF
File
框内加入.sdo时延文件路径。在Apply
To Region
框内有一个“/” “/”的前面输入测试台文件名,即“fulladder_tb”,在它的后面输入测试台程序中调用被测试程序时给被测试程序起的名称 ,本例中为“DUT”,见下图。然后点OK。后面与前仿真步骤相同。











1314



 





 





.
手动仿真



手动仿真需要自己添加文件和编译库,但可以充分发挥modelsim强大的仿真功能。操作时也要先对quartus进行设置,设置与前面相同只是不要选中Run
Gate Level Simulation automatically after complication
。然后启动modelsim,将当前路径改到新建文件夹下。新建一个库,此处默认库名为work。如果按照①中的方法编写testbench并放在.vo所在的目录,这时点Compile下的Compile或点将会出现下面的对话框,



Compile在出现的对话框中同时选中fuladder_tb.vfuladder.vo文件,点击编译,然后点Done,这样要仿真的网表文件和testbench就被编译到工作库里了。后面的操作就与①中的步骤相同了。



⑵.编写测试台文件,如果只进行功能仿真,双击测试台文件名即可进入仿真界面。如果要进行时序仿真则要将quartus生成的.sdo文件一起编译到work库里,后面的步骤与方法1中的相同。



 



⑶. 对于复杂的设计文件,最好是自己编写testbench文件,使用行为级监控语法,提高仿真效率。对于一些简单的设计文件,也可以在波形窗口自己创建输入波形进行仿真。具体方法是双击work库里的fulladder.v文件对其进行仿真,然后点workspace窗口中出现











15



sim标签,右键电击fuladder,选择Add->Add
to Wave
,如下图所示。





然后将 出现Wave窗口,见下图。





先选中要创建波形的信号,如此例中的a,b,cin,然后右键点击,选择Create/Modify/Wave项出现下面的窗口,在Patterns中选择输入波形的类型,然后分别在右边的窗口中设定起始时间、终止时间以及单位,再点Next出现下面的窗口,





我们把初始值的HiZ改为0,然后修改时钟周期和占空比,然后点Finish.接着继续添加其他输入波形,出现下面的结果。





前面出现的红点表示该波形是可编辑的。然后点主窗口的Simulate->Run->Run
at 100ns
或者直接点或者在主窗口命令行输入run @100,则波形将仿真执行到100ns,如下图。





 若点,或点Simulate->Run->Run
–all
或者在命令行输入run @1000,则仿真到终止时间。



 



4 一些说明



4.1 关于在testbench里使用`timescale的问题



`timescale 是编译器指令,用来定义时延精度和时延单位,命令格式为



`timescale time_unit/time_precision



其中time_unit定义时延单位,即后面模块中出现的时延数值的单位,time_precision定义时延精度。例如



`timescale 1ns/100ps



表示时延单位为1ns,时延精度为100ps。如果后面有语句



#5.22 a=1;



此时时延值5.22ns应该对应为5.2ns,因为精度为0.1ns











17



如果设计中多个模块带有自身的`timescale,编译时模拟器总是定义在所有模块的最小时延精度上,并且所有模块中的时延都自动地换算为到最小试验精度上。









18



 



PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户163760 2008-11-6 17:27

为什么看不到图呢!
相关推荐阅读
用户1317300 2008-05-25 23:48
数字图像处理算法实现
                                 ------------编程心得(1)2001414班 朱伟 20014123摘要: 关于空间域图像处理算法框架,直方图处理,空间域滤...
用户1317300 2008-05-12 14:29
CCIR601和ccir656标准的区别
关于这两种信号的区别: ITU-R BT 601:16位数据传输;21芯;Y、U、V信号同时传输。 ITU-R BT 656:9芯,不需要同步信号;8位数据传输;串行视频传输;传输速率是601的2倍;...
用户1317300 2008-05-12 11:58
解读XGA、SXGA、UXGA、WSXGA、SXGA+
在浏览显示终端设备如显示器、电视、笔记本、投影仪时,除了关心尺寸之外,分辨率也是采购必须考虑的因素,但有时分辨率并不是用多少乘以多少,而是用XGA、SXGA、UXGA、WSXGA等等来表示,许多用户因...
用户1317300 2008-05-03 19:34
DSP程序设计指导
一.源代码书写格式    源代码的书写有一定的格式,初学者往往容易忽视。简单归纳如下:    1.每一行代码分为三个区:标号区、指令区和注释区。标号区必须顶格写,主要是定义变量、常量、程序标签时的名称...
用户1317300 2008-05-03 17:13
录像机视频信号放大器的原理
一、高频或射频信号 为了能够在空中传播电视信号,必须把视频全电视信号调制成高频或射频(RF-RadioFrequency)信号,每个信号占用一个频道,这样才能在空中同时传播多路电视节目而不会导致混乱。...
用户1317300 2008-05-03 17:10
上拉电阻下拉电阻的总结
上拉电阻:1、当TTL电路驱动COMS电路时,如果TTL电路输出的高电平低于COMS电路的最低高电平(一般为3.5V),这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。2、OC门电路必须加...
我要评论
1
5
关闭 站长推荐上一条 /3 下一条