FPGA设计技巧与案例开发详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4.4 基于Modelsim-Intel 10.5b的4位计数器仿真验证流程

到这里为止,我们已经完成了最基本的Quartus II逻辑电路开发。实际上,单纯地从FPGA电路综合来讲,我们已经完成了FPGA逻辑电路的设计,可以开始进行下载测试了。

但是,这并不是笔者推荐的方法,一个稳定的电路,必然是经过千锤百炼的,而每一次磨炼,就是不停地在仿真测试中优化升级,实现电路性能的最优化。因此,笔者并不单纯地讲解Verilog HDL的设计而不进行Testbench仿真验证测试,笔者认为测试极为重要,基于Modelsim的仿真测试,应该自始至终贯穿整个Verilog HDL的电路设计中。

4.4.1 关于FPGA设计的各种仿真概念分析

笔者曾讲过,在FPGA的设计中,大部分时间都会耗费在仿真方面,而仿真流程也可以细分为很多步骤。FPGA设计仿真流程主要如图4.35所示。

图4.35 FPGA设计仿真流程

1.前仿真

前仿真,即功能仿真。可使用专用于仿真的工具对设计进行功能仿真,以验证电路功能是否符合设计要求。通过功能仿真能够及时发现设计中的错误,从而加快设计进度,提高设计的可靠性。

2.综合后的仿真

把综合生成的标准延时反标注到综合仿真模型去,可估计门延时带来的影响,但是只能估计门延时,不能估计布线延时,仿真结果和实际情况还有一定的差距,并不十分准确。

综合后的仿真一般只在IC设计中用到,但由于目前综合工具比较成熟,大多数的软件能胜任综合工作,因此一般省去了此环节的仿真(在本书的基于Quartus II的开发中,没有进行综合后的仿真)。

3.布局布线后的仿真

布局布线后的仿真,即时序仿真。布局布线后生成的仿真延时文件最全,不仅包括门延时,还包括布线延时,因此最为准确,能较好地反映芯片的实际工作情况。

一般来讲,布局布线后的仿真必须进行,以确保设计的可靠性和稳定性,并可发现时序违规(Timing Violation)等时序错误,从而进一步对逻辑电路进行优化设计。

4.板级仿真

在某些高速设计的逻辑电路中,为了保证设计的稳定性与可靠性,还需要使用第三方板级验证工具进行仿真与测试,如MentorTau、Forte Design-Timing Designer、Mentor Hyperlynx、Mentor ICX、Cadence SPECCTRAQuest、Synopsys HSPICE。这些工具通过设计IBIS和HSPICE等模型的仿真,能较好地分析高速设计信号的完整性、电磁干扰(EMI)等电路特性。

5.在线仿真

在加载配置目标板之后,设计者在必要情况下要进行的一个步骤就是在线仿真调试,即利用Quartus II自带的SignalTap II在线逻辑分析仪进行通信分析,通过JTAG口在线、实时读取FPGA内部信号进行在线仿真,分析时序是否正确。

对于一般的FPGA逻辑电路开发,只进行功能仿真、时序仿真、在线仿真已经算得上非常完善。其中,功能仿真保证了逻辑实现的正确性,时序仿真保证了电路时序的收敛及布局布线的优化,而在线仿真并不是必需的。在某些应用开发中,仿真并没有那么轻松,如在USB的通信设计中。幸好Quartus II集成了SignalTap II在线逻辑分析仪,这使得我们能够实时观测信号来辅助验证设计,完善并优化电路。

在本书的所有例程设计中,并不像IC设计那样严谨,频率也不是很高(125MHz以内),因此只进行了功能仿真,用户在必要的时候再进行在线仿真,已完全能胜任后续的工作。

4.4.2 Modelsim版本的简要介绍

Mentor公司的Modelsim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,再加上其个性化的图形界面和用户接口,为用户加快调试提供了强有力的手段,是FPGA/ASIC设计的首选仿真软件。

