断言已被运用于RTL为主的侦错中,在确认错误及使错误区域化的方面有显著的效用。除此之外,它还可以缩短整个设计时程,使除错更为便利。然而断言所能提供的优点,除了设计的功能验证外,还可用在仿真过程中,改进事件发生的可观测性以及覆盖点。此种程度的可观测性,往往在署一个以覆盖率为导向的验证理论中,具有决定性的影响?
在一个以覆盖率为导向的验证理论中,一个设计的验证主要是以手写而随机产生的激励向量为主,使用者自己定义覆盖点,以确认所有重要的行为以及边际状况。在规格中所描述的部分都能被测试到,未能涵盖的测试点通称为覆盖的漏洞,此项信息提供了一些反馈,并在下次产生激励向量或随机向量时使用,以期能增进验证的完整性。在此理论中,断言通常结合端对端的检查,以确认所有的行为都能符合设计的规格。
将断言应用在检查设计的优点是众所皆知的,额外的优点可以补足功能覆盖率的不足,却常常被设计工作小组所忽略。这与将段言置于设计之中或接口上以捕捉设计的意图是相似的,此工作就是尝试去发现在设计中感兴趣的部分,或是与功能覆盖点有关的部份,因此设计与验证的工作小组应能了解到,如果他们能有效地利用断言与功能覆盖率,将此两种功能结合在一起,可以省去许多时间与精力。
本篇文章中将会使用一个真实的设计案例,其中包含片上总线、一个嵌入式处理器和一些标准接口,来描述如何结合断言与覆盖率,并使用断言库或是标准的断言语法,例如像是System Verilog Assertions (SVA)或Property Specification Language (PSL)。一旦断言和覆盖点被撷取到,他们将会被用来确认所有必要和随机测试的激励,以期能发挥仿真的最大效能。他们也会被用来确认之前的设计或是第三方的IP是否被充分验证。
在使用以断言覆盖率为基础的理论中,设计者必须考虑到不仅是如何能撷取到断言,更重要的是断言和被捕捉到的覆盖点是否充分?这些理论中的部分内容必须和被成为“断言密度(assertion density)”的覆盖指针相配合使用。
结合断言密度,并以断言为基础的覆盖率,提供了完整的RTL验证过程,其中结合了白盒子以可观测性为主,以及黑盒子以规格为基础的优点。此种结合也使设计小组在验证时,能使用更完整的覆盖模型,以期及早发现错误。
以覆盖率为导向的验证
一个以覆盖率为导向的验证理论的目标就是使验证的效率达到极致,同时也是在减少冗长且没有效率的验证工作,并且可以藉由选定一个或数个指标来衡量验证完成的进度来实现。如图1所示,一个以仿真为基础的CDV验证理论,可由抽象方式来表示为一个验证、侦错和覆盖率测量的反复渐进的过程。
在实际应用上,使用者总尝试去验证设计的RTL是否能符合功能上的规格。理论上,应该有一个自动化的方法,去比较功能与RTL实现的差异。遗憾的是大部分设计的规格都是以不可实现的方式来表示的。在此处,一个验证计划列举了在设计中必须被检查到的所有功能,同时所有的边际状况也应该被涵盖。
验证计划会列举出一连串必须被检查的功能行为,覆盖率则是检测此行为仿真执行的是否够彻底?为了落实计划,需藉由仿真或其它验证的过程(例如形式验证),同时借着测试激励,就可观察出设计的反应。若未能正确反应设计,一个除错流程必须能确认错误发生的原因,以便修改RTL。倘若设计符合预期,需藉由覆盖率的信息来提供RTL内部运行的可观测性,决定是否验证计划已被执行到令人满意的质量。
在以仿真为基础的CVD理论中,许多的先期工作都集中在验证过程,简而言之也就是说能迅速地增进覆盖率之测试向量的产生,但是很重要却被人所忽略的是如何仔细地去评量覆盖率——测试向量产生的根基。
总体覆盖率模型
测量覆盖率是所有验证方法重要的一环,覆盖率的测量为下阶段验证的工作提供反馈,来决定投入的努力与资源,以提升总体验证效率,其中覆盖率的测量可以明确指出哪些验证是多余的,哪些是错过了重点。
CDV的覆盖率指标涵盖多种覆盖率,如程序代码覆盖率、功能覆盖率、边际状况的覆盖率等。然而实际上,只有两种覆盖率的指针来衡量功能验证:以规格为基准(specification-based)的覆盖率和以实现为基准(implementation- based)的覆盖率。
基于规格(或功能)的覆盖率主要是衡量与高阶层次的功能或微架构的规格相关的验证行为。尤其是规格中规定了设计中输入输出的行为、可以进行的交易种类和必须发生的数据转换。以规格为基础的覆盖指针中,决定有多少行为在规格中必须被验证到。例如交易的覆盖率,它测量了在仿真中被实际测到交易的数量及种类。
基于实现(或结构)的覆盖率是衡量设计实现的细节的验证行为,它通常以RTL来表现。在RTL实现中设计的方法造成了与实现相关的边际状况。例如,当一个先
进先出 (FIFO)的缓冲器以RTL实现时,设计的方法不外乎是缓冲器的深度,边际状况则牵涉到FIFO是高水位或是满了的指标。这些以实现为主体的边际状况,在规格层次是很少看到的。
通常一个好的验证必须在功能和结构层次方面都能被追踪到,以确定其完整性。例如,一个模块的接口,覆盖率的测量必须能显示出PCI总线写的次数,以确定满足用以测量PCI总线中读写动作等功能覆盖率的指针。然而接口覆盖率的测量,并无法表现出PCI总线是否正确的写入DMA控制器中,到底是经由转换器(bridge)到处理器或是直接到系统的内存。为了得到总体验证进度的轮廓和落实完整的CDV的理论,功能验证以及结构性覆盖率的信息都是必须的。
图2给人的第一印象是需要一个能涵盖结构覆盖率的规格,看起来有些吓人,尤其对验证工程师而言,似乎具备详尽的RTL知识是必须的。值得庆幸的是,以断言为基础的验证(ABV)中设计工程师和验证工程师所完成的大部分工作,可以直接被应用于规格覆盖率的测量。
断言和覆盖点
断言借着早期侦测设计的缺陷,便于更快地进行调试,以增进基于仿真的验证效率。设计者藉此使错误区域化,而将注意力集中在相关的逻辑和相对的仿真时间,以观察错误的设计行为。当改善的可观测性和规格的易用性在最近几年得到重大进展时,针对RTL验证所用的断言得以快速发展。
广泛地说,断言仅是设计意图的简单描述,它们会告知设计的错误情况,并以可以执行的方式表现,一旦断言被违反时,设计中的错误就被呈现出来。同样的,覆盖点也是对验证意图的描述,它们也是用可以执行的方式呈现,并告知设计的当时情况和必须被执行和检查到的部份,以确认正确的行为。当结合断言时,功能和结构覆盖点可以让验证行为在时间(在何时仿真)和空间(在哪儿设计)上本地化。
从此观点来看,断言和覆盖率犹如一枚硬币的两面。两者在验证中都是必需的——事实上仅部署其中的一种,会在验证质量和仿真之间造成一个很大的鸿沟。没有采用断言,行为的检测仅能在设计的输出端才能发生。如果只凭不完整的黑盒子测试方法,或是借着测试激励的环境方法,或是错误的信息无法传递至输出端来观察,许多设计缺陷将被遗漏。另一方面,没有详细的结构覆盖率的信息,许多边际状况无法经由仿真中显现出来,潜在的问题,一直要等到芯片出来后才会被发现。
强化断言和覆盖率间的整合
将断言加在接口或是设计内部可以使规格覆盖点发生作用,这些也可藉由以下方式实现:
- 采用现成的断言库(assertion library)在覆盖点上。
- 采用现有协议断言(protocol assertion)的交易信息来产生功能覆盖率。
- 采用以PSL或SVA为主的检测和覆盖率。
为了将这些技巧应用于实际设计,各位可以参考图3,它以一个功能模块图的方式来表示。 
这是一个网络处理器SoC,大约有一百万个逻辑门。它含两个片上WISHBONE的总线、一些标准接口(PCI、Ethernet)、内存和一些异步的时钟域。它代表了一个典型的SoC设计,而以断言的方式和以覆盖率为导向的验证理论来验证。
以断言库来加强覆盖率检测
使用结构覆盖率的一般经验是,很难确切地知道什么是该测量的和如何测量,例如当验证计划中提到,FIFO缓冲器必须填满以确认边界状况的行为时,验证工程师必须能够实现和检测在仿真中的覆盖率。遗憾的是,很难借着标准覆盖率的技巧去探索设计中的RTL,以找到正确信号和充分了解协议去实现覆盖率的检测。
我们可以借着使用断言和断言库的方法来解决此问题。设计者使用验证IP的断言库,将现成写好的断言检查库以批注的方式加入原设计中,这些检查库都是针对主要的RTL架构来设计的,例如FIFO、仲裁器、内存等。有些断言库(例如由Mentor公司所提供的 CheckWare断言库)除了一般的断言外,已经扩大为可以提供结构覆盖率的信息(其它的库也类似此功能,可被设计小组所修改)。在一个扩增的断言库中,每一个成分都包含一段HDL代码,藉此来监测在验证过程中与RTL结构有关的特定的结
构覆盖率,例如,FIFO缓冲器的检查库就有它自己的覆盖率逻辑,来监测此FIFO缓冲器的覆盖点是空的、溢位、到达满位等情况(如图4)。其它断言库的组件也有它自己所定义的不同的覆盖点,例如内存存取的检查库有其完全不同的组态(读的交易次数、写的交易次数、一读一写的方式等)。
结论是当一个断言检查被加入时,它的结构覆盖率即被监测到。依此种方式,就如同利用专家设计者的知识,将有意义且正确的覆盖率量测加入设计中,而无须明确地知道每一步骤。
实际上,在一个复杂的设计中,断言和结构覆盖率的结合是获得必要,并与特定实现有关覆盖率量测的唯一合理方法。一般来说,设计者是能力、也有意愿来确认 RTL 设计组织中的结构覆盖率,并使用断言库中的组件来监测覆盖点,因为这是在设计过程中,极其自然而最不费时的工作。相较于传统覆盖率方法的最大不同是,对于量测的逻辑,它不需要明确界定每个单独覆盖的项目,因为此人工过程,在规格层次是可接受的,但在设计阶段就变成麻烦多了。
在图 3 的设计中,表 1 表示由 Mentor 公司 CheckWare 工具所提供的断言库。
表 1 ,在 SoC 设计中使用断言和覆盖率
值得注意的是,当断言库的组件被用来监测结构覆盖率时,提供了一个包含断言检查和覆盖率包装的 IP 。此简单抽象的结果是,提高了验证的效率,因为它利用了在断言中同样的工作。在交易覆盖点上使用协议断言
一般设计的接口或子系统是最典型的、使用许多断言来撷取期望协议和侦测在设计中的错误反应的手段。事实上,最佳的理论是确认所有输入与输出的接口都能为断言所涵盖。使用于接口的断言信息可以轻易地转变成以交易为主的覆盖点。这个可以藉由标准总线,或经标准语言 PSL 或 SVA 来定做的交易覆盖点的断言监测硅 IP 来实现。
在第一个案例中,断言监测 IP (例如 CheckWare 中的监测库),对一般标准协议提供了断言监测库。目前工业界所提供的标准总线涵盖 AMBA 、 PCI-Express 、 USB 2.0 、 DDR SDRAM 等。对每个单一的例子,之前所提到的理论也都同样适用,换言之每个断言监测 IP ,都提供每个协议状态的详细数据,可供在仿真过程中撷取覆盖率的交易信息。
在第二个案例中,设计小组针对设计接口使用断言时,他们也可简单地利用标准的语言像是 PSL 或是 SVA 来撷取交易覆盖点。图 6 表示出在 WISHBONE 的总
线中,使用 System Verilog 的断言来实现的例子。此例,断言用来检查信号顺序的正确动作和事件发生的次序。尤其是在一个简单、仆式( slave )为主的交易中,利用断言来检查可变量目的等待时间( wait times )。经由断言所撷取的信息,直接提供我们一个有意义的交易覆盖的监测。不仅同样的特性可以作为一个覆盖点,而且断言的边际状况也可引导我们额外的覆盖点。在此例中,我们定义了一个特性用来检查至少一个等待时间并用此当成是一个覆盖点。类似的特性也可轻易的定义零等待时间,把它当成是覆盖点的互补。
我们可以清楚的了解,将较佳的特性和顺序的解析,用于断言上的检查信息,同样的也可直接用于交易覆盖点上,其中,一些转换协议断言成为交易覆盖率测量的方法包含以下几点:
- 对于在协议中不同的交易种类定义一个特性
- 在每个交易的特性中必须加覆盖和断言
- 定义覆盖率的特性,就交易特性之内所定义值的范围而言 – 用来检查任何重复发生的最小和最大的事件
- 定义覆盖率的特性,就连续的分离事件而言 – 用来检查每一个以 ”OR” 表示的顺序被包含到
- 定义覆盖率的特性,就每一个牵涉到协议特性之前例 – 换言之,对一个以 A|=>B 形式的特性,针对 A 定义一个覆盖点。注意此覆盖的项目,如同在断言中所执行一个空泛的检查。在 CDV 的理论中,很重要的是将此信息带入覆盖点的观点。这也许可以当成是明确的覆盖特性,或借着断言仿真的工具所产生断言的空泛信息来完成
基于标准断言的覆盖点
从自订的断言来确认交易覆盖点的许多观念与一般断言的方法是同出一彻的。借着分解断言与数据包,事件与控制应答相对的序列,同样的特性用于断言检查也可用运用于覆盖点上。
图 7 中的例子显示出处理在设计总线转换器逻辑的数据检查。在此处, PSL 用来描述在网络处理器中,一个复杂数据包的格式。数据的完整性是借着执行必要程
序检查的断言库的组件 ( channel_data_integrity )来检测。重要的是, PSL 顺序节点( pci_load_write_channel_endpoint )是一个需要覆盖率监测的数据包。如能有好的分解,此节点很明显的可以用来当成覆盖指标,用以简化放置有用的功能性与结构性的覆盖点。
如上图例子所示,断言和覆盖点是紧密结合的。一个合理,以覆盖率为导向理论的最终的组件,就是要有一个记分板,来决定是否有足够的断言和覆盖点被放置于设计中。这个记分板通称为“断言密度”。
断言密度
一个 CDV 验证的其一挑战,就是决定是否有足够的断言和覆盖点被置于设计中。对此问题没有完美的答案。然而,一个用来确认“漏洞”的记分板,就是断言密度。
断言密度是一个静态的指针,用来测量在设计中的每一个缓存器和断言,或是覆盖点中所存在的逻辑阶层。这个距离称作最短连续距离( MSD ), 如图 8 所示。
借着量测在设计中所有缓存器的 MSD 并加以排名,覆盖点漏洞就可被确认出来。这恐怕不是一个完美的记分板,因为所有的断言和覆盖点都一视同仁,所以在一个较差断言的输入端筒( fan-in cone )之逻辑将会视为被覆盖到。然而,当成一个记分板, MSD 是有用的,因为它突显了没有机会被覆盖的逻辑区域(换言之,也就是这些有较高 MSD 的值)。指出 ” 覆盖率漏洞 ” 此能力,提供了一个行动方法,来确认 CDV 的理论是一个封闭循环
结论
在一个以覆盖率为导向的验证理论中,强化错误侦测能力和强化监测进度是同样重要的。很幸运的,用断言来强化侦错所需之努力可用来提供加强覆盖率的监测。适当有结构性的使用断言和断言库可以让覆盖率有渐进的效果。此论文已显示出如何使用外加的断言库,来提供断言和结构覆盖率。并且,以标准语言实现的连续和特性分解的断言,允许简单覆盖点的定义,其中,功能性(交易性)覆盖率和结构覆盖率都可适用。



