使用VerilogHDL进行数字逻辑设计综合仿真的步骤及工具软件使用.docx
《使用VerilogHDL进行数字逻辑设计综合仿真的步骤及工具软件使用.docx》由会员分享,可在线阅读,更多相关《使用VerilogHDL进行数字逻辑设计综合仿真的步骤及工具软件使用.docx(17页珍藏版)》请在冰豆网上搜索。
使用VerilogHDL进行数字逻辑设计综合仿真的步骤及工具软件使用
使用VerilogHDL进行数字逻辑设计、综合、仿真的步骤及工具软件使用简要说明
综合工具使用synplifypro7.0
仿真工具使用modelsim5.5e(几个菜单排列与5.6有不同,文中有介绍)
布局布线工具及时序仿真模型生成使用maxplusII10.0
一.写在开干之前
1.涉及到的文件
a.源程序(*.v)
用户编写的用于描述所需电路的module(可能有多个文件,多个module相互调用)
如果用于综合,则源程序内用于描述的Verilog语言必须是可综合风格的。
否则将只能做功能仿真(前仿真),而不能做综合后的仿真和时序仿真(后仿真)。
b.综合后的VerilogHDL模型(网表)(*.vm)
用综合工具synplify对a进行综合后生成的电路的VerilogHDL描述。
由synplify自动生成(必须在ImplementationOption—Implementationresults选项中选中writemappedverilognetlist后才会生成vm文件)。
此文件用于作综合后的仿真
c.布局布线后生成的时序仿真模型(网表)(*.vo)文件
使用maxplusII对设计进行布局布线之后,生成的带有布局布线及具体器件延迟特性等参数的电路模型的VerilogHDL描述。
要让maxplusII生成vo文件,必须在maxplusII的compileinterface中选中verilognetlistwriter。
此文件用于作时序仿真(后仿真)
d.测试文件(*.v或*.tf)
用户编写的VerilogHDL源程序。
用于测试源程序(a,b,c)中所描述电路。
在测试文件中调用被测试的module,生成被测点路所需的输入信号。
所用VerilogHDL语句不需要是可以综合的,只需语法正确。
如果被测试的模型为a,则对应的仿真为前仿真(功能仿真)
如果被测试的模型为b,则对应的仿真为综合后仿真
如果被测试的模型为c,则对应的仿真为后仿真
2.强烈建议
a.在写用于综合的源程序时,一个源程序文件里只写一个module
b.源程序文件名与其内所描述的module名相同(如modulemyadder文件名myadder.v)
c.为了方便管理文件,为每一个设计都单独创建一个目录,目录内创建source,test子目录分别用于存放源程序(用于综合的)和测试文件。
d.在F盘创建一个以自己学号为名的目录,将自己的设计都存放在这个目录下面
e.不要使用包含中文字符或空格的目录名和文件名,因为有些工具软件不支持
f.以上建议不一定是必须的,但是可以减少设计中的很多麻烦,请各位同学尽量采纳。
二.一般步骤(以一个加法器为例)
1.在硬盘上建立存放练习的目录(如在机房上机的话最好以自己的学号为名),再在此目录下面建立存放本次实验文件的目录(adder),在adder下建立source和test目录。
目录结构如下:
d:
\35020423
\adder
\source
\test
\exc1
\source
\test
……..
在本文中,用来综合的Verilog源文件都存放在source目录下;测试文件存放在test目录下。
2.打开synplifypro如图所示
图1程序界面
几个概念的说明:
a.工程(Project)
synplify用Project将一个设计中所有的文件组织在一起。
这些文件包括源文件和在综合过程中自动生成的结果网表文件以及报告(Log)。
初学者应该注意的是:
synplify是用来综合的软件,所以用于仿真的测试文件不应该加入到synplify工程中
b.Implementation
不知道中文因该叫什么合适。
使用synplify综合后,产生的结果叫做Implementation(个人理解)。
一个工程可以有多个Implementation。
也就是说相同的源文件可以产生多个综合结果。
因为每一次综合,除了我们的HDL描述之外,还有一些设置(如使用的器件、综合约束条件等)。
每一个Implementation的所有文件都存放在一个子目录下(祥见ImplementationOption的设置)
界面中各个区域说明如下:
1:
快捷按钮,从上到下依次为:
[OpenProject]:
没什么好说的。
[CloseProject]:
同上
[AddFile]:
添加源文件到工程中
[ChangeFile]:
改变工程中已经加入的文件。
例如在工程中加入了源文件A1.v,后来发现应该加A2.v,可以使用这个按钮;当然也可以先从工程中删除A1.v再从新加A2.v
[NewImpl]:
新建一个Implementation
[ImplOptions]:
设置Implementation的选项
[ViewLog]:
察看综合的报告文件。
里面有警告和出错信息,如果综合成功,里面会有资源占用、时间分析等信息。
2:
[Run]按钮
所有的设置完毕后用这个按钮开始综合
3:
工程区域
显示当前工程的文件结构等信息
4:
Implementation区域
显示当前Implementation目录中的内容
5:
Console区域
显示一些操作的过程和结果信息
6:
快捷按钮和菜单区域
正式开始干活(以adder为例)
1.新建工程
菜单[File]-[New],出现图2所示新建文件对话框。
选择FileType为ProjectFile
(1)
选择文件路径
(2):
d:
\35020423\adder
给出文件名(3):
adder
OK后如图3所示。
图2新建工程
图3新建工程后
2.给工程添加源程序
如果没有现成的源程序,可以使用synplify新建一个然后编辑;
如果有现成的源程序,可以直接用Addfiles按钮将其添加到工程中;
下面讲的是用synplify新建一个。
使用菜单[New]-[Files]
同样出现如图2所示对话框。
这次选择FileType为VerilogFile。
注意不要选成VHDLFile(除非你确实要使用VHDL语言)
然后选择文件的路径为d:
\35020423\adder\source(注意工程文件路径与此不同)
给出文件名adder(缺省VerilogHDL源程序文件扩展名为.v)
如果需要的话,可以直接将复选框[AddtoProject]选中,这样新建文件的同时,就将文件加入到了工程中。
也可以不选,在其他时候用[addfiles]按钮来加。
添加文件后,工程窗口如图四。
双击
(1)中的源文件的图标可以切换到文件编辑窗口(图5)。
鼠标单击区域
(2)可以在不同窗口间切换。
在编辑窗口中输入下列程序:
moduleadder(cout,sum,a,b,cin);//模块名,输入输出信号列表
input[2:
0]a,b;//输入输出信号定义
inputcin;
outputcout;
output[2:
0]sum;
//功能描述
assign{cout,sum}=a+b+cin;
endmodule
如图5。
图4新建源文件
图5编辑源文件
3.ImplementationOption设置
在ImplementationOption中可以设置综合时使用的器件,输出的仿真模型以及综合的约束条件(Constrain)等参数。
如图6所示,单击[ImplOptions…]按钮或使用右键快接菜单都可以打开ImplementationOption对话框,如图7。
(1)为选项标签,可以选择需要设置的项目页;
在本例中需要对device和ImplementationResults两个属性页进行设置
图7中
(2)为device属性页内的设置内容。
Technology的列表中列出的是synplify软件所支持的所有可编程逻辑器件厂商的各种器件,我们这里选用了Altera公司的Acex1k系列的器件。
一般来说,某一个器件系列都会有多种不同规模(逻辑门数)速度档级(器件延迟性能)和封装(管脚个数及器件物理外形尺寸)的器件;我们这里选择Acex1k系列中的EP1K10速度为-1及封装为TC100的器件。
这些参数在实际的设计中可以根据设计的实际情况选择,我们这里只是举了一个例子。
图6Implementation设置
图7ImplementationOption对话框
切换到[ImplementationResults]选项。
如图8所示。
(1)的位置是设置Implementation的名字,工程新建后缺省的Implementation名字为rev_1,为了便于归类,我们将使用altera公司器件的这个Implementation名字改为altera。
改完名字之后,synplify会在当前工程文件所在目录中,建立一个和implementation名字相同的子目录,用于存放综合后产生的文件。
(2)如果需要让synplify综合后生成用于综合后仿真的verilog模型,应该将
(2)选项:
WriteMappedVerilogNetlist选中,这样综合成功后,会生成一个与顶层文件名相同,而扩展名为.vm的文件。
这个文件也是一个用verilogHDL描述的文件,只不过是根据综合后生成的电路结构来描述的。
当作综合后仿真的电路模型。
ResultFileName为综合后的逻辑网表文件。
通过这个文件可以把综合后的逻辑交给后端的布局布线软件进行后续处理。
图8ImplementationResults设置
设置好以上选项之后就单击[确定]按钮;可以发现原来的Implementation名字rev_1已经改为altera了,用资源管理器察看硬盘上的adder目录发现新建了一个altera子目录。
如图9。
图9设置完毕后的工程列表
图9红圈中标出的是当前工程的顶层文件的名字。
当一个工程由多个源程序文件组成时,顶层文件的设置可以通过ImplementationOption中的Verilog标签指定,或者将顶层文件托动到Verilog文件夹(图9)的最后一个,因为synplify认为最后一个文件就是顶层文件。
好了,该设置的都已经设置完了,接下来的工作就交给计算机,不过还需要下一个命令。
单击那个最大的按钮[RUN]。
如果你够牛,那就可能一个错误都没有就显示”DONE”,但是一般情况下,都会有写warning啦error什么的,这时候可以单击工程窗口左边那一列按钮的最后一个[ViewLog],来察看到底发生了什么状况。
如果有兴趣,大家可以把源程序中的分号去掉一个重新RUN一把,然后看看有什么事情发生,这样自己写程序时出了错也不至于太紧张。
综合成功后,工程窗口右边(图1中4号区域)发现一些内容,这些都是综合后生成的结果。
如图10。
图10综合结果
(1)号区域(3)号区域分别是门级和RTL级的综合结果描述,大家可以用鼠标双击看看有什么事情发生,可以用放大缩小调整显示的效果。
(2)号为生成的vm文件,是我们下一步综合后的仿真所需要的电路模型
(3)号区域为生成的edf网标文件,可以用后端的布局布线工具打开,后仿真的时候会用到。
其它的我也不是太清楚,就不说了,有兴趣自己琢磨吧。
使用synplify综合的工作基本就完成了,当然还可以用synplify的源程序编辑功能来写我们的测试文件,但是千万记住不应该把测试文件加到我们的synplify工程里去哦。
4.前仿真(功能仿真)
准备活动:
需要描述电路的文件(.v),需要测试文件(.v或.tf),需要modelSim。
还是adder.v。
再写一个测试文件t_adder.v存放于d:
\35020423\adder\test下。
随便什么文本编辑器都可以,当然也可以用synplify或modelsim的文本编辑功能。
t_adder.v测试文件代码如下:
modulet_adder;
reg[2:
0]a1,b1;
regcin1;
wirecout1;
wire[2:
0]sum1;
adderu1(cout1,sum1,a1,b1,cin1);//adder模块调用
initialbegin
a1=0;
b1=0;
cin1=0;
#100a1=1;
#100b1=2;
#100cin1=1;
#1000a1=2;
b1=3;
cin1=0;
$stop;
end
endmodule
5.运行modelsim,使用菜单[File]—[ChangeDirectory…]改变目录到”d:
\35020423\adder”。
改变目录后,下一步的建库操作所自动产生的目录,都会被创建在目录adder中。
6.建库
所有在仿真中会用到的module都需要预先编译,编译后的结果都会放到所选择的库(目录)中。
一个目录下的某一个库只用创建一次,下一次重新进入modelsim的时候,只要选择了相应的目录(步骤5),以前所创建的库都会显示在modelsim的workspace窗口(主窗口左边的部分)中。
如果是modelsimse5.5x版,使用菜单[Design]-[CreateNewLibrary],然后在建库对话框中给出LibraryName。
如果是modelsimse5.6x版,使用菜单[File]-[New]-[Library],然后在建库对话框中给出LibraryName。
在我们的联系中,建议大家对于前仿真、综合后的仿真和后仿真分别建立不同的库;在本例中,我们建立两个库,名字分别为qian和zhong对应前仿真和综合后的仿真。
7.编译文件
使用工具栏上的编译按钮
,弹出如图11所示编译对话框。
图11编译对话框
图中
(1)为库的选择,意思是当前编译操作的结果存放的地方。
如果是前仿真,那我们就把Library选为qian。
接着在\source子目录下找到adder.v,选中文件,按[Compile]按钮进行编译(双击文件也可以),然后在\test子目录下找到测试文件t_adder.v编译。
在编译过程中,如果有错误,会在modelsim主窗口中显示错误信息;文件被修改后要重新存盘和编译。
编译完成后,按[Done]关闭编译窗口。
在modelsim主窗口左边的workspace中,选择qian这个库,会发现里面多了两个子项:
adder和t_adder。
库中列出的子项实际上是编译过的module的名字;
8.双击t_adder子项,将测试模块Load到仿真环境中主窗口变为如图12所示:
图12LoadDesign
如果Load过程中没有错误,将会在workspace窗体中显示当前仿真环境中被仿真对象的层次结构;使用菜单[View]-[Signal]弹出signal窗口;signal窗口中显示的信号是当前workspace中层次结构中被选中的那个模块内部的信号;这使我们在仿真中不但可以观察顶层模块中的信号波形,而且可以观察被调用模块内部的变量;使调试跟加方便。
9.在signal窗口中用鼠标选择需要观测的信号,然后使用菜单[view]-[wave]-[selectedsignals]就可以把选中的信号添加到Wave(波形观察)窗口,如图13所示:
(如果是modelsim5.6版,可以在选中信号之后直接用鼠标右键菜单添加信号)
(也可以使用主窗口菜单[View]-[Wave]先把Wave窗口弹出,然后将signal窗口中的信号拖到Wave窗口)
图13Wave窗口
几个常用的工具按钮功能如下:
1:
打开*.do文件
2:
保存*.do文件。
当添加好信号之后,可以把当前Wave窗口中信号排列顺序、显示方式等信息保存为一个*.do文件;下次对相同模块进行仿真时可以用
(1)打开这个文件。
3.添加光标。
所谓光标就是图中那条蓝色的竖线。
可以添加多条光标并且可以测量两条光标间的时间长度;
4.删除当前光标
5.向前移动当前光标到当前选中(高亮)信号的前一个跳变点
6.向后移动当前光标到当前选中(高亮)信号的下一个跳变点,5,6可用于查找所关心的信号变化点
7.波形在时间轴上放大
8.波形在时间轴上缩小
9.放大选择的区域。
先单击此按钮,然后在波形图中拉开一个区域,系统将放大此区域到整个窗口。
10.显示全部波形。
单击此按钮后,系统会将全部仿真波形压缩(时间轴)到窗口中显示
11.重新开始仿真
12.开始仿真(runall),不会停止仿真直到用户按下停止仿真(13)按钮或执行到$stop或$finish等系统任务。
13.停止仿真
若要开始仿真,单击按钮12,调整放大比例,得到图14。
图14波形
可以选择某个信号如图,然后鼠标右键菜单[Radix]可以选择当前信号显示的方式。
缺省显示的方式为二进制。
10.综合后的仿真
综合后的仿真步骤同前仿真相同(7,8,9),只是在编译(7)文件的时候,要选择库zhong,然后编译altera子目录下的adder.vm文件。
当然也要编译test子目录下的测试文件t_adder.v
综合后仿真完成后,可以将信号变化时刻的波形放大,可以观测到输入到输出信号的延时和延时造成的竞争冒险。
11.使用maxplusII进行布局布线,和产生后仿真模型(*.vo)文件
运行maxplussII打开问件altera\adder.edf,然后单击工具按钮
把当前文件设为当前工程。
再单击
,弹出编译窗口,弹出后选择菜单[Interfaces]-[VerilogNetlistWriter],单击start开始处理,完成后,在\altera目录下会产生两个*.vo文件;
在modelSim中创建一个后仿真库hou,将两个vo文件和测试文件在此库中进行编译。
其他仿真步骤同综合后的仿真。
使用maxplussII导出的*.vo文件可能会将moduleadder的输入输出管脚大小写改变,造成在modelsim中load仿真模块时出错,如果这样,可以用编辑工具打开adder.vo文件,检查是那些管脚名被改动了,然后修改测试文件的模块调用语句,使其与vo文件中的端口名相同即可。
如果synplify的版本为7.0则maxplussII的版本必须为10.1
如果synplify版本为6.2x则maxplussII的版本可以为10.0