Modelsim主要版本包括SE、PE、LE和OEM。其中,SE是最高级的版本。集成在Actel、Atmel、Altera、Xilinx及Lattice等FPGA厂商设计工具中的均是OEM版本。

Modelsim SE是主要版本号,也是功能最强大的版本,支持对Verilog和VHDL语言的混合仿真。除主要版本外,Mentor公司还为各大FPGA厂商提供OEM版本。例如,AE是为Altera公司提供的OEM版本,包含Altera公司的库文件;而XE是为Xilinx公司提供的OEM版本,包括Xilinx公司的库文件。在用特定公司的OEM版本进行仿真时不需要编译该公司的库文件,但是该版本的仿真速度等性能指标都要落后于SE版本。

在功能和性能方面,SE版本和OEM版本主要就是在仿真速度与代码量上有较大差别,一般SE版本比OEM版本快10倍左右。此外,针对Altera FPGA集成了元件库后推出的Modelsim,每个系列也有两个版本,区别如下。

(1)ASE:Altera Start Edition,是针对Altera FPGA元件库的Modelsim入门版本,有10万行代码量限制,可以免费试用。(2)SE:Altera Edition,是针对Altera FPGA元件库的Modelsim专业版,没有代码行数的限制,需要使用许可等支持才能使用。

本书并没有涉及上万行代码的大型FPGA电路设计,因此Modelsim ASE已经完全能胜任。本书采用免费的Modelsim-Intel 10.5b(ASE版本)。

4.4.3 Modelsim工程的创建

打开Modelsim软件,启动界面与打开后的环境如图4.36所示。Modelsim软件的功能非常简单,笔者使用最多的功能包括工程的建立、Testbench的编写、波形的仿真。使用Modelsim的仿真,采用Testbench来设计仿真激励,远比Quartus II自带的GUI Simulation高效、准确、方便得多。

图4.36 Modelsim启动界面与打开后的环境

(1)在Modelsim中单击菜单栏中的File,在弹出的窗口中选择“New”→“Project…”,如图4.37所示。

图4.37 创建步骤1

(2)创建工程,输入工程名为“Counter_Design_TB”,选择工程保存目录为建立Quartus II工程时已构架好的sim文件夹,如图4.38所示。

图4.38 创建步骤2

(3)由于在项目仿真中不只有一个仿真工程,所以在sim文件夹内还需再指定仿真的工程目录。笔者的设置如下:D:/Crazy_FPGA_Examples/01_Counter_Design/sim/Counter_Design_TB,并在弹出的选择是否新建目录对话框中选择“是”,如图4.39所示。

图4.39 创建步骤3

(4)复制需要仿真的Verilog HDL文件(Counter_Design.v)到Modelsim目录中,并且右键单击,选择“Add to Project-Existing Files…”,添加相关文件,如图4.40所示。并且在弹出的对话框中选择“Add Existing File”图标。

图4.40 创建步骤4

4.4.4 Testbench激励文件的编写

由于Modelsim环境对Verilog HDL的编辑而言不是很合适(笔者个人习惯),同时为了保证后期修改代码与仿真能够同步进行,所以笔者一般使用第三方编辑软件Notepad++、Sublime等进行编辑,这样能够保证测试代码在修改好后,可以直接再次进行编译和测试,从而解决了Modelsim的多个窗口难以协调的问题(以上仅为笔者的个人习惯,与软件性能无关)。

在本节中,笔者在Notepad++中设计了Testbench代码,其设计流程如下所示。

1.Testbench文件头的添加

与Verilog HDL的Coding一样,第一步并不是写module,而是新建Verilog HDL文件(Testbench文件遵循Verilog HDL文件格式)并添加文件头(对于这一部分,笔者在Verilog HDL的代码设计风格中有详细的阐述)。在这里,笔者修改了文件头的文件名、功能描述及版本等信息,如下所示。

