6.5 编译与仿真设计工程
编写代码完成之后,一个很重要的工作就是验证代码功能的正确性,这就需要对代码进行编译与仿真。编译主要是为了检查代码是否存在语法错误,仿真主要为了验证代码实现的功能是否正确。
编译和仿真设计工程在整个设计中占有很重要的地位。因为代码功能不正确或代码的编写风格不好对后期的设计会有很大的影响,所以需要花很多时间在设计工程的仿真上。
在这一节中将通过一个具体的实例来介绍如何对编译工程代码以及如何使用ISE自带的仿真工具ISESimulator进行仿真。
1.编译工程代码
编译主要是为了检测代码是否存在语法错误。在ISE下,源代码的编写是在HDL Editor下完成的,但在HDL Editor下没有专门用于编译代码的选项。不过在HDL Editor下完成代码的编写后,单击“保存”按钮,HDL Editor就会自动对代码进行编译。如果代码存在语法错误,就会在信息显示窗中显示出来,用户可以根据显示的提示,查找语法错误并修改。
如图6.17所示为在输写代码时忘记分号,保存后就会有提示信息。
当不存在错误时,提示信息就不会出现“Warning”。ISE下对于代码的编译功能并不是很强大,有很多错误是检测不出来的。例如在编写Verilog代码时,写case语句时漏写了end case语句,在HDL Editor下是检查不出来的。但这些错误在仿真或综合阶段是可以检测出来的,因此即使完成了编译没有错误,也一定要进行仿真,检查是否还存在其他的错误。
2.仿真设计工程
这里以一个具体的实例来介绍ISE下自带的仿真工具ISE Simulator的使用,代码参见本书实例代码。该例程的主要功能是根据拨码开关(sw)输入的值在数码管(seg_led)上显示相应的数值。
图6.17 编译后的出错提示
ISE Simulator的使用主要是借助于ISE的辅助设计工具HDL Bencher(测试激励生成器)来完成的。用户将VHDL源代码、Verilog源代码或ECS原理图等设计输入导入工程后,用户可以在图形界面下编辑测试波形,HDL Bencher可以根据用户编辑的测试波形自动生成测试激励文件,然后调用ISE中的ISE Simulator进行仿真。可见使用ISE Simulator进行仿真主要分两步。
(1)调用HDL Bencher,编辑测试波形,生成测试激励文件。
(2)调用ISE Simulator对工程文件进行功能仿真和时序仿真。
下面对实例做详细的介绍,具体步骤如下。
(1)启动HDL Bencher。
首先打开实例工程,选择“Project”/“New Source”,弹出新建资源的对话框,选择“Test Bench Waveform”,输入测试激励波形文件名,如图6.18所示。
单击“下一步”按钮为测试激励文件选择源文件,如图6.19所示,选择要测试的源代码,单击“下一步”按钮。
图6.18 新建测试测试激励波形文件 图6.19 为被测试的源文件对话框
单击“完成”按钮确认新建资源信息,HDL Bencher会自动启动。
(2)波形编辑。
HDL Bencher启动后首先出现如图6.20所示的时钟设置对话框。
图6.20 时钟设置对话框
如图6.20所示,时钟设置包括:时钟的高电平持续时间(Clock Time High)、低电平持续时间(Clock Time Low)、建立时间(Input Setup Time)和保持时间(Output Valid Delay),系统为单时钟(Single Clock)系统、多时钟(Multiple Clocks)系统以及仿真时间和单位。这里设置的仿真时间表示仿真将持续多长时间后自动停止。
如果设计存在异步时序(Asynchronous Signal Support),还要对异步时钟做相应的设置。这个设计中,只有同步时序,所以不选,与上表设置不一致之处请用户自行修改。设置完毕单击“OK”按钮后系统会自动生成时钟的波形,如图6.21所示。
图6.21 波形编辑界面
如图6.21所示,设置好时钟后,系统会自动生成时钟波形。在如图6.18所示的对话框中设置的“Initial Length of Test Bench”为1000ns,这里可以看到仿真在进行了1000ns后就自动停止了,双击“End Time”,会弹出如图6.22所示的对话框,可以对仿真时间进行修改。
在设置好时钟频率、时钟建立时间和保持时间后,如果要修改,选择“Test Bench”/“Rescale Timing”会弹出如图6.23所示对话框,可以对时钟设置进行修改。
图6.22 修改仿真时间对话框 图6.23 修改时钟设置对话框
这此设计中除时钟信号外,rst和sw[7:0]为输入信号,需要对rst和sw的波形进行编辑,编辑方法也比较简单,单击图中的蓝色区域就可以改变波形,根据仿真需要可任意设置波形,在这里设置仿真波形如图6.24所示。
图6.24 编辑波形图
波形图编辑完毕后,单击“保存”按钮,系统会为工程自动添加“test.tbw”文件。选中此文件,在当前资源操作(Process for Source)视窗中,可以看到“View Generated Test Bench As HDL”选项,如图6.25所示。
图6.25 生成测试激励波形文件后的资源视窗
双击此选项,系统就会根据设置的波形自动生成测试激励文件的源代码,如图6.26所示。
图6.26 系统根据编辑的波形生成的测试代码
(3)对设计工程进行功能仿真。
ISESimulator中提供了两种级别的仿真:功能仿真和布局布线后仿真,功能仿真可以验证代码功能的正确性,布局布线后生成的仿真时延文件包含的时延信息最全,不仅包含门延时,还包括实际布线延时,所以布线后仿真最准确,能较好地反映芯片的实际工作情况。
按上述步骤用HDL Bencher生成测试激励波形文件后,就可对设计工程进行仿真了,首先验证设计功能的正确性,先对工程进行功能仿真。
功能仿真时在工程资源(Sources in Project)视窗中选择波形文件(test.tbw),在当前资源操作(Process for Source)视窗中,双击Simulate Behavioral Model(如图6.25所示),得到功能仿真结果如图6.27所示。
图6.27 功能仿真结果
观察波形时,左上角有几个按键。单击可放置一条线,用于观查某一特定时刻的值。用于测量时间间隔。用于寻找前一个或下一个信号上升沿,主要用于在测量时间间隔时,定位测量直线。
另外,ISESimulator在仿真过程中会自动判断仿真过程中是否会有错误发生,如果有错误发生,会在TX_ERROR下显示出来,TX_ERROR会自动统计错误的个数并显示,并且在SimConsole信号视窗中显示正确的数值和实际仿真得到的数据,用户可根据这些信息,对源代码进行修改。
(4)布局布线后仿真。
功能仿真测试功能正确后,就可以按照ISE下FPGA的设计流程对工程进行综合及布局布线。布局布线后,就可以对工程进行布局布线后仿真。
布局布线仿真时在工程资源(Sources in Project)视窗中选择波形文件(test.tbw)。在当前资源操作(Process for Source)视窗中,双击Simulate Post-Place&Route Model(如图6.25所示),得到布局布线后仿真结果如图6.28所示。
图6.28 布局布线后仿真结果
如图6.28所示,布局布线后仿真结果与功能仿真结果相比,有了较大的延迟,这主要与代码中组合逻辑设置有关,在布局布线仿真后,由于加入了延时信息可能会造成功能的不正确,用户可以通过改写代码或添加相应的时序约束,来优化设计,布局布线后仿真在工程设计中占有很重要的地位,需要花很长时间来不断地仿真和优化设计。
3.小结
本节通过一个具体的实例介绍了ISE下自带仿真工具ISE Simulator的使用。ISE Simulator的特点是可以通过HDL Bencher在图形界面下编辑波形,不需要用户编写测试代码,使用方便。用户也可以在HDL Bencher下完成波形编辑生成测试代码后,调用ModelSim仿真。
通过这个例子,希望用户能够掌握ISE Simulator的基本用法,熟悉仿真的基本流程。仿真在FPGA的设计当中占有很重要位置,可以说设计者的大部分工作都是在做仿真,只有仿真结果达到要求了,才会映射到实际电路,然后在线调试。
在这里推荐大家自己编写测试激励文件。因为在一些复杂的设计当中,使用图形界面编辑激励波形是很难满足设计要求的,无法对工程进行完整的测试。
另外,ModelSim是一款功能很强大的仿真软件,支持混合仿真。在ISE下为ModelSim预留了接口,使用也很方便,目前应用比较广泛。在初始学习阶段可以使用ISE Simulator作一些简单的仿真,熟悉FPGA的设计流程,等熟练之后,建议在ModelSim下完成仿真。