您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 仿真验证与Testbench编写
1第5章仿真验证与Testbench编写5.1VerilogHDL电路仿真和验证概述5.2VerilogHDL测试程序设计基础5.3与仿真相关的系统任务5.4信号时间赋值语句5.5任务和函数5.6典型测试向量的设计5.7用户自定义元件模型5.8基本门级元件和模块的延迟建模5.9编译预处理语句5.10VerilogHDL测试方法简介本章小结2在VerilogHDL集成电路设计过程中,设计者完成RTL级描述后需要对设计进行设计确认。设计确认是设计者检查设计中是否包含缺陷的过程。在设计中,表述不清的设计规范、设计者的错误或者错误地调用了元件等都可能给设计带来缺陷。5.1VerilogHDL电路仿真和验证概述3因此,设计确认对于集成电路设计来说具有重要的作用。设计确认可以通过仿真和验证来完成。仿真和验证能确保设计的完整性、可靠性、实效性以及先进性。仿真,也可以称为模拟,是通过EDA仿真工具,对所设计电路或系统输入测试信号,然后根据其输出信号(波形、文本或者VCD文件)与期望值进行比较,来确认是否得到与所期望一致的正确的设计结果,从而验证设计的正确性。4在设计过程中,仿真是在综合之前完成的,这就是通常所说的行为级仿真、RTL仿真或前仿真。在RTL设计阶段只包含了时钟及其时序,并未包含门延迟和线延迟。因此,RTL仿真对于时钟来说是正确的,并且不用考虑竞争冒险、毛刺、建立和保持时间以及其它一些详细的时序问题,这样RTL仿真就具有较快的速度。验证是一系列测试平台的集合,是一个证明设计思路如何实现及保证设计在功能上正确的过程。验证在VerilogHDL设计的整个流程中分为4个阶段:5阶段1—功能验证;阶段2—综合后验证;阶段3—时序验证;阶段4—板级验证。其中前3个阶段是在PC平台上依靠EDA工具来实现的,最后一个阶段则需要在真正的硬件平台(FPGA、CPLD等)上进行,需要借助一些调试工具或者专业性的分析仪来调试,因此本书所介绍的验证仅限于在PC平台上运行的前3个阶段的验证。6在测试验证环节中,要求测试需具备高效、完备的特性。高效是指以最短的时间发现错误,从而能以最短的时间上市;完备是指发现全部的错误,要求测试需达到一定的覆盖率,包括代码的覆盖率和功能的覆盖率。目前常用的功能验证有三种:黑盒法、白盒法和灰盒法。71)黑盒法黑盒法就是把测试代码看做一个黑盒子,测试人员完全不考虑代码内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。验证人员在RTL级输入端施加激励信号,然后将输出值与期望值相比较,以验证设计的正确性。8黑盒法主要有两个优点:(1)简单。验证者无需了解RTL级设计的细节,只需根据规格说明书搭建Testbench(测试平台)。(2)易于实现验证和设计的独立性。由于验证者不了解RTL级设计细节,在搭建Testbench时不会受设计者思路的影响,因此能避免按RTL级设计者的实现思路来验证RTL级设计的情况。黑盒法的主要缺点是可观测性差。由于验证人员对内部的实现细节不了解,无法插入内部测试点,因此很难对错误进行迅速定位,在大规模设计中难以跟踪错误的根源。黑盒法一般适用于中小规模电路的验证。92)白盒法白盒法也称结构测试或逻辑驱动测试,它是按照RTL级代码内部结构进行测试,通过测试来检测RTL级代码内部实现是否按照设计规格说明书的规定正常执行,检验RTL级代码中的每条路径是否都能按预定要求正确工作。验证人员是在对内部的设计细节熟悉且能够对内部信号完全控制和观察的情况下进行验证的。白盒法的优点在于容易观察和控制验证的进展状况,可以根据事先设置的观测点,在错误出现后很快定位问题的根源。10其缺点则是需要耗费很长的时间去了解RTL级的实现细节,且难以实现设计与验证的分离,验证团队可能会受设计团队思路的影响,出现沿着设计思路去验证的现象,结果是无法证明设计的功能是否正确。113)灰盒法灰盒法是介于黑盒法和白盒法之间的一种测试方法。灰盒测试关注输出对于输入的正确性,同时也关注内部表现,但这种关注没有白盒法那样详细、完整,只是通过一些表征性的现象、事件、标志来判断内部的运行状况。在很多测试中经常会出现输出正确、内部错误的情况,如果每次都通过白盒测试来操作,效率会很低,因此可采取灰盒法。125.2.1Testbench及其结构在VerilogHDL中,通常采用测试平台(Testbench)方式进行仿真和验证。在仿真时,Testbench用来产生测试激励给待验证设计(DesignUnderVerification,DUV),或者称为待测试设计(DesignUnderTest,DUT),同时检查DUV/DUT的输出是否与预期的一致,从而达到验证设计功能的目的,如图5.2-1所示。5.2VerilogHDL测试程序设计基础13图5.2-1Testbench结构14应该指出的是,由于Testbench是一个测试平台,信号集成在模块内部,因此没有输入、输出。在Testbench模块内,例化待测设计的顶层模块,并把测试行为的代码封装在内,直接对待测系统提供测试激励。图5.2-2给出了一个典型的Testbench程序结构。15图5.2-2典型的Testbench程序结构16下面举例介绍测试程序中各模块的分布。例5.2-1T触发器测试程序示例。moduleTflipflop_tb;//数据类型声明regclk,rst_n,T;wiredata_out;//对被测试模块实例化TFFU1(.data_out(data_out),.T(T),.clk(clk),.rst_n(rst_n));17//产生测试激励always#5clk=~clk;initialbeginclk=0;#3rst_n=0;#5rst_n=1;T=1;#30T=0;18#20T=1;end//对输出响应进行收集initialbegin$monitor($time,T=%b,clk=%b,rst_n=%b,data_out=%b,T,clk,rst_n,data_out);endendmodule19图5.2-3T触发器的仿真波形20部分文本输出结果:0T=x,clk=0,rst_n=x,data_out=x3T=x,clk=0,rst_n=0,data_out=05T=x,clk=1,rst_n=0,data_out=08T=1,clk=1,rst_n=1,data_out=110T=1,clk=0,rst_n=1,data_out=121Testbench模块最重要的任务就是利用各种合法的语句,产生适当的时序和数据,以完成测试,并达到覆盖率要求。一般来讲,测试激励信号在initial语句块和always语句块中进行赋值,因此,与被测试模块的输入端口相连的输入激励信号定义为reg类型;与被测试模块输出端口相连的信号定义为wire类型,主要用于对测量结果的观察。22仿真因EDA工具和设计复杂度的不同而略有不同,对于简单的设计,特别是一些小规模的数字设计来说,一般可以直接使用开发工具内嵌的仿真波形工具绘制激励信号,然后进行功能仿真。另外一种较为常用的方式是,使用HDL(硬件描述语言)编制Testbench(仿真文件),通过波形或自动比较工具,分析设计的正确性,并分析Testbench自身的覆盖率和正确性。2324从图中可以清晰地看出Testbench的主要功能:(1)为DUT提供激励信号;(2)正确实例化DUT;(3)将仿真数据显示在终端或者存为文件,也可以显示在波形窗口中供分析检查;(4)复杂设计可以使用EDA工具,或者通过用户接口自动比较仿真结果与理想值,实现结果的自动检查。25前两点功能主要和Testbench的编写方法和风格(CodingStyle)相关,后两点功能主要和仿真工具的功能特性及支持的用户接口相关。仿真工具将在后面章节中详细介绍,本章所要论述的重点是如何编写规范、高效、合理的测试程序。Testbench设计好以后,可以为芯片设计的各个阶段服务。比如,对RTL代码、综合网表和布线之后的网表进行仿真时,都可以采用同一个Testbench。26编写Testbench时需要注意的问题:(1) Testbench代码不需要可综合性。Testbench代码只是硬件行为描述而不是硬件设计。Testbench只用于仿真软件中模拟硬件功能,不会被实现成电路,不需要具备可综合性。因此,在编写Testbench的时候,要尽量使用抽象层次较高的语句,不仅具备高的代码书写效率,而且准确、仿真效率高。27(2)行为级描述效率高。如前所述,VerilogHDL语言具备5个描述层次,分别为开关级、门级、RTL级、算法级和系统级。虽然所有的VerilogHDL语言都可用于Testbench中,但是行为级描述代码具有显著优势。①降低了测试代码的书写难度,测试人员不需要理解电路的结构和实现方式,从而节约了测试代码的开发时间。②行为级描述便于根据需要从不同层次进行抽象设计。在高层次描述中,设计更加简单、高效,只有在需要解析某个模块的详细结构时,才会使用低层次的详细描述。③EDA工具本身就支持Testbench中的高级数据结构和运算,其编译、运行和行为级仿真速度快。28(3)掌握结构化、程式化的描述方式。结构化的描述有利于设计维护。由于在Testbench中,所有的initial、always以及assign语句都是同时执行的,其中每个描述事件都是基于时间“0”点开始的,因此可通过这些语句将不同的测试激励划分开来。一般不要将所有的测试都放在一个语句块中。295.2.2测试平台举例为了验证设计模块功能的正确性,需要在Testbench中编写信号激励给设计模块,同时观察这些激励在设计模块中的响应是否与设计目标值一致。图5.2-5中给出了一个DUT的仿真平台。测试平台需要产生时钟信号、复位信号和一系列的仿真向量,观察DUT的响应,确认仿真结果。30建立Testbench进行仿真的流程分为编写仿真激励、搭建仿真环境、确认仿真结果三个步骤。为一个设计建立仿真平台,将这个设计在该平台中实例化,然后将在平台中产生的测试激励输入给设计模块,再观察DUT的响应是否与期望值相同。下面介绍组合逻辑电路和时序逻辑电路测试仿真环境的搭建。31图5.2-5DUT仿真平台321.组合逻辑电路仿真环境的搭建组合逻辑电路的设计验证,主要是检查设计结果是否符合该电路真值表的功能,因此在搭建组合逻辑电路仿真环境时,用initial语句块把被测电路的输入按照真值表提供的数据变化作为测试条件。组合逻辑电路的特点决定了仿真中只需对输入信号进行设计即可,没有时序、定时信息和全局复位、置位等信号要求。33例5.2-2搭建全加器的仿真环境。全加器真值表如表5.2-1所示。用VerilogHDL编写的全加器程序代码如下:moduleadder1(a,b,ci,so,co);inputa,b,ci;outputso,co;assign{co,so}=a+b+ci;endmodule34表5.2-1全加器真值表abcisoco000011110011001101010101011010010001011135根据全加器的真值表(表5.2-1)编写的全加器测试程序如下:moduleadder1_tb;wireso,co;rega,b,ci;adder1U1(a,b,ci,so,co);//模块实例化initial//测试信号产生begina=0;b=0;ci=0;#20a=0;b=0;ci=1;#20a=0;b=1;ci=0;36#20a=0;b=1;ci=1;#20a=1;b=0;ci=0;#20a=1;b=0;ci=1;#20a=1;b=1;ci=0;#20a=1;b=1;ci=1;#200$finish;endendmodule37在源程序中,把全加器的输入a、b和ci定义为reg型变量;把输出so和co定义为wire型变量;用模块实例化语句“adder1U1(a,b,ci,so,co);”把全加器设
本文标题:仿真验证与Testbench编写
链接地址:https://www.777doc.com/doc-3966542 .html