/*------------------------------------------------------------------------------------------
                            \\\|///
                          \\  --  //
                          (  @@  )
+---------------------------------------oOOo-(_)-oOOo-------------------------------+
CONFIDENTIAL IN CONFIDENCE
This confidential and proprietary software may be only used as authorized
by a licensing agreement from CrazyBingo (Thereturnofbingo).
In the event of publication, the following notice is applicable:
Copyright (C) 2012-20xx CrazyBingo Corporation.
The entire notice above must be reproduced on all authorized copies.
Author                :    CrazyBingo
Official Websites         :   http://www.crazyfpga.com
Email Address           :   crazyfpga@qq.com
Filename              :   Counter_Design_TB.v
Data                  :   2013-10-14
Description             :   The testbench of Counter_Design.
Modification History      :
Data          Author      Version        Change Description
=======================================================
13/10/14       CrazyBingo   1.0            Original
---------------------------------------------------------------------------------------------
|                              Oooo                    |
+-----------------------------------------oooO--(   )----------------------------------+
                        (   )   )/
                          \(   (_/
                          \_)
--------------------------------------------------------------------------------------------*/
`timescale 1ns/1ns
module Counter_Design_TB;

endmodule

Testbench规定必须在仿真文件中指定时间精度,否则默认为1ps。笔者一般在新建Verilog HDL或Testbench的文件时,直接添加`timescale 1ns/1ns,这个时间精度较常使用,且能满足大部分情况的要求。

2.添加时钟、复位发生器电路

在Quartus II 9.1的Simulation的GUI界面,用户需要手动添加时钟、复位等信号的激励,如图4.41所示。

图4.41 Quartus II 9.1中的GUI激励添加方式

但在Modelsim仿真中,我们需要在Testbench中通过描述生成时钟信号和复位信号,如下所示。

//------------------------------------------
//clock generate module
reg clk;
reg rst_n;
localparam PERIOD=20;   //50MHz
initial
begin
    clk=0;
    forever   #(PERIOD/2)
    clk=~clk;
end

task task_reset;
begin
    rst_n=0;
    repeat(2) @(negedge clk);
    rst_n=1;
end
endtask

这里通过10ns之间的间隔“forever #(PERIOD/2)”来实现时钟的翻转。通过PERIOD指定实现了50MHz的频率。整个描述非常简单,同时Testbench也更加接近C语言,非常容易理解。相对于Verilog HDL而言,Testbench算是“单线程操作”,但它同时也适用于并行的Verilog HDL。

另外,通过repeat(2)实现电路时,是用2个时钟的低电平来产生整个电路的复位信号的(通过Task来模块化设计,在Testbench中更方便调用)。

3.例化目标仿真电路(在这里是Counter_Design)

正如Simulation中那样,需要指定顶层文件,来让仿真器知道需要进行分析的文件。在Testbench中,通过文件的例化,最终对顶层文件的电路进行分析,实现了整个电路的仿真。例化代码如下所示。

//----------------------------------------------
//the target component instantiation
Counter_Design   u_Counter_Design
(
    //global clock
    .clk       (clk),
    .rst_n     (rst_n),

    //user interface
    .cnt       (cnt)
);

4.激励信号的初始化

在Simulation中,通过GUI进行操作,默认信号为低;但在Modelsim中,信号默认为三态,需要指定电平才能实现信号的初始化。很多仿真失败的原因就是没有进行初始化。在本工程的仿真文件设计中,虽然没有信号需要初始化,但是“没有规矩,不成方圆”, Testbench架构的风格仍需要完善。此处的设计如下。

//---------------------------------------
//system initialization
task task_sysinit;
begin
end
endtask

5.Modelsim仿真的进程设计

这里编写的波形仿真的激励进程,主要包括Task的调用,数据的输入/输出,以及仿真时钟约束等。笔者在设计时,通常在之前模块化Task,然后在此处调用并执行任务调用。同时,这里没有进行仿真时间的指定(以便在波形仿真时动态进行调节改变)。当然,最基本的流程是系统复位→系统初始化→系统激励,如下所示。

