第十章 EDA设计的仿真和测试
主要内容 对仿真的概念进行了简单说明 以Modelsim6.3se版本为例,重点介绍了Modelsim软件的使用方法。
10.1 仿真简介 仿真是指在软件环境下,验证电路的行为和设计意图是否一致。 简化的仿真验证系统框图如下: DUT 测试内容 TestVector 测试向量 DUT 测试内容 Testbench 测试模板 仿真系统软件、硬件运行 比较判断输出、存储结果
10.1 仿真简介(续1) 仿真与验证主要包括3个方面的内容: 第一是仿真系统的组织原则,主要是如何有效的测试目标系统的理论和方法; 第二是测试模板与测试向量的设计; 最后是仿真工具的使用。 一般来说,仿真分为三种类型,即功能仿真、综合后功能仿真和时序仿真,分别对应于设计输入后、综合完成后、布局布线完成后等步骤,这些步骤也是仿真的切入点。
10.1 仿真简介(续2) 1、功能仿真 功能仿真也称为前仿真,主旨在于验证电路功能是否符合设计要求,其特点是不考虑电路门延时与路径延时,考察重点为电路在理想环境下的行为和设计构想是否一致。 可综合FPGA仿真代码是用RTL级代码语言描述的,功能仿真的输入是设计的RTL代码,也就是HDL源文件与Testbench.。 2、综合后仿真 综合后仿真的主旨在于验证综合后的电路结构是否与设计意图相符,是否存在歧义综合结果。 综合后仿真的输入是从综合得到的一般性逻辑网表抽象出的仿真模型和综合产生的延时文件,综合时的延时文件仅仅能估算门延时,而不包含布线延时信息,所以延时信息不十分准确。
10.1 仿真简介(续3) 3、时序仿真 时序仿真也称为布局布线后仿真或者后仿真,是指电路已经映射到特定的工艺环境后,综合考虑电路的路径延时与门延时的影响,验证电路的行为是否能够在一定时序条件下满足设计构想的功能。 时序仿真主要目的在于验证电路是否存在时序违规,其输入为从布局布线抽象出的门级网表、Testbench以及扩展名为SDO的标准延时文件。 一般来说,时序仿真是必选步骤,通过时序仿真能检查设计时序与FPGA的实际运行情况是否一致,确保设计的可靠性和稳定性。
10.2 Modelsim简介 Modelsim是一种第三方EDA仿真工具。 Modelsim仿真工具是Model公司开发的,它支持Verilog、VHDL以及两者的混合仿真,可以将整个程序分步执行,它在程序执行的任何步骤任何时刻都可以查看任意变量的当前值,可以查看某一单元或模块的输入输出的连续变化等。 其主要特点是仿真速度快,仿真精度高,而且支持VHDL、Verilog HDL以及两者的混合使用,是目前业界最流行最通用的仿真器之一。
10.2.1 Modelsim的图形用户界面 Modelsim 6.3软件在默认的条件下提供了主窗口、源文件窗口、信号窗口、波形窗口、数据流窗口、进程窗口、存储器窗口、列表窗口等不同窗口,如下图。
10.2.1 Modelsim的图形用户界面(续1) 主窗口:主窗口main在Modelsim启动时直接打开,是其他窗口运行的基础。 源文件窗口:源文件窗口source主要用来显示和编辑HDL源文件代码。 波形窗口:波形窗口是最常用的窗口之一,主要是用来查看仿真结果。 数据流窗口:数据流窗口Dataflow是一般仿真软件都提供的一个通用窗口,通过该窗口可以跟踪设计中的物理连接、事件的传播,也可以用来跟踪寄存器、网线和进程等,极大的丰富了调试方法并对其进行显示,也可以显示设计中的内部连接。 列表窗口:列表窗口使用表格的形式显示仿真结果。 进程窗口:进程窗口显示了仿真中用到的所有进程列表。 信号窗口Object主要是用来选择需要查看的信号,同时可以在仿真过程中强制某一个信号的值发生变化,也可以通过信号窗口的Edit/Force和Edit/Clock命令将任意信号强制转化成时钟信号。 寄存器窗口Memory可以显示设计中寄存器的内容。使用此窗口可以通过加载源文件或改变存储器内容的方式对设计中的存储器进行初始化,同时窗口中的内容也可以保存成一个存储器文件,以便日后使用。
10.2.1 Modelsim的图形用户界面(续2) 在Modelsim的主窗口的工具栏中常用快捷键图标的功能如下表:
10.2.2 Modelsim仿真步骤 Modelsim仿真步骤分为以下5步: (1)建立库; (2)映射库到物理目录; (3)编译源代码,包括所有的HDL代码和Testbench; (4)启动仿真器并加载设计顶层; (5)执行仿真 注:本章主要介绍在界面模式下modelsim的使用方法
10.2.2 Modelsim仿真步骤(续1) 1、建立库 仿真库是指存储已经编译设计单元(design units)的目录。Modelsim中仿真库可以分为工作库(Working)和资源库(Resource)两大类。 建立仿真库的常用方法有两种:一是在界面模式下,执行主菜单命令File/New/Library,打开 Create a New Library对话框,选择第一项生成一个新库并映射它,如右图图所示。二是在命令行模式下也可以在主窗口执行vlib命令建立新库,语法格式如下: Vlib<library_name>
10.2.2 Modelsim仿真步骤(续2) 2、映射库到物理目录; 映射是将已经编译好的设计单元映射为一个库,库路径内的文件应该是已经编译好的。 常用操作方法有两种:一是 在界面模式下,执行主菜单命令 File/New/Library,打开Create a New Library对话框,选择第二 项映射已经编译好的库,单击 browse按钮选择所已经编译好 的库,如右图所示;第二种方法 是命令模式下主窗口执行vmap命 令,语法格式如下: Vmap<logical_name><direcetory_path>
10.2.2 Modelsim仿真步骤(续3) 3、编译源代码 GUI图像界面模式下编译文件的快捷方式是建立一个工程,在工程中添加所要编译的文件,然后执行主窗口的Compile子菜单中的各种命令或者是右键单击工程中的文件执行Compile的不同命令。 如果编译的是VHDL源文件,其编译顺序由文件的排列顺序决定,如果是Verilog源文件,其编译顺序也是由文件的排列顺序决定,但文件编译的顺序并不重要。
10.2.2 Modelsim仿真步骤(续4) 4、 启动仿真器并加载设计顶层 (1)执行主 菜单中的命令 Simulate/ Start Simulate 打开仿真对话 框,指定需要 仿真的设计单 元,然后点击 OK,如图所示
10.2.2 Modelsim仿真步骤(续5) 4、 启动仿真器并加载设计顶层 (2)在主窗口中出 现Object窗口,右键单 意信号,选择add to wave/ signals in region 或者是右键选中sim 窗口中加载的顶层设 计名,选中add to wave, 就可以打开波形窗口, 并将所有信号都加载 到波形窗口当中 。 如右图所示。
10.2.2 Modelsim仿真步骤(续6) 5、 执行仿真 执行主菜单命令下的Simulate/Run,选中相应的 选项来执行仿真,也可以选中使用等快捷键按钮来进行仿真 ,仿真结果将会显示在Wave窗口中。
10.2.3 Modelsim功能仿真 在本节中,用一个简单的计数器设计实例来演示功能仿真的具体操作流程,此处使用的QuartusII版本为7.2。步骤如下: 1、新建一个名为counter的文件夹,在QuartusII新建一个同名工程,选择合适的器件。在此例中选择的目标芯片为CycloneIIEP2C35F672C6N。 2、计数器的HDL源文件可以在Modelsim中编写,也可以在QuartusII中编写或者利用MegaWizard生成的IP核以及直接调用LPM等方式生成。在这里选择利用MegaWizard生成的简单的IP核作演示使用,在定制中生成的IP核的语言选择VHDL。
10.2.3 Modelsim功能仿真(续1) 生成后的 IP核如下图所示
10.2.3 Modelsim功能仿真(续2) 3、回到QuartusII主窗口,点击Project选项卡,选择add/Remove Files in Project;点击添加刚生成的counter.vhd文件到工程中,添加后如下图所示。至此,HDL源文件创建完毕。
10.2.3 Modelsim功能仿真(续3) 4、编写测试文件Testbench。 先建立一个新的工作库如work。Testbench文件可以在Modelsim中新建的VHDL(或verilog)文档编辑页面中进行编辑,同样也可以在QuartusII中新建一个VHDL(或Verilog)空白模板来编写。 除了直接编写测试文件,Modelsim还提供了很多Testbench模板,可以直接调用以减少工作量,但前提是设计的顶层HDL源文件已经编译到工作库当中 。 5、映射库到物理目录,编译源文件。
10.2.3 Modelsim功能仿真(续4) 6、新建一个仿真工程。 使用工程可以简化编译和仿真的操作。 在Modelsim的主窗口中选择File/New/Project,设置工程名并向工程中添加文件,设置如下二图。 设置完成后编译所有文件。
10.2.3 Modelsim功能仿真(续5) 7、启动仿真仿真器加载顶层文件。指定仿真的设计单元为测试文件counter_tb 8、执行仿真,仿真结果如下图:
10.2.4 综合后仿真 综合后仿真的步骤和功能仿真的前面四步相同,从第五步开始,操作如下: 10.2.4 综合后仿真 综合后仿真的步骤和功能仿真的前面四步相同,从第五步开始,操作如下: 1.在工作库work下建立一个工程project_zh,方法和功能仿真中建立prtoject_gn相同; 2.工程中需要添加的文件有顶层设计文件counter,测试文件counter_tb和由QuartusII编译生成的网表文件; 在QuartusII中编译生成的网表文件方法如下: 选中QuartusII主窗口中的Assignments/EDA tools settings在弹出来的对话框如图10.28; 双击对话框中的Simulate弹出下一页对话框如图10.29所示。在tool name中选Modelsim,输出语言为VHDL,Output directory中可以设置文件的输出路径,此处指定为counter文件夹; 点击More Setting...,在弹出来的对话框如图10.30,选中 Generate netlist functional simulate only,在set后的栏内选中on,点击OK保存; 在QuartusII中编译顶层设计文件ounter.vhd,编译完成后在counter文件中能看到一个名为counter.vho的文件,此文件就是综合后仿真所需要的网表文件;
10.2.4 综合后仿真(续1) 图10.28 打开EDA tools settings 图10.29 设置网表输出项目
10.2.4 综合后仿真(续1) 图10.30 设置网表输出项目
10.2.4 综合后仿真(续2) 3.启动仿真器,加载仿真文件counter_tb,进行仿真,观察仿真波形。本次需要Altera仿真库的元件库cycloneII,如果资料库中没有,则需要加载该库。 仿真结果如下:
10.2.5 时序仿真 时序仿真的步骤跟综合后仿真大致相同,所不同的是添加的文件不完全一样。其具体步骤如下: 10.2.5 时序仿真 时序仿真的步骤跟综合后仿真大致相同,所不同的是添加的文件不完全一样。其具体步骤如下: 1、在工作库work下建立一个工程project_shx,方法和功能仿真中建立prtoject_gn一样; 2、工程中需要添加的文件有顶层设计文件counter,测试文件counter_tb、QuartusII中编译生成的网表文件和延时文件_vhd.sdo; _vhd.sdo文件的生成可以参考综合后仿真中网表文件的生成方法,所不同的是在图10.30的设置中将Generate netlist functional simulate only置为“off”,点击OK保存设置,回到QuartusII主窗口后编译文件,编译完成后,在counter文件夹下面能看到一个名为counter_vhd.sdo文件,这个文件就是综合后仿真所需要的延时文件。
10.2.5 时序仿真(续1) 3、启动仿真器,加载仿真文件counter_tb,进行仿真。加载文件如下左图所示 。在左图对话框中Libraries中可以指定仿真所缺少的库文件,在SDF中指定延时文件。在SDF栏中点击Add,在弹出来的Add SDF Entry对话框中指定counter_chd.sdo文件,Apply to Region的“/” 右边填入被测试的程序名称,本例中为DUT,整个波形仿真的设置完成,如下右图所示。 加载仿真顶层文件 加载延时文件
10.2.5 时序仿真(续2) 时序仿真结果如下:
10.2.6 Altera仿真库的添加 Modelsim仿真中会调用四种常用的仿真库: (1)lpm,调用lpm元件的设计仿真时需要; (2)altera_mf,调用MagaFunction的设计仿真时需要; (3)primitive,调用altera的原语(primitive)设计仿真时需要; (4)元件库,例如cycloneII元件库,在仿真中必用的特定型号的FPGA/CPLD的库。 前三种库是调用了相应的Altera设计模块进行设计时,仿真所必备的库,元件库则是进行时序仿真时不可缺少的资源库。
10.2.6 Altera仿真库的添加(续1) 以新建一个lpm库为例,Altera仿真库的添加步骤如下: 1、新建一个文件夹altera_lib,用来存放Altera编译后的库文件,文件夹的位置最好是在 Modelsim的安装目录下; 2、打开Modelsim软件, 新建一个名为lpm的Library, 在Library Physical Name里 面输入lpm库存放的路 径,点击OK,如图所示;
10.2.6 Altera仿真库的添加(续2) 3、将lpm仿真原型文件编译到lpm库中。 点击Modelsim主窗口中的Compile/Compile,在Library里面选中lpm,然后 在QuartusII安装目录下的 …\quartus\eda\sim_lib文 件里选中仿真原型文件220pack.vhd和220model.vhd文件,点击Compile,编译完成后点击done.
10.2.6 Altera仿真库的添加(续3) 完成以上步骤一个lpm库就建立好了,进行仿真时根据需要在仿真器的Library中点击Add可以直接添加,如下图所示。如果使用Verilog语言,编译时只需要编译200model.v文件即可。
10.2.6 Altera仿真库的添加(续4) 按照同样的方法可以添加其他3个库,编译的文件如下: 1、altera_mf库: 在VHDL中先编译altera_mf_components.vhd文件,后编译altera_mf.vhd文件,而在Verilog中则只编译altera_mf.v文件; 2、Primitiv库: 在VHDL中先编译altera_primitive_components.vhd文件,后编译altera_primitive.vhd文件,而在Verilog中只编译altera_primitive.v文件; 3、元件库,如cycloneII库: 在VHDL中先编译cycloneii_atoms.vhd文件,后编译cycloneii_components.vhd文件,而在Verilog中只编译cycloneii_atoms.v文件;如果是其他系列的元件库则只要把对应的cycloneii改成其他系列的名称即可,如cyclone库则文件改为cyclone_atoms.vhd、cyclone_components.vhd或cyclone_atoms.v。
10.2.6 Altera仿真库的添加(续5) 4、 修改初始化文件Modelsim.ini Modelsim.ini是一个只读文件,右键点Modelsim.ini文件选择“属性”,去掉“只 读”,然后双击打开文件,可以看到文件的内容。 $MODEL_TECH/../指的是Mdelsim的安装目录,也可以直接写成新建库的保 存路径,如G:\modesim63\...。 在[Library]和 [vcom]加上类似的的语句如下: [Library] std = $MODEL_TECH/../std ieee = $MODEL_TECH/../ieee …… primitive = $MODEL_TECH/../altera_lib/primitive cycloneii = $MODEL_TECH/../altera/vhdl/cycloneii altera_mf = $MODEL_TECH/../altera/vhdl/altera_mf lpm = $MODEL_TECH/../altera/vhdl/220model [vcom] 保存文件,恢复为只读属性。
10.2.6 Altera仿真库的添加(续6) 至此,Altera仿真库完全建立好了。打开任一工程或设计,在Library窗口中都可以看到新添加的库文件,仿真时不需要再添加这些库, 如右图所示。
本章小结 本章重点介绍了EDA设计中仿真验证的概念和Modelsim仿真工具,