1)实验平台:正点原子MPSoC开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670
3)全套实验源码+手册+视频下载地址: [http://www.openedv.com/thread-340252-1-1.html]
Mentor公司的ModelSim是工业界最优秀的语言仿真器,它支持Windows和Linux系统,是单一内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、单一内核仿真,不仅编译仿真速度业界最快、编译的代码与平台无关,而且便于保护IP核。它还提供了最友好的调试环境,具有个性化的图形界面和用户接口,为用户加快调试提供强有力的手段,它是FPGA/ASIC设计的首选仿真软件。
本章包括以下几个部分:
55.1ModelSim的安装
5.2 ModelSim的使用
5.1ModelSim的安装
Modelsim有几种常见的版本:SE(System Edition)、PE(Personal Edition)和OEM(Orignal Equipment Manufactuce,即原始设备制造商),其中SE是最高级的版本,而集成在Altera、Xilinx以及Lattice等FPGA厂商设计工具中的均是OEM版本。我们这里选择使用的是功能最全的SE版本。
首先在DFZU2EG/4EV MPSoCDFZU2EG/4EV MPSoC开发板资料盘(B盘)→Modelsim文件夹下找到Modelsim的安装包文件(注意:由于光盘容量有限,我们将FPGA开发软件Vivado和仿真软件Modelsim放在B盘),文件列表如下图所示:
图 5.1.1 Modelsim安装包文件夹
双击运行“modelsim-win64-10.4-se.exe”文件,进入如图 5.1.2所示的modelsim软件的安装引导页面。
图 5.1.2 安装引导页面
我们直接点击【Next>】,进入如图 5.1.3所示页面。
图 5.1.3 选择安装路径
为了不占用系统盘空间和有条理的管理电脑安装的软件,这里我们不使用默认的安装路径,更改安装路径到D盘,如上图所示。
接下来点击【Next>】,弹出下图所示界面
图 5.1.4 创建安装目录
这是因为D盘下面没有该目录,所以我们点击“Yes”,创建该目录。然后进入下图所示界面。
图 5.1.5 协议认同
选择“Agree”,进入下图所示页面。
图 5.1.6 自动安装过程中
现在处于安装过程,在安装的过程中会出现两次信息提示框,第一次提示是否在桌面建立快捷方式,点击“Yes”,如下图所示:
图 5.1.7 桌面建立快捷方式
第二次提示是否将Modelsim可执行文件放入Path变量,选择“Yes”时可以从DOS提示符执行Modelsim,这里我们选择“Yes”,如下图所示:
图 5.1.8 添加Modelsim到Path变量
安装完成后进入下图所示界面,大致内容为:如果你有License,请选择“No”,选择“Yes”将会为Modelsim-64使用的HW安全key安装一个软件驱动,如果你不确定你电脑上的驱动是否适用于此版本,选择“Yes”会重启电脑完成整个安装。这里因为有License,所以选择“No”,当然了如果经过整个的指导操作还是使用不了,不妨卸载了选择“Yes“试试,一般选择“No“是没问题的。
图 5.1.9 安装硬件安全Key驱动
进入下图所示界面,选择“Done”完成整个安装。
图 5.1.10 完成安装
如果没有License或没有正确安装License,打开Modelsim时,结果如下:
图 5.1.11 未安装License时结果
使用Modelsim软件需要添加License,请多多支持正版。至此,Modelsim安装完成。
5.2ModelSim的使用
安装完ModelSim软件之后,接下来我们再来介绍一下ModelSim的使用流程。在介绍ModelSim的使用流程之前,我们先看一下典型的FPGA设计流程,流程图如下:
图 5.2.1 FPGA的设计流程
从上图可以看到,在设计输入之后,设计综合前进行RTL级仿真,称为综合前仿真,也称为前仿真或功能仿真。前仿真也就是纯粹的功能仿真,主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟。在完成一个设计的代码编写工作之后,可以直接对代码进行仿真,检测源代码是否符合功能要求。这时,仿真的对象为HDL代码,可以比较直观的观察波形的变化,在设计的最初阶段发现问题,节省大量的精力。
在布局布线后进行的仿真称为布局布线后仿真,也称为后仿真或时序仿真。时序仿真可以真实地反映了逻辑的时延与功能,综合考虑电路的路径延迟与门延迟的影响,验证电路能否在一定时序条件下满足设计构想的过程,是否存在时序违规。
接下来我们说一下ModelSim软件的使用,ModelSim的使用主要分为两种情况,第一种就是直接使用ModelSim软件进行仿真,也就是手动仿真;第二种情况就是通过其它的EDA工具如Vivado调用Modelsim进行仿真,这种情况也就是我们通常所说的自动仿真或者联合仿真。不管是手动仿真还是自动仿真,它们都遵循以下5个步骤:
1)新建工程。
2)编写Verilog文件和Testbench仿真文件。
3)编译工程
4)启动仿真器并加载设计顶层
5)执行仿真。
当我们执行了仿真以后,ModelSim软件会根据我们的设计文件和仿真文件生成波形图,最后,我们观察波形并判断设计的代码功能是否正确。前仿真完成以后,接下来我们就可以根据需要进行后仿真了,后仿真与前仿真的步骤大体相同,只不过中间需要添加仿真库、网表和延时文件等步骤。一般而言,对于时序要求不严格的小规模设计,我们一般只进行功能仿真。
功能仿真需要的文件:
6)设计HDL源代码:可以使VHDL语言或Verilog语言。
7)测试激励代码,也被称为TestBench:根据设计要求输入/输出的激励程序,由于不需要进行综合,书写具有很大的灵活性。
8)仿真模型/库:根据设计内调用的器件供应商提供的模块而定,如:FIFO、ADD_SUB等。
5.2.1手动仿真
说完了ModelSim的使用流程,接下来我们将对每个流程进行详细的操作演示,一步步、手把手带领大家学习使用ModelSim软件。首先我们讲解的是ModelSim手动仿真,对Modelsim有个基本的认识。
在第八章我们使用Vivado创建了LED灯闪烁的工程,现在我们使用Modelsim对该工程进行Modelsim的手动仿真。在此需要说明的是因为我们的DFZU2EG/4EV MPSoC开发板的PL端系统时钟是一对差分信号,在代码中是使用IBUFDS(差分输入缓冲器)如图 8.4.2所示原语将差分时钟信号转换成单端时钟信号使用的,但是ModelSim是无法识别FPGA的IBUFDS的,所以在使用ModelSim仿真时,我们只使用一对差分时钟其中的一个信号作为系统时钟信号,并将工程的IBUFDS模块注释掉。修改后的led_twinkle.v代码如下所示:
5.2.1.1建立Modelsim工程并添加仿真文件
首先在LED灯闪烁的“sim_1”文件夹下新建文件夹“new”,然后启动Modelsim软件,我们直接双击桌面上的Modelsim软件图标,打开Modelsim软件,在Modelsim中选择File->Change Directory,如下图所示:
图 5.2.2更改目录
在弹出的对话框中选择目录路径为刚才新建的new文件夹。
在modelsim中建立project,选择File->New->Project,如下图所示:
图 5.2.4编辑工程名和路径
在“Project Name”栏中填写工程名,这里的命名方式,我们建议大家最好根据仿真的文件来进行命名,时间久了,当我们记不得这个仿真工程是用来仿真什么的时候,我们看到这个工程名,就能够知道它是用来做什么的了。这里我们把工程命名为“tb_led_twinkle”,也就是在LED灯闪烁模块名“led_twinkle”前面添加“tb_”。“Project Location”是工程路径,可以根据需要把工程保存到不同的位置。因为前一步骤更改目录的时候已经做了选择,所以这里保持默认即可。下面这两部分是用来设置仿真库名称和路径的,这里我们使用默认即可。设置好工程名、工程位置,我们点击【OK】按钮,弹出如下图所示界面:
图 5.2.5添加和创建工程文件
我们可以从该图的选择窗口中看出,它共有四种操作:Create New File(创建新文件)、Add Existing File(添加已有文件)、Create Simulation(创建仿真)和 Create New Folder(创建新文件夹)。这里我们先选择“Add Existing File”(添加已有文件),如下图所示:
图 5.2.6添加工程文件
在该页面我们点击“Browse”按钮选择“led_twinkle.v”文件,其他的保持默认设置,最后点击【OK】按钮。
5.2.1.2建立TestBench仿真文件
我们选择“Create New File”(创建新文件),如下图所示:
图 5.2.7创建工程文件
在“File Name”栏中输入文件名“flow_led_tb”,与工程名一致。“Add file as type”栏中选择文件类型为“Verilog”类型,点击【OK】按钮,然后我们再关闭【Add items to the Project】对话框。此时可以看到,两个文件“flow_led.v”和“flow_led_tb.v”添加至我们的ModelSim仿真工程中,如下图所示。
图 5.2.8成功添加工程文件
双击“tb_led_twinkle.v”文件,弹出下图所示界面:
图 5.2.9编写测试代码
在其中编写TestBench仿真代码如下:
1 `timescale 1ns / 1ps
2
3 module tb_led_twinkle();
4
5 reg sys_clk_p;
6 reg sys_rst_n;
7
8 wire [1:0] led;
9
10 initial begin
11 sys_clk_p = 1'b0;
12 sys_rst_n = 1'b0;
13 #200
14 sys_rst_n = 1'b1;
15 end
16
17 always #5 sys_clk_p = ~sys_clk_p;
18
19 led_twinkle u_led_twinkle(
20 .sys_clk_p (sys_clk_p),
21 .sys_rst_n (sys_rst_n),
22 .led (led)
23 );
24
25 endmodule
图 5.2.10保存测试代码
为了让读者能够更好的理解,这里我们就简单介绍一下TestBench源代码。进行仿真首先要规定时间单位,我们建议大家最好在Testbench里面统一规定时间单位,不要在工程代码里定义,因为不同的模块如果时间单位不同可能会为仿真带来一些问题。代码的第1行的timescale是Verilog语法中的不可综合语法,用于定义仿真的时间单位和精度,此处表示仿真的单位时间为1ns,精度为1ns。代码的第3行就是TestBench的模块名定义,其中第6行至第10行是我们的数据类型定义,到了第12~18行是信号的初始化,第21行是时钟信号的生成。第23到28行是被测模块的调用。
接下来我们就需要编译我们的仿真文件。
在开始编译之前,有一点需要注意,我们在Vivado软件中实现的功能是LED灯闪烁效果,它的间隔时间是0.5s,如果我们想要仿真这个功能,那么我们仿真软件运行时间最低就是0.5s。这0.5s在我们看来是很短很短的,而对仿真软件来说是很漫长的,毕竟我们的仿真时间单位可是1ns。为了便于我们仿真,这里我们需要稍微改动一下“led_twinkle.v”文件的代码,将计时器cnt的最大计时值设为10,如下图所示,方框中注释的代码即为修改的位置。
图 5.2.11修改源文件
要记得这是在仿真的时候修改的哦,在仿真结束后是要改回来的,接下来我们开始编译。
5.2.1.3编译仿真文件
编译的方式有两种:Compile Selected(编译所选)和Compile All(编译全部)。编译所选功能需要先选中一个或几个文件,执行该命令可以完成对选中文件的编译;编译全部功能不需要选中文件,该命令是按编译顺序对工程中的所有文件进行编译。我们可以在菜单栏【Compile】中找到这两个命令,也可以在快捷工具栏或者在工作区中的右键弹出的菜单中找到这两个命令。下面我们单击Compile All(编译全部),如下图所示。
图 5.2.13编译完成
文件编译后“Status”列可能会有三个不同状态。除了上图的用“√”表示的通过状态外,还有两个在设计中不希望出现的状态:编译错误(显示红色的“×”)和包含警告的编译通过(对号的后面会出现一个黄色的三角符号)。编译错误即Modelsim无法完成文件的编译工作。通常这种情况是因为被编译文件中包含明显的语法错误,Modelsim会识别出这些语法错误并提示使用者,使用者可根据Modelsim的提示信息进行修改。编译结果中包含警告信息是一种比较特殊的状态,表示被编译的文件没有明显的语法错误,但是可能包含一些影响最终输出结果的因素。这种状态在实际使用中较少出现,这类信息一般在功能仿真的时候不会带来明显的影响,不过可能会在后续的综合和时序仿真中造成无法估计的错误,所以出现这种状态时推荐读者也要根据警告信息修改代码,确保后续使用的安全性。
5.2.1.4配置仿真环境
编译完成后,接下来我们就开始配置仿真环境,我们在ModelSim菜单栏中找到【Simulate】→【Start Simulation…】菜单并点击,弹出如下右图所示页面。
图 5.2.14开始仿真
从配置仿真功能页面中我们可以看出,该页面中包含6个标签,分别是:Design、VHDL、Verilog、Libraries、SDF和Others。对于这6个标签,我们用的最多的是Design、Libraries和SDF这三个标签了,下面我们就来简单的介绍一下这3个标签,其余的标签我们一般用不到,这里我们就不再进行介绍了。
首先看一下Design标签,该标签内居中的部分是Modelsim中当前包含的全部库,可展开看到库中包含的设计单元,这些库和单元是为仿真服务的,使用者可以选择需要进行仿真的设计单元开始仿真,此时被选中的仿真单元的名字就会出现在下方的Design Unit(s)位置。Modelsim支持同时对多个文件进行仿真,可以使用Ctrl和Shift键来选择多个文件,被选中的全部文件名都会出现在Design Unit(s)区域。在Design Unit(s)区域的右侧是Resolution选项,这里可以选择仿真的时间精度。在Modelsim进行仿真的时候,有一个最小的时间单位,这个单位是使用者可以指定的,如最小单位是1ns,仿真器在工作的时候按1ns为单位进行仿真,对小于1ns发生的信号变化不予考虑或不予显示。因而这个最小时间单位也就是仿真的时间精度。这个选项一般都是设置在默认状态,这时Modelsim依照仿真设计文件中指定的最小时间刻度来进行仿真,如果设计文件中没有指定,则按1ns来进行仿真。最下方的区域是Optimization区域,可以在仿真开始的时候使能优化。接下来我们来看一下Libraries标签,如下图所示。
图 5.2.15 Libraries标签
在该标签中,我们可以设置搜索库。Search Libraries和Search Libraries First的功能基本一致,唯一不同的是Search Libraries First中指定的库会在指定的用户库之前被搜索。现在我们来看一下SDF标签,如下图所示。
SDF是Standard Delay Format(标准延迟格式)的缩写,内部包含了各种延迟信息,也是用于时序仿真的重要文件。SDF Files区域用来添加SDF文件,可以选择Add按钮进行添加,选择Modify按钮进行修改,选择Delete按钮删除添加的文件。
图 5.2.16 SDF标签
SDF Options区域设置SDF文件的warning和error信息。第一个“Disable SDF warning”是禁用SDF警告,第二个“Reduce SDF errors to warnings”是把所有的SDF错误信息变成警告信息。区域Multi-Source delay中可以控制多个目标对同一端口的驱动,如果有多个控制信号同时控制同一个端口或互连,且每个信号的延迟值不同,可以使用此选项统一延迟。下拉列表中可供选择的有三个选项:latest、min和max。latest选项选择最后的延迟作为统一值,max选项选择所有信号中延迟最大的值作为统一值,min选项选择所有信号中延迟最小的值作为统一值。
至此,这三个标签我们就介绍完了,接下来我们在Design标签页面中选择work库中的flow_led_tb模块,在Optimization一栏中取消勾选(注意一定要取消优化的勾选,否则无法观察信号波形),然后点击【OK】就可以开始进行功能仿真了,其余标签页面中的配置我们使用默认就可以了,如下图所示。
图 5.2.17 Design窗口选项
点击【OK】后弹出下图所示界面:
图 5.2.18 Sim窗口
鼠标右键单击“u_led_twinkle”,选择“Add Wave”选项,如下图所示:
图 5.2.19添加查看的信号
弹出下图所示界面,可以看到信号已经添加到窗口中。
图 5.2.20信号添加到仿真窗口
我们选择仿真时间为1ms,如下图所示,单击右边的运行按钮。
图 5.2.22仿真结果
为了方便大家更容易观察波形,我们这里将会对ModelSim软件中几个常用小工具进行简单的讲解。
图 5.2.23常用小工具
前面的几个放大镜模样的工具是放大、缩小和全局显示功能,鼠标放到图标上会显示出它们的快捷键,后边的黄色图标是用来在波形图上添加用来标志的黄色竖线,紧跟着的是将添加的黄色竖线对齐到信号的下降沿和上升沿。利用上述工具出来,可以看到在仿真结果中,可以看出,cnt每计数到4和10,两个led的电平状态就切换一次。证明我们的HDL设计达到了我们想要的功能。
图 5.2.24结果局部波形图
到这里手动仿真的步骤就给大家介绍完了,最后再提醒大家一句,我们在仿真一些复杂的工程的时候往往需要对工程里的IP核进行仿真,当我们需要对IP核进行仿真时一定要事先将IP核的库文件加载到Modelsim库中去。
对Vivado带IP核的工程仿真需要在Modeslim工程中添加文件仿真库,整体操作比较复杂,我们推荐按照第四章中Vivado软件的安装和使用中第四小节在Vivado中进行功能仿真,利用Vivado设计套件内部集成的仿真器Vivado Simulator,能够在设计流程的不同阶段运行设计的功能仿真和时序仿真,结果可以在Vivado IDE集成的波形查看器中显示。