//----------------------------------------
//testbench of the RTL
initial
begin
    task_sysinit;
    task_reset;
end

由于笔者用的是第三方Notepad++软件,所以在这里将编辑的文件另存到工程目录的sim文件夹下,然后在Modelsim中添加。文件导航如图4.42所示。

图4.42 Modelsim文件导航

4.4.5 Modelsim波形的仿真与分析

仿真设计流程如图4.43所示。我们已经完成激励信号的设计,同时,待测模块Counter_Design.v在4.4.4节中早就编写好了,因此在这里主要使用Modelsim进行波形的仿真与分析,最终得到预期的结果。波形的验证需要不断进行,直到修正后的待测模块与预期波形完全符合为止。

图4.43 Modelsim仿真设计流程

(1)进行全编译,完成Verilog HDL与Testbench文件的代码语法分析。为了更好地说明分析过程,笔者故意将Counter_Design_TB.v文件改错,编译后的结果如图4.44所示。

图4.44 编译后的结果

双击error,软件即弹出错误警告及指示,如图4.45所示。

图4.45 错误警告及指示

这与Quartus II编译器很类似,因此掌握编译错误的查看及修改技巧,能给Modelsim的使用带来巨大的便利。根据指示可知文件63行出现错误,回到Counter_Design_TB.v中,可以看到63行附近的60行是笔者故意删除的逗号,与错误相对应,如图4.46所示。

图4.46 源码中的错误

修改后再次进行编译,不再出现错误并且编译成功,如图4.47所示。

图4.47 Modelsim编译成功

(2)指定Testbench文件,添加信号,为仿真与分析做准备。

① 首先在菜单栏选择“Simulate”→“Start Simulation”,再选择目标仿真测试文件Counter_Design_TB,然后单击“OK”按钮,如图4.48所示。

图4.48 选择目标仿真测试文件

需要指定Testbench的原因是Testbench与Verilog HDL一样,也可以由顶层到底层来设计电路,这样用户就需要指定顶层文件。当调用Altera IP核时,需要另外添加库(笔者在后面会给出相关的指导,此处从简)。

② 在指定Tesebench仿真文件后,添加波形。指定Testbench后,会弹出Modelsim仿真界面窗口,如图4.49所示。注意,相应的功能窗口可以从菜单栏“View”中进行调用。

图4.49 进入Modelsim仿真界面

图4.49中sim目录中为仿真文件列表,其中顶层文件为Counter_Design_TB; Objects为当前模块下的输入/输出信号,当sim中指定不同的Verilog HDL或Testbench模块时,Objects列出当前文件下的所有信号,以便进行添加;Wave为波形观察窗口。

③ 重新编译,复位Simulation,对仿真进行修正,“Compile All”→“Restart”流程在仿真过程中修正代码如图4.50所示。

图4.50 “Compile All”→“Restart”流程在仿真过程中修正代码

可以在不退出Simulation的前提下进行代码修正,修正后进行“Compile All”(编译)→“Restart”(重启)即可。

④ 选择Objects中需要分析的信号,用鼠标右键单击,选择“Add Wave”添加信号,如图4.51所示。

图4.51 选择“Add Wave”添加信号

添加信号列表这一步与Quartus II很类似,即通过GUI添加信号,添加信号后的结果界面如图4.52所示。

图4.52 添加信号后的结果界面

在菜单栏中选择“Wave”→“Format”→“Toggle Leaf Names”或单击按钮,便可将图4.52所示信号的模块层次去除,只留下简洁的信号名,这样有助于分析,其效果如图4.53所示。

图4.53 去除信号的模块层次

(3)采用脚本进行仿真、复位、反复调试。

① 波形的仿真。

对于Modelsim的仿真,既可以在Testbench的编写中指定时间,也可以在Simulation启动后,手动添加仿真时间。笔者一般采用第二种方法。在这里,笔者在Transcript中输入了“run 1000ns”,仿真结果如图4.54所示。

