第四章设计验证随着集成度的提高,系统的规模日益庞大且复杂。强壮的系统应有完备的验证作保障。验证工作量远大于系统设计工作量。验证工作的基本技术和方法。Page1目前,验证一般通过仿真实现本章节中,验证和仿真不加区分4.1验证概述Page2验证过程是证明设计正确的过程,验证的目的是为了保证设计实现与设计规范是一致的,保证从设计规范开始,经过一系列变换后得到的网表与最初的规范是一致的,整个变换的过程是正确的。4.1.1验证的概念Page34.1验证概述1.从自然语言表述的系统规范变换成完整的、可验证和无二义性的系统规范。2.从系统规范变换成可实现的模块设计规范。3.从模块设计规范变换成RTL及代码描述。4.从RTL代码通过综合工具变换成门级网表。5.从门级网表通过后端布局布线工具变换成具有延时信息的网表。FPGA设计可能包含的几个变换:Page44.1验证概述验证是一个多次重复的过程,是一个不断向期望结果靠近的过程。系统规范网表交换验证Page54.1验证概述验证和测试是ASIC设计流程中两个不同的环节。验证的目的则是为了确认设计符合设计规范,目前验证一般通过仿真实现。测试的目的是为了确认生产后的设计产品是否合格、正确,一般由加工厂家或封装测试厂家完成。4.1.2验证和测试(VerificationvsTest)4.1验证概述系统规范网表芯片电路设计生产验证(仿真)测试对物理器件高低电平的确认不属于本教材范畴对设计规范及功能的确认Page64.1验证概述传统的电子线路设计验证方法4.1.3Top-Down/Bottom-Up验证方法目前的电子线路设计验证方法逻辑设计、画电路图、搭建电路、测试验证借助EDA工具在计算机上进行RTL级设计和验证。Page74.1.3Top-Down/Bottom-Up验证方法Top-Down验证法1.系统级验证:根据系统规范对系统进行建模,并对建立的模型进行验证。2.功能验证:验证设计的RTL代码应符合系统规范。主要方法--功能仿真(形式化验证为辅)。3.门级网表验证:通过功能仿真或形式化工具检验RTL代码和综合后网表的是否相等。4.时序验证:验证综合后含有延时信息的网表时序是否满足要求。对于同步设计一般通过静态时序分析工具完成验证。Page84.1.3Top-Down/Bottom-Up验证方法Bottom-Up验证法1.模块级验证----验证模块的各种工作情况,保证每个单元的设计质量。2.子系统验证、系统级验证----分层次组装模块进行子系统验证直至完成系统级验证。备注:系统级验证,目标是验证整个设计的功能。验证主要集中在设计和外环境之间能否协调工作,包括一些极端情况、边界条件和错误处理等。Page9目前主流的两类“验证技术”:4.1.4验证技术(1)基于形式化的验证-----通过数学的方法,证明设计的功能是否与规范一致。等价性检验:比较两个设计是否完全等价。两个网表比较,网表与RTL代码比较模型检验:根据设计的RTL代码,提取有限状态机并穷举搜索设计状态空间,验证设计特性。模型检验工具:Cadence的FormalCheck、IBM的Sugar和Sypopsys的Vera局限性很大1、设计规模越来越大复杂2、模型检验所描述的特性有限4.1.4验证技术(2)基于TestBench的验证(目前主要的验证方式)Testbench——测试平台即:Testbench产生激励给被验证设计(DUV)或待测设计(DUT),同时检查DUV/DUT输出是否满足要求Page104.1.4验证技术被验证电路UUTSystemSPECTestBench(测试平台)测试输入激励输出响应TB结构模型1.黑盒验证法2.白盒验证法3.灰盒验证法解释:DUV/DUTDesignUnderVerificationDesignUnderTestTestbench功能:为DUV/DUT提供激励信号正确实例化DUV/DUT将仿真数据显示在终端或者存为文件,也可以显示在波形窗口用于分析复杂设计可以使用EDA工具,自动比较仿真结果与理想值。激励实例化DUT终端显示值、存成文件波形显示自动比较结果正确性4.1.5仿真工具1、仿真器仿真器是验证中最常用的工具。仿真器试图创建一个能够模拟真实设计的工作环境,使验证工程师和设计进行交互,在设计生产之前发现设计错误,以减少损失。之所以称为仿真器,是因为它们是真实状态的一种近似。Page11Page124.1.5仿真工具验证人员在仿真器中,通过testbench为设计提供输入激励(为电路建立模拟工作环境),仿真器通过一定方式与验证人员交互,将电路的输出状态随环境变化的信息反映给验证人员。业界常用的仿真器有:Cadence的NC-Verilog,Synopsys的VCS和Mentor的ModelSimPage134.1.5仿真工具最常见的和仿真器一起使用的验证工具。通过波形观察器的图形界面,设计人员可以直观地观察随时间变化的信号以及信号之间的相互关系,定位设计错误或测试文件的错误。2、波形观察器工具TB运行中即统计被测设计代码的测试覆盖情况,给出报告,验证者可依据此报告分析判断验证工作的完备性。几个主要覆盖分析方面:3、代码覆盖分析工具4.1.5仿真工具使用代码覆盖技术必须非常了解设计细节,通过代码覆盖分析工具了解哪些语句、路径已经被执行,那些表达式已经被执行,那些过程没有被触发等等,然后修改测试程序,提高代码覆盖率。提高覆盖率可以提高测试的完备性。语句覆盖路径覆盖表达式覆盖触发覆盖自动机覆盖Page154.1.6验证计划和流程随着设计规模的加大,验证工作量越来越大,制定验证计划或者《验证规范》是验证过程的一个重要环节,验证计划可以提高验证效率,减少验证的盲目性。制定《验证规范》在《系统设计规范》签收(signoff)后开始。Page164.1.6验证计划和流程应该注意:验证工程师应与总体设计师以及设计人员一起讨论整个设计功能、模块划分、接口方式等,详尽理解设计规范。在此基础上制定《验证方案》----确定需要验证的功能特性,确定验证策略,规划验证环境和验证程序的开发,确定整个验证所需的验证人员的数目,资源和时间等等。Page174.1.6验证计划和流程典型的验证流程《系统规范》SignOff制定《验证规范》审核验证规范《验证规范》SignOff建立验证平台创建TestBench调试、测试所有测试科目OKOverNoOKOK相应处理NoPage184.1.6验证计划和流程《验证方案》的要点(验证什么、如何验证)1.确定设计需要验证的特性(验证内容);2.确定验证策略---系统级/模块级,黑/白/灰盒式验证,激励产生策略,验证响应方式(观察法、记录法、自检查法),人员、设备、环境管理安排等。3.确定验证方法---具体验证的步骤和方法,如自顶向下/自下向上,激励的具体方式等。4.1.6验证计划和流程4.制作标准的测试组件和测试模板。5.个人编制相关部分的测试方案;6.编制、调试测试程序,进行系统测试。7.测试记录及分析,编制测试报告。回归测试:对发现问题修改后的设计重新测试。(1)确认修改是否正确(2)修改是否影响其他设计4.2功能验证所谓的“验证程序”----是对“待测电路”的输入序列和预期输出相应的代码集合。4.2.1验证程序(TestBench)的组成Testbench被验证设计DUV参考模型输出响应输入激励比较结果一个典型的验证程序模型4.2.1验证程序(TestBench)的组成一个典型的Testbench的六个组成部分:1.DUV(被验证的设计)---DesignUnderVerification,可能是RTL设计,也可以是网表。2.输入激励---产生DUV需要的各种输入信号。3.时序控制模块---产生TB和DUV所需的时钟信号。4.参考模块---产生预期信号(行为级编码模块/以验证过正确的设计)。5.诊断记录---相关信号变化情况的记录。6.断言检查器---对特定的信号形式检测。编写仿真激励:1、仿真激励与被测对象的连接模块实例的端口方式:(1)名称对应:将模块实例外部的信号直接对应于模块的端口名称。modulehalfadd(x,y,sum,cout);……endmodule名称对应halfaddu_halfadd_a(.x(ax),.y(ay),.sum(asum),.cout(acout));(2)位置对应:外部信号按照该模块端口声明的顺序一一对应。Halfaddu_halfadd_b(bx,by,bsum,bcout);2、使用initial语句和always语句通常主动产生激励用initial,被动检测响应用always。前者执行一次,后者不断重复执行。在initial中多次运行一个语句块,使用嵌入循环语句:while、repeat、for和forever。initialbeginforeverbengin…..endend条件发生时执行always@(posedgeclk)beginsiga=sigb……end3、时钟、复位写法(1)普通时钟信号//产生一个周期为10的时钟parameterFAST_PERIOD=10;regclk;initialbeginclk=0;forever#(FAST_PERIOD/2)clk=~clk;end用always产生一个周期为10的时钟parameterFAST_PERIOD=10;regclk;initialclk=0;always#(FAST_PERIOD/2)clk=~clk;(2)非50%占空比时钟parameterHi_time=5;parameterLo_time=10;regclk;alwaysbegin#Hi_timeclk=0;#Lo_timeclk=1;end由于clk0时刻未初始化,前5纳秒输出为x(3)固定数目时钟\\产生两个高脉冲parameterPulseCount=4,PERIOD=10;regclk;initialbeginclk=0;repeat(PulseCount)#(PERIOD/2)clk=~clk;end(4)异步复位信号parameterPERIOD=10;regRst_n;initialbeginRst_n=1;#PERIODRst_n=0;#(5*PERIOD)Rst_n=1;endRst_n为低有效,代码表示10ns时复位,复位延时50ns(5)同步复位:initialbeginRst_n=1;@(negedgeclk);//等待时钟下降沿Rst_n=0;#30;@(negedgeclk);//等待时钟下降沿Rst_n=1;end另一种同步复位initialbeginRst_n=1;@(negedgeclk);//等待时钟下降沿Rst_n=0;//复位开始repeat(3)@(negedgeclk);//经过3个时钟下降沿Rst_n=1;//复位撤销end4、利用系统函数和系统任务display在显示数据$display(“Addr:%b-Data:%d”,add,data);时序检查系统任务$setup(sig_d,posedgeclk,1);//若clk上升沿到达之前的1ns时间内sig_d发生跳变,则建立时间不足告警$hold(posedgeclk,sig_d,0.1);//若clk上升沿到达之后的0.1ns时间内sig_d发生跳变,则保持时间不足告警dato_out={$random}%256;从文本文件中读出和写入数据(类似C语言文件操作)搭建仿真环境单顶层的TestBench代码:moduletestbench;//测试平台顶层//时钟激励产生initialbengin…end//复位激励产生initialbegin…end//各种测试激励initialbengin…end//设计模块实例mpiu_mpi(.clk(clk),.rst_n(rst_n),.mpi_data(data),.mpi_add