第11章FPGA设计验证.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第11章设计验证设计验证随着IC集成度的不断提高,系统的规模日益庞大且复杂。验证成为了整个ASIC/FPGA设计流程中的一个瓶颈问题。(目前一个SOC设计中,验证工程师的人数是设计工程师的2倍左右,验证工作占到整个设计的60~70%,而验证代码,则占到了全部代码70~80%左右)验证工作量远大于系统设计工作量。验证和测试是ASIC设计流程中两个不同的环节。验证的目的则是为了确认设计符合设计规范,目前验证一般通过仿真实现。在本课程中验证和仿真不加区分。测试的目的是为了确认生产后的设计产品是否合格、正确,一般由加工厂家或封装测试厂家完成。验证和测试(VerificationvsTest)验证过程是证明设计正确的过程,验证的目的是为了保证设计实现与设计规范是一致的,保证从设计规范开始,经过一系列变换后得到的网表与最初的规范是一致的,整个变换的过程是正确的。验证的概念1.从自然语言表述的系统规范变换成完整的、可验证和无二义性的系统规范。2.从系统规范变换成可实现的模块设计规范。3.从模块设计规范变换成RTL级代码描述。4.从RTL代码通过综合工具变换成门级网表。5.从门级网表通过后端布局布线工具变换成具有延时信息的网表。FPGA设计可能包含的几个变换:1.如设计规范是否正确,有无矛盾之处?2.设计人员是否正确理解了设计规范,模块设计是否正确地反映了其功能?模块之间的接口是否正确?3.包含有延时信息的网表的时序是否满足要求?验证过程需要解决的问题验证是一个多次重复的过程,是一个不断向期望结果靠近的过程。从规范到网表之间的变换包含了许多问题传统的电子线路设计验证方法目前的电子线路设计验证方法逻辑设计、画电路图、搭建电路、测试验证随着HDL语言的广泛使用和EDA工具的快速发展。为了设计和验证更复杂的系统,硬件设计工程师在硬件设计中借助于软件工程的经验和研究方法形成了适合高层RTL级描述的硬件系统的设计和验证方法。验证方法Top-Down/Bottom-Up验证方法Top-Down验证法1.系统级验证:根据系统规范对系统进行建模,并对建立的模型进行验证。2.功能验证:验证设计的RTL代码应符合系统规范。主要方法--功能仿真(形式化验证为辅)。3.门级网表验证:通过门级仿真或形式化工具检验RTL代码和综合后的网表是否相等。4.时序验证:验证综合和布线后含有延时信息的网表时序是否满足要求。对于同步设计一般通过静态时序分析工具完成验证。Top-Down/Bottom-Up验证方法Bottom-Up验证法1.模块级验证----验证模块的各种工作情况,保证每个单元的设计质量。2.子系统验证、系统级验证----分层次组装模块进行子系统验证直至完成系统级验证。备注:系统级验证,目标是验证整个设计的功能。验证主要集中在设计和外环境之间能否协调工作。目前主流的两类“验证技术”:验证技术基于形式化的验证-----通过数学的方法,证明设计的功能是否与规范一致。基于TestBench的验证(目前主要的验证方式)----Testbench“利用HDL语言编写的用于验证设计的输入激励序列代码,也就是验证程序”,它实际上就相当于一个测试平台。基于TestBench的验证被验证电路UUTSystemSPECTestBench(测试平台)测试输入激励输出响应TB结构模型1.黑盒验证法设计被当成一个黑盒子,对设计人员而言不知道内部设计细节,根据设计规范,验证设计是否符合规范。黑盒验证可以发现下面类型的错误:初始化和中止错误;接口错误;性能错误;未实现的或实现不正确的功能。由于缺乏可观测性和可控性,黑盒验证很难发现隐藏在设计内部的错误。TB结构模型设计规范输入激励测试文件输出相应DUT白盒验证法2、白盒验证法:根据设计的内部细节进行验证,这种方法为设计提供了很好的可控性和可观测性,这种方法有时可称为结构验证法。由于知道设计的内部细节,因此,很容易产生特殊情况的激励,易于检测内部设计的错误,验证环境的建立相对明确、简单,具有较强的针对性,结果检查相对来说也简单一些。白盒测试法的缺点就是验证人员要知道设计内部的细节。3、灰盒验证法:灰盒验证是介于白盒和黑盒验证法之间的一种验证方法。验证人员在既关心规范需求的同时又关心电路的详细设计方案,需要依据两者制定验证方案。如同黑盒验证方法,灰盒验证方法通过顶层接口控制和观察整个设计,但是又需要验证一些重要的特定的设计细节。在一个设计中,通常是这三种方法结合起来一起使用。验证工具1、仿真器仿真器是验证中最常用的工具。仿真器试图创建一个能够模拟真实设计的工作环境,使验证工程师和设计进行交互,在设计生产之前发现设计错误,以减少损失。之所以称为仿真器,是因为它们是真实状态的一种近似。验证人员在仿真器中,通过testbench为设计提供输入激励(为电路建立模拟工作环境),仿真器通过一定方式与验证人员交互,将电路的输出状态随环境变化的信息反映给验证人员。业界常用的仿真器有:Cadence的NC-Verilog,Synopsys的VCS和Mentor的ModelSim验证工具是最常见的和仿真器一起使用的验证工具。通过波形观察器的图形界面,设计人员可以直观地观察随时间变化的信号以及信号之间的相互关系,定位设计错误或测试文件的错误。2、波形观察器工具当一个设计的所有测试程序仿真都正确,设计中是否还存在某些功能或功能组没有得到验证呢?哪些设计没有被验证到?覆盖分析工具可以回答这个问题。几个主要覆盖分析方面:3、代码覆盖分析工具使用代码覆盖技术必须非常了解设计细节,通过代码覆盖分析工具了解哪些语句、路径已经被执行,那些表达式已经被执行,那些过程没有被触发等等,然后修改测试程序,提高代码覆盖率。语句覆盖路径覆盖表达式覆盖触发覆盖自动机覆盖验证计划和流程随着设计规模的加大,验证工作量越来越大,制定验证计划(《验证方案》)是验证过程的一个重要环节,验证计划可以提高验证效率,减少验证的盲目性。验证工程师应与总体设计师以及设计人员一起讨论整个设计功能、模块划分、接口方式等,在此基础上制定《验证方案》验证计划的内容:确定设计需要验证的特性(验证内容);确定验证策略---系统级/模块级,黑/白/灰盒式验证,激励产生策略,验证响应方式(观察法、记录法、自检查法)。确定验证方法---具体验证的步骤和方法,如自顶向下/自下向上。确定验证的质量标准:如功能覆盖率、代码覆盖率等。确定验证资源和其它的相关问题:包括人力资源、机器资源和软件资源等,也包括验证过程的质量跟踪等方面的问题验证流程典型的验证流程《系统规范》SignOff制定《验证规范》审核验证规范《验证规范》SignOff建立验证平台创建TestBench调试、测试所有测试科目OKOverNoOKOK相应处理No所谓的“验证程序”----是对待测电路的输入序列和输出响应的代码集合。验证程序(TestBench)的组成Testbench被验证设计DUV参考模型输出响应输入激励比较结果一个典型的验证程序模型验证程序(TestBench)的组成一个典型的Testbench的六个组成部分:1.DUV---DeviceUnderVerification,可能是RTL设计,也可以是网表。2.输入激励---产生DUV需要的各种输入信号。3.时序控制模块---产生TB和DUV所需的时钟信号。4.参考模块---产生预期信号(行为级编码模块/以验证过正确的设计)。5.诊断记录---相关信号变化情况的记录。6.断言检查器---对特定的信号形式检测。基于断言的验证基于断言的验证是一种有效的白盒验证方法,它在RTL设计的源程序监视系统的关键行为,特别是在某些特殊情况下的行为。通过断言的方法,可以增加观测点,在仿真过程中及时发现设计错误。断言:断言是设计中希望特定性质为真的描述语句,断言的目的是捕获不希望在设计中出现的行为。断言是用于监控或检查施加在设计上的一些规则和假设的一种机制。断言的实现断言可以有多种实现方法,其中最常用也最简单的方法是所谓的叙述性的实现方法,即在设计结构中描述断言,断言和设计中的其他结构一起并发地计算。叙述性断言实际上是一些代码,这些代码中一般需要包含三部分:一是断言的条件,二是报告信息,三是错误的严重程度以及相关的处理。例如:不变性断言:assert_always[#(severity_level,options,msg)]inst_name(clk,reset_n,test_expr),其中•assert_always:断言的名称。•inst_name:断言的实例化名称;•test_expr:断言的条件,断言在每个时钟的上升沿检查表达式test_expr,如果test_expr为假,也就是在设计中检测到错误,则激活断言。•[#(severity_level,options,msg)]:断言的参数,severity_level表示错误的严重等级,根据不同的错误等级,进行相应的处理。另外一个是消息msg,用于表示某个性质不成立时候要显示的信息。如果在模拟的过程中,违背了设定的性质,那么就会触发监视器。另外一个是可选的信息options。下面是Assert_always断言的代码:•moduleassert_always(ck,reset_n,test_expr);•inputck,reset_n,test_expr;•parameterseverity_level=0;•parametermsg=ASSERTALWAYSVIOLATION;•‘ifdefASSERT_ON•integererror_count;•initialerror_count=0;•always@(posedgeck)begin•‘ifdefASSERT_GLOBAL_RESET•if(‘ASSERT_GLOBAL_RESET!=1’b0)begin•‘else•if(reset_n!=1’b0)begin•‘endif•if(test_expr!=1’b1)begin•error_count=error_count+1;•‘ifdefASSERT_MAX_REPORT_ERROR•if(error_count=‘ASSERT_MAX_REPORT_ERROR)•‘endif•$display(%s:severity%0d:time%0t:%m,msg,severity_level,$time);•if(severity_level==0)$finish;•end•end•end//always•‘endif•endmodule//assert_always上述的断言是用于检测某个表达式是否永远为真,如果test_expr表达式不为真,那么错误计数器计算不为真的次数,如果错误计算器的值小于用户定义的错误次数,那么显示错误信息。如果定义错误等级为0,则退出仿真。从上面的实现,我们可以看到,一个断言实际上就是一段Verilog代码,用模块的形式将其封装起来。因此,叙述性断言的用法非常简单,直接采用实例化的形式把断言嵌入在设计中就可以了,当测试条件不成立的时候,触发该断言。使用always断言。modulecounter_0_to_9(reset_n,clk);inputreset_n,clk;reg[3:0]count;always@(posedgeclk)beginif(reset_n==0||count=9)count=1’b0;elsecount=count+1;endassert_always#(0,0,error:countnotwithin0and9)//always断言;valid_count(clk,reset_n,(count=4’b0000)&&(count=4’b1001));endmodule实用构造Testbench技术1、使用行为级代码描述验证模型设计工程师编写的电路模型代码,要从实现的角度出发,从物理实现上考虑verilog代码的

1 / 50
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功