图4.54 仿真结果

由于在Testbench中生成了20ns的时钟信号,所以1000ns为50个时钟周期,仿真与实际相符。Modelsim比Quartus II的Simulation更人性化的是,它支持仿真时间的实时延长,只需在Transcripts中输入“run xx ns”进行仿真即可。

② Modelsim工具栏中有缩放、插入光标等工具,在仿真中非常常用,如图4.55所示。熟练地运用这些工具,能大大降低调试的时间。

图4.55 Modelsim工具栏

同时,信号的输出格式与Quartus II的Simulation一样,支持不同格式的输出。当然,Modelsim默认为二进制输出格式。此处修改cnt为Hexadecimal(以下简称“Hex”)输出格式,如图4.56所示。

图4.56 修改输出格式为Hexadecimal

③ 缩放波形,添加光标,Counter_Design电路的输出Hex格式的仿真波形如图4.57所示。

图4.57 输出Hex格式的仿真波形

仿真共进行了1000ns,即50个时钟周期,复位耗费了2个时钟周期,剩下48个时钟周期恰好能完成4位加法器的3次循环,波形符合预期结果,仿真结果正确。

④ 另外,Modelsim也具有模拟波形输出的能力,设计信号输出为Analog(automatic)模式,输出Analog格式仿真波形如图4.58所示,可以更直观地观察cnt信号的输出为递增的周期信号。

图4.58 输出Analog格式仿真波形

该模式在进行类似DDS的设计仿真时非常有用。

⑤ 修改代码,重新编译,重启Simulation,再次观察波形。

这是笔者进行电路仿真的一般步骤。当仿真波形输出为非预期波形时,进行Verilog HDL电路的修改,再回到Modelsim进行一系列重复操作,直到得到预期波形为止,HDL仿真设计主要流程如图4.59所示。

图4.59 HDL仿真设计主要流程

有了Modelsim, FPGA的时序电路调试就会变成一个轻松而愉快的过程。通过可视化过程的仿真设计,同步脚本语言的辅助调试,在Bug分析中不断优化自己的设计,可以不停地实现量与质的飞跃,让设计变得更完善。掌握Modelsim的单步调试、脚本语言、文件操作等技巧,进行基于DUT的FPGA开发与Modelsim波形验证,能让开发变得更得心应手。

⑥ Modelsim工程的设置与波形的保存加载。

如果每一次进行Simulation时都要添加信号列表,那将会十分烦琐。Modelsim支持波形的保存,以便在下一次进行仿真时可以直接保存当前仿真信号列表wave.do,如图4.60所示。

图4.60 保存当前仿真信号列表wave.do

下一次打开Modelsim进行Simulation时,可以在菜单栏中选择“File”→“Load”→“MacroFile”,再选择上一次保存的wave.do。

Modelsim的工程文件类型就是mpf,新安装Modelsim时,文件名称暂不支持双击打开,但是可以通过打开文件方式来打开工程,如图4.61所示。需要注意的是,文件类型要选择为任何文件。

图4.61 打开Modelsim工程

如果对Modelsim安装目录熟悉,则可以手动指定打开方式,让mpf类型文件默认用Modelsim软件打开,打开方式如图4.62所示。这样,我们就可以直接打开Modelsim工程目录,再双击mpf类型文件打开工程了。

图4.62 手动指定工程打开方式

如果Modelsim工程在设计完成后修改了路径,则Modelsim会找不到原先指定的代码文件,如图4.63所示。

图4.63 找不到原先指定的代码文件

此时,用户需要删除丢失的文件,再次添加当前工程目录的文件,重新编译。重新添加文件后的界面如图4.64所示。

图4.64 重新添加文件后的界面

至此,4位计数器的逻辑电路仿真完毕,Modelsim的使用也介绍完毕。用户如果在仿真过程中修改了目标代码,则务必要同步更新到Quartus II工程中。