服务热线
400-032-5918
一、FPGA设计仿真验证简介
严格来说,FPGA设计验证包括功能仿真、时序仿真和电路验证,分别对应整个开发过程的每一步。仿真是指使用设计软件包对实现的设计进行全面测试,模拟实际物理环境。
功能模拟是指只对逻辑功能进行模拟测试,找出实现的功能是否满足原设计的要求。模拟过程不包括特定设备的时序信息和硬件特性,如延迟特性等。,所以也叫预模拟。它模拟了HDL硬件描述语言的功能实现,以保证HDL语言描述能够满足设计者的初衷。
在HDL能够满足设计者功能需求的基础上,时序仿真就是提取器件延迟、连接延迟等相关时序参数信息。布局布线后,而基于此的仿真也称为后仿真,是一种接近器件真实工作状态的仿真。
二、仿真软件ModelSim及其应用
HDL仿真软件有很多种,如VCS、VSS、NC-Verilog、NC-VHDL、ModelSim等。开发FPGA一般采用FPGA厂商提供的集成开发环境,都有自己的模拟器,如Xilinx公司的ISE,Altera公司的Quartus II等。但这些厂商开发的模拟器的仿真功能往往不如专业EDA公司,如ModelSim AE(Altera Edition)、ModelSim XE(Xilinx Edition)等。Quartus II具有第三方仿真工具的接口,可以直接调用其他EDA公司的仿真工具,大大提高了EDA设计的水平和质量。
ModelSim是Model Technology(Mentor Graphics的子公司)的HDL硬件描述语言的仿真软件。该软件可用于模拟设计的VHDL、Verilog HDL或两种语言的混合程序,还支持各种常见的IEEE硬件描述语言标准。
无论从用户界面和调试环境,还是从仿真速度和效果来看,ModelSim都可以算是业内优秀的HDL语言仿真软件。它是单片机内核中唯一支持VHDL和Verilog HDL混合仿真的仿真器,是FPGA/ASIC设计的RTL级和门级电路仿真的好选择。它采用直接优化编译技术、Tcl/Tk技术和单核仿真技术,具有仿真速度快、独立于仿真平台、保护IP核方便、错误程序定位更快等优点。
ModelSim有几个不同的版本:ModelSim SE、ModelSim PE、ModelSim LE和ModelSim OEM,其中SE、PE和LE是最高版本,编译速度是所有版本中最快的,而OEM版本是集成在FPGA厂商设计工具中的版本,专门与某厂商的FPGA配合使用。比如后来用的ModelSim AE就是专门为Altera公司QuartusII设计的OEM产品。
三、ModelSim的仿真过程
ModelSim不仅可以用于数字电路系统设计的功能仿真,还可以用于数字电路系统设计的时序仿真。在ModelSim的使用中,最基本的步骤包括五个步骤:创建项目、编译源代码、编译、启动模拟器和运行模拟。模拟流程如图1所示:
图1 ModelSIM仿真的基本过程(基于工程)
这个过程是基于工程的,另一个是基于库文件的。与基于工程的相比,它需要创建自己的工作库。此外,关闭ModelSim软件后,我们下次必须手动打开设计文件,但工程方面并非如此。项目始终处于被维护的状态,不需要每次都手动加载软件,除非我们自己关闭项目。还有另外两个过程,这里就不提了。详情请参考Modelsim AlteraTutorial.PDF。在软件安装目录的DOCS文件夹中,有所有的参考文档,包括用户手册等。
第四,测试平台程序的设计方法
随着设计数量和复杂性的增加,数字验证变得越来越困难,消耗的成本也越来越高。面对这一挑战,验证工程师必须依靠相应的验证工具和方法。对于大规模设计,如百万门的设计验证,工程师必须使用一套标准化的验证工具,而对于较小的设计,使用带有HDL Test Bench的模拟器是一个不错的选择。
一般来说,测试平台是用VHDL或Verilog HDL来描述的,这是行业标准。简单测试平台调用用户设计的功能模块,然后进行仿真。更复杂的测试平台还包括一些其他功能,例如包括特定的激励向量或比较实际输出与预期。
在编写测试平台之前,设计一个实例化的DUT(Design Under Test,即被测设备)并详细了解整个测试计划和测试用例是非常重要的。整个测试测试台环境如图2所示:
图2试验台的测试环境
从图中可以看出,测试台和被测对象计数器形成一个闭环。测试台负责向被测设备的输入端口提供激励(时钟)和一些控制信号(复位和设置信号)。此外,Test Bench还会监控被测设备输出端口输出的信号值是否符合我们的设计预期,并向我们显示监控情况。
由于测试台程序与被测对象形成闭环,测试台的输入端口需要与被测对象的输出端口相连,测试台的输出端口需要与被测对象的输入端口相连。因此,在端口的定义中,Test Bench程序需要对应被测对象。
被测组件是一个设计好的电路或系统,组件实例化语句用于将其嵌入程序中。VerilogHDL测试平台是一个带有输入输出端口的设计模块。被测元件的输入端定义为reg (register)类型变量,在always块或initial块中赋值(生成测试条件),被测元件的输出端定义为wire (wire net)类型变量,生成与输入变化对应的输出结果(波形)。
4.1组合逻辑电路测试台的设计
组合逻辑的设计验证主要是检查设计结果是否满足电路真值表的功能。因此,在编写组合逻辑测试平台时,可以根据真值表提供的数据作为测试条件,利用初始块改变被测电路的输入,从而实现测试平台的设计。
1.编写全加器的测试平台程序。
全加器的a和B是1位二进制加数的输入,CI是低位的进位输入,CO是高位的输出,SO是全加器的标准和。
接下来,我们使用ModelSim作为EDA平台对上述程序进行了仿真。本次讲座暂不谈模拟考试方法,留待下一讲详细阐述。本次讲座的主要内容是Test Bench程序的编写方法,所以现在只给出仿真波形图,全加器的仿真波形如图3所示:
图3一位全加器仿真波形图
现在,看着这张图片,让我们回到过去,看看我们编写的测试平台程序test_adder1.v做了什么,它是否按照我们的要求工作:
①首先看程序第二行的代码时标1ns/1ns/1 ns。这是一个时间刻度指令,用于定义模块的模拟时间单位和时间精度。其使用格式为“时间刻度模拟时间单位/时间精度”,用于描述模拟时间单位和时间精度的数字只能是1、10或100,不能是其他数字。单位可以是S、ms、us、NS、ps和fs。模拟时间单位是指模块模拟时间和延迟的基准单位,也就是说,程序中的延迟符号“#”只有在定义了模拟时间单位时才有意义,如程序中的一行# 20a = 0;b = 0;c = 0;前面的#20是20个时间参考单位的延迟。根据程序中1ns的基准,延迟20 ns。需要注意的是,这一行程序的下一行# 20a = 0;b = 0;c = 1;前一个20ns的延迟是相对于前一个延迟的,也就是说,第二行是在第一行完成后以20 ns的延迟执行的。此时看仿真的波形图不难理解为什么初始行是红色而不是正常的绿色,因为程序中begin的下一行是# 20a = 0;b = 0;c = 0;先前的20 ns延迟是相对于开始的延迟,也就是说,程序在开始时什么都不做,输出是一个不确定的值。将所有0分配给A、B和ci需要20 ns,这是绿线的初始部分。
②在TestBench程序中,全加器的输入A、B、ci定义为reg变量,输出so、co定义为wire变量,与被测组件的定义正好相反,这也说明Test Bench程序和被测组件是一个封闭循环。使用元素实例化语句加法器1u()。a (a),。b (b),。ci (ci),。所以。co(co));全加器设计电路嵌入到测试平台程序中。
③程序后面有一句# 200 $ stop这是一个系统任务,用于暂停模拟过程并将控制权归还给用户。用户获得控制权后,可以输入其他控制命令或查看仿真结果,然后从他暂停的地方恢复仿真过程。$stop有两种表达式,带参数和不带参数:
$ stop
$ stop(n);//n可以是0、1或2。
不带参数的$stop相当于$stop(0),暂停时不会输出任何信息;$stop(1)暂停时,输出当前模拟时间和程序中暂停的位置;$stop(2)不仅具有$stop(1)的功能,还可以输出模拟中占用的内存大小和CPU时间。
用于退出模拟过程的系统任务是$finish。当我们单击运行时,会询问我们是否要结束模拟。如果我们选择“是”,该系统任务将在仿真完成后关闭ModelSim软件。如果选择“否”,可以停留在模拟界面。
经过与全加器真值表的全部比较,发现与仿真波形完全一致,仿真结束。
4.2时序逻辑电路测试台的设计
时序逻辑电路测试台的设计要求与组合逻辑电路基本相同。主要区别是在时序逻辑电路测试平台的软件中,总是需要块语句来产生时钟信号。
例2写的程序是下节课的一个例子,用来讲解软件的所有操作流程和使用方法。在这节课中,首先,我们将分析这个程序及其匹配的Test Bench程序,看看它们是否能输出我们设计所期望的模拟结果。
2.编写8位加法器测试平台程序
图4八位加法器仿真波形图
现在,考虑到这张图片,让我们看看我们编写的test_counter8.v文件是否符合我们的设计要求:
①和组合逻辑的设计一样,我们应该在test_counter8.v中实例化被测元素counter8,并将8位加法器元素嵌入test _ Counter8.v的Test Bench中
②不同于组合逻辑,我们总是使用# 10 clk = ~ clk该语句用于生成周期为20个时间参考单位(1ns)的时钟(方波),即20ns的时钟信号。注意:时钟只能由always块产生,但时钟的初始值(如clk=0或clk=1)应在初始块中分配。如果没有设置时钟的初始值,模拟时钟输出会有一个未知的X(不变,是例1中的红线)。
③在初始块中产生复位信号和加载信号。注意:复位信号和负载信号必须赋值为初始值,否则会出现时钟初始值没有设置的问题。
④在初始块的begin语句开头设置相关初始值是一个好习惯。
对比test_counter8.v发现与仿真波形完全一致,仿真结束。
至此,第一讲结束,主要是关于Test Bench程序的编写方法。在下一讲中,我们将介绍ModelSim软件的用法。
模型仿真简介第二部分:功能仿真
本实验的目的是学习和掌握ModelSim环境下软件的一般仿真测试流程和仿真测试方法,学会编写简单的Test Bench程序并在ModelSim环境下进行调试。
实验步骤如下:
1.打开ModelSim软件,如图1所示:
图1打开软件
2.软件的启动画面如图2所示,进入界面后如图3所示:
图2软件启动屏幕
图3软件进入后的屏幕
注意:如果是第一次使用软件,进入后会出现一些不相关的对话框,比如软件的欢迎屏幕。不用担心,直接关闭即可,也可以选择下次登录时不显示。
3.进入ModelSim主窗口后,选择“文件”菜单下的“新建→项目”,新建一个项目。在弹出的对话框中,命名项目并指定存储路径,如图4所示:
图4新结构
这里,建议项目名称与您的顶级文件名一致。路径的注意事项已经提到,这里不再提及。默认库名为“work”,无需更改,只需点击“OK”。
4.之后,将弹出如图5所示的对话框,您可以选择是创建新文件还是添加现有文件。这两者都可以选择。如果文件已经提前编译,可以选择添加;如果没有,您可以创建一个新文件。在这里,在软件启动之前添加现有文件并编译使用的程序更方便。软件自带的编辑环境不是很好,建议使用第三方编辑工具。建议使用UltraEdit或Notepad++等专业代码编辑软件。
UltraEdit侧重于强大的功能和丰富的定制功能,而Notepad++更注重易用性。它们在常用功能上没有太大区别,可以根据自己的喜好选择一个。
图5向项目添加文件
在路径g下新建了两个文件: FPGA _ project modelsim counter 8,一个是counter8.v,一个是test_counter8.v前者是我们原来的设计文件,后者是它对应的模拟测试文件。在此路径的Windows目录中,右键单击以创建新的文本文档。在空空白处选择TXT格式,然后在此文件上右键单击UltraEdit或用记事本++编辑,启动相应的代码编辑工具进行编辑,注意保存在"。v "或"。vhd”格式。
这样,我们就在项目路径下建立了这两个文件。当然,创建这两个文件的工作可以在我们所有工作开始之前完成,不需要等到第四步开始。
5.将新创建的文件添加到项目中,点击“添加现有文件”显示如下图,如图6所示:
图6添加要测试的原始程序文件
单击“确定”继续添加另一个测试文件,如图7所示:
图7添加模拟测试文件
单击“确定”,然后关闭“向项目添加项目”对话框。最简单的方法是同时添加两个文件。点击“浏览”后,鼠标可以直接框选这两个文件,这样就可以一次将多个文件添加到ModelSim项目中。
6.我们已经可以在软件的项目区域看到我们添加的两个文件,如图8所示:
图8项目区域状态
我们现在可以编译这两个文件了。此时,由于文件尚未编译,“状态”列显示两个问号。然后在这个项目区点击鼠标右键,选择“编译→全部编译”,将HDL源文件编译到当前项目的工作库中。如图9所示:
图9编译源文件和模拟测试文件
如果我们在软件下面的抄本区域看到图10所示的单词,这意味着编译已经通过:
图10编译成功屏幕
请注意,中间两个成功的表示成功。此外,我们可以在“项目”区域的“状态”列中看到两个绿色记号,这也是成功编译的提示。
7.编译通过后,在项目区右键点击“添加到项目→仿真配置”,如图11所示:
图11添加模拟配置
打开“添加模拟配置”对话框右下角的“优化选项”,打开后切换到“选项”选项卡页面,在“优化级别”中选择“禁用优化”,如图12所示:
图12关闭优化选项
单击确定返回添加模拟配置对话框,关闭优化列中的启用优化,展开工作目录,选择测试平台文件test_counter8,然后保存。如图13所示:
图13关闭优化选项
此时,模拟配置文件:模拟1将出现在项目区域。双击它进入模拟。重启ModelSim后,也可以双击进入仿真,更加方便。
注意:如果不关闭优化选项,有时ModelSim软件会报错,无法正常模拟。
8.双击“模拟1”进入模拟波形界面,在对象区域右键选择“添加→到波→区域内信号”将待模拟信号添加到波窗口。如图14所示:
图14将待模拟的信号添加到波形窗口中
9.然后,我们将波形窗口中的两个信号量改为无符号数显示,方便我们观察。依次点击load_din和dout上的鼠标右键,按照图15的方法进行修改:
ModelSim仿真简介第3部分:时间序列仿真
第二讲提到,时间序列模拟在实际应用中并没有用到,但是为了保持模拟序列文档的完整性,我们还是写出了模拟的方法。
时间序列模拟的步骤比第二讲功能模拟的步骤多。本次讲座以当前quartusi 12.0 SP2版本和Cyclone IV ep4c 6 f 17 c 8为例,讲解时间序列模拟的方法和步骤。
时间序列模拟所需的文件如下:
(1)合成网表文件" *。vo“(如果Setting中的输出语言为VHDL,则生成的网表文件为“*”。vho”)。
(2)文件“*”。合成后生成工程延迟信息的“SDO”(VHDL语言也用于此目的)
③试验台程序文件
④ Altera的组件库
一般的流程是先在Quartus II中生成网表文件和延迟文件,然后调用ModelSim进行仿真。具体时序仿真步骤如下:
1.打开Quartus II软件,新建一个项目,然后新建一个文件counter8.v .将上节课的源文件Counter8.v复制到Quartus II项目目录中,并将文件添加到项目中。然后选择“设置”→“EDA工具设置”,在左栏选择“仿真”。设置如图1所示。
在第一列中选择ModelSim-Altera作为“工具名称”。
在第二列中,“输出网表的格式”选择您熟悉的语言,可以是VHDL或Verilog。后面的“输出目录”是您选择输出的网表文件和延迟信息文件的存储路径。一般可以选择默认。这种情况下,以后编译成功后,会在Quartus II的工程文件夹(本例为counter8文件夹)下生成一个simulation/modelsim文件夹,里面包含两个文件,。vo和。sdo,这将在未来使用。
再往下,您将看到“更多EDA网表编写器设置…”按钮,单击它并进入设置屏幕,设置如图2所示。注意是关闭了“生成功能仿真网表”项,从而生成我们想要的时序仿真文件。
图1模拟设置
图2莫雷达网表写入器设置的设置
完成所有设置后,单击“确定”退出设置,在QII的编译环境中执行完全编译。编译中的情况如图3所示:
图3编译中的情况
注意:下面比我们通常的完整编译多了一项“电子数据表作者”。图3中的红色箭头指向该位置。
2.找到新项目目录所在的文件夹,并在其中找到文件夹simulation/modelsim。您会发现文件夹中有10个文件,如图4所示:
图4生成的10个文件
注:counter8.vo和counter8_v.sdo是时间序列模拟需要的两个重要网表文件。它们只是和counter8_8_1200mv_85c_slow.vo和counter 8 _ 8 _ 1200mv _ 85c _ v _ slow . SDO命名不同,内容其实是一样的。最后两个是目前QuartusII新网表文件的命名方式。文件名表示速度等级(-8)、堆芯电压(1200mv)、温度条件(85℃)和时间序列模型(慢速)。
Altera之所以没有取消旧的命名方式,让QuartusII继续生成这两个网表文件,是因为TclScript文件是按照旧的命名方式编写的,需要与它们兼容。
下面的时间序列模拟以counter8.vo和counter8_v.sdo为例。如果需要快速时间序列模型进行模拟,也是按照下面的方法进行,只是将vo和sdo文件改为fast。
另外,这两个文件”。xrf“和”。sft”是QuartusII编译的一些相关信息文件,不能用于时间序列模拟。
3.打开ModelSim软件,创建一个新项目,如图5所示:
图5新项目和指定路径
(1)然后将刚才生成的两个文件counter8.vo和counter8_v.sdo复制到当前仿真项目的目录下。
②之后将一个非常重要的文件复制到quartusi: Quartus EDA sim _ lib的安装目录中,找到文件cycloneive_atoms.v,这是Altera设备库的库文件。时序仿真基于该库文件,并将其复制到仿真工程目录中。
注意:我们以Cyclone IV的EP4CE6F17C8为例,所以这里需要复制的是库文件cycloneive。如果是其他设备,需要相应选择。
③将test_counter8.v文件复制到这个模拟项目目录中。
④在QII安装目录中...altera 12.0 Quartus EDA Fv _ lib Verilog,将dffeas.v和dffep.v文件复制到这个仿真项目目录中。
4.完成以上步骤后,返回ModelSim软件界面,会发现软件还在刚才新建的项目中,需要我们为其项目对话框添加文件。然后我们可以添加文件,放“counter8.vo”、“cycloneive_atoms.v”、“test_counter8.v”、“dffeas.v”和“DFFEE”
图6添加了五个文件
注意:此时不需要添加文件counter8.v。vo文件可以替换它。
5.关闭“添加文件”对话框后,您可以看到我们在“项目”区域添加了五个文件。在该区域点击右键,点击“编译”→“全部编译”执行全部编译。
6.在项目区右键点击“添加到项目”->“仿真配置”添加仿真配置设置,直接弹出添加仿真配置对话框。在这里,我们需要进行以下设置:
(1)在“设计”选项卡下,展开作品前面的“+”号,点击test_counter8。这是测试平台文件。如图7所示:
图7设计选项卡的设置
(2)再次切换到“SDF”选项卡,点击“添加”进行添加。sdo“文件,还有这个”。sdo "文件会在浏览后直接出现。选择,并在下面的“应用到区域”中输入“U”。这是我们的测试平台程序中顶层文件的实例化名称。如图8所示:
图8软件开发框架选项卡的设置
然后选中以下两个SDF选项的复选框。如图9所示:
图9选择SDF选项的两个复选框
点击“确定”退出配置设置界面。配置的项目区域的内容如图10所示:
图10项目区内容
7.双击“模拟”执行模拟。以下步骤与功能模拟相同,在此不再赘述。仿真波形图如图11所示:
图11时序仿真波形图
从图11中,我们可以看到dout相对于主时钟clk具有明显的延迟,这与当前使用的器件的时序模型有关。
实践中可能会出现各种问题,ModelSim的正常运行也取决于仿真库文件的可用性。所以当一些项目在模拟中遇到错误时,您可能希望检查ModelSim的提示信息,看看是否有模拟所需的库文件没有添加。