DVCon文赏-2023w13一种智能网卡的形式验证流程

原创 路科验证 2023-03-21 13:33


论文下载链接

链接:https://pan.baidu.com/s/11BJ4UdCeT5NBHeHrfmUVOQ

提取码:cw13

介绍

这篇论文总体上不难理解,背景是开发智能网卡的团队在验证智能网卡IP过程中,由于需要考虑数量庞大的错误场景,而不得不在原本已经启动的随机约束仿真验证(CBRV)基础上,添加了形式验证(FPV),继而在更短的时间里,找到了数量更多且更复杂的bug(好吧,形式验证听起来总是那么酷,屠龙术就是这么傲娇)。

论文容易理解的一个特征在于它会把这篇论文的背景和相关知识交代得易于理解。就比如它在描述有哪些错误类型的时候,将系统错误逐一划分,继而一直到它接下来要处理的功能描述错误即specification violation errors,这类错误也属于可检测到的错误类型,并且需要由设计报告出来,并且在报告以后设计还能够恢复正常。即在验证这个智能网卡IP的过程中,不但需要关注功能正确,而且还需要特别关注它可能遇到的(几乎所有)错误情况,并且设计要能够将这些错误情况检测(detect)、报告(report)出来,最后从错误状态中恢复(restore)到一个可知状态,在人为较少介入的情况下,还能够继续处理后续的数据包。

正由于本文智能网卡需要长期、频繁处理大量数据,它就有很多种出错的可能,而对于错误的处理就成了这个设计功能的一部分。这一点往往在很多其它设计中也有错误处理,但没有本文IP的要求高。但在CBRV中,由于UVM环境中的组件在设计时往往并没有充分考虑如何插入错误,这也使得让充分测试发生错误场景的要求变得困难,而且还可能带来较大的工作量。

提出问题

文中要验证的是NIC(Network Interface Card) IP中的一个解压缩IP,它的特点一如其它数据流处理的模块,也是需要对数据帧、数据块做数据接收、校验、格式检测等内容,并就违反数据协议的有关问题进行识别和报告。如果是要验证它的正常功能,那么就需要给它提供符合协议的经过压缩的数据。

为了加速验证过程,在CBRV环境中他们采用的是软件压缩生成器(SW compressors),可以简单理解为通过已有的(来自外部或者内部的)软件压缩应用来对原始数据进行处理,并生成压缩后的数据文本,再将这些符合协议的数据通过协议激励的形式发送给解压缩IP,解压缩IP如果处理妥当的话,那么最终识别解包的数据可以通过monitor采集下来,并且与原始数据(在交给软件压缩生成器之前的数据)做比较。这种方式比较流程是从文中给的描述方式推断得出的。

只不过也正如文中谈到的,这种方式适合验证满足压缩数据协议的情况,但无法更好地解决一些验证完备性的问题,它们包括:

  1. 使用的软件压缩生成器并不足够灵活,只能生成协议中的一部分数据协议格式。

  2. 如果企图去修改这些生成器似乎不那么容易做反向工程,因为有些协议中要求的部分被优化掉了(也就失去了插入一些错误逻辑的可能)。

  3. 软件压缩生成器与压缩协议是一致的,但本身(一般)不支持插入错误,更谈不上错误的格式配置(因为这往往只有在硬件验证的时候才需要,而软件压缩生成器只是为了做数据协议的通路验证)。

基于此,可能需要在CBRV进行到一半的时候,再考虑是否需要就协议数据包的生成专门去做一个数据包生成器(例如由UVM来实现),但这也会在带来额外的工作量,而且还需要考虑协议中的各种组合情况(CBRV本身不会去做穷举组合,但目前有工具可以帮助做穷举组合覆盖率的收敛)。同时,也需要在实现协议driver的过程中就考虑在其中插入多个错误回调函数(从我们过去的实现经验来看这么做更加合理),以便于在sequence中通过绑定错误回调函数和错误类型来最终实现错误数据协议的插入。

但问题依然在,如果我们像AHB、I2C这些数据总线的错误协议,我们可以根据VIP的错误类型来选择插入不同的错误(这些错误类型往往是根据对协议的理解由VIP(Verification IP)提供商考虑来实现的,但数据总线协议标准并没有规定所有的协议错误的情形),而文中的解压缩IP已经对出现的各种错误可能都做了错误代码划分,也就是说它对功能错误的重视程度与功能正确的情况是一致的,我们需要验证的是,该IP在【所有规定错误类型】的情况下,都能检测(detect)、报告(report)错误并从错误中恢复(restore)正常。

这意味着即便我们花了大力气去实现CBRV需要的可以做不同数据格式配置的一个满足协议的driver,但还需要在driver内部准备多处错误插入逻辑。从我们过去的实现经验来看,我们实现正常的协议逻辑从基本功能到复杂功能是在做加法,而在继续实现插入错误的逻辑上面,我们可能是在做乘法。因为我们既要能够实现插入错误的功能,还要让这个功能不会影响到原有的正常驱动功能,而且还别忘记,我们还要考虑monitor是否需要对这些错误进行分类监测识别。可以这样说,这几乎给我们带来了至少双倍的工作量。

总而言之,这种为了遍历错误(也是一种功能测试要求)而去让CBRV的环境更加完善(且投入更多人力)的考量,给本文作者他们带来了一些新的选择。他们试图让FPV也参与到验证过程中来,继而降低整体的工作量(我没有见过他们的项目数据,就降低整体的工作量我持谨慎态度)和提高发现bug的效率。

解决方案

将这个解压缩IP做结构简化的话,可以分为解码逻辑(decode logic)、错误检测+报告逻辑(error detection logic)和控制逻辑(包含错误恢复,control logic)。在形式验证中,我们需要遵循一个基本原则就是简化设计,或者说是简化每一个断言属性要检查的逻辑。这就要求我们在一开始就需要考虑将设计进行拆分,就拆分的逻辑部分分别做形式验证,采取“分而治之”的方案,这个方案在数据流类型设计的形式验证中经常被采纳。

于是他们给的方案是对错误的检测、报告和恢复(控制)逻辑分别展开验证。只不过实际上文中并没有对形式验证的覆盖率给出数据,这也使得在最后与CBRV验证做比较的时候,是针对bug发现情况做的比较。因为形式验证的覆盖率部分也能帮助指出整个完整数据通路是否可以通过形式验证完成,即数据完整性(data integrity)的验证,否则在文章最后就CBRV与FPV的比较维度就不够完整,也无法让我们放心是否有信心在今后的工作有可能只采用FPV,而完全搁置CBRV。要注意的是,本文是就CBRV与FPV在验证流程和发现bug上的比较,但其实仍然隐去了一部分“工程现实”。而我谈到的工程现实,却可能决定了一个方案是不是能够更可靠地去“落地”。

在介绍接下来的3种分而治之的验证方案前,还需要清楚的是,实际的形式验证工程实现并没有下面简化后的这样“完美”,因为从本质而言,形式验证也对应着“激励”(stimulus)、“监测”(monitor)和“比较”(check),只不过它是由断言属性的assume来实现了激励、assert property的前置算子(sequence)实现了监测以及assert property的后置算子(sequence)实现了比较。
比如下面的错误检测验证和错误报告验证的两种形式验证子任务,就没有就它们是如何构建assume来做描述,以及如何在已满足协议的多个assume中,添加多种错误的assume,继而实现不同的错误可能这些工程实现进行描述。要知道协议往往越复杂,那么构建一组满足协议的assume,以及基于这些assume再添加引起错误的assume,都需要经验。只不过,相比于CBRV实现的driver中软件处理逻辑,FPV中的assume要更偏向于粒子化(atomic),也因此我们要插入一种错误,更容易与原有的assume组进行融合,无外乎是disable某些assume,再引入某些引起特定错误类型的assume。
最糟糕的情况可能是不对输入数据的协议做任何assume规范,但这对于前期稳定设计、调试设计都有显著的不利影响,这属于过于宽松的约束。往往是在设计稳定(测试过大多数正常功能)以后,我们才开始将约束逐步放宽,而我们这里说的约束宽松或者收窄,在CBRV或者FPV中都有这样的激励原则。
因此请在阅读本论文有关如何实现这三部分设计逻辑的形式验证时,理解论文作者为此做的抽象和简化,懂得“理想和生活往往只有一步之遥”的距离那么远又那么近... ...
错误检测验证
在这部分里,作者对解压缩IP需要处理的多种错误类型做了一个归类展示以说明他们需要就这些错误可能在FPV过程中都激励到。

就比如举的一个例子,要检测数据块的最大size,可以通过简化后的2个断言来实现“有且只有”的该错误类型的检查。但要注意的是,下面断言中使用的变量block_size从何而来,如果来自于设计内的信号,那么就还需要就该信号的逻辑做补充验证。这种规则也符合我们谈到的“分而治之”的理念,即如果你需要按照灰盒去降低形式验证的复杂度,那么你就需要对使用的设计变量做补充验证,证明它们的逻辑正确。在下面的例子中,就需要证明block_size信号跟设计端口接收到的数据有关,且是经过数据包拆分后得到的逻辑。这部分逻辑往往可以在形式验证中也采用always/task这样的“胶水”逻辑做补充处理,继而证明block_size的逻辑正确。当然,下面的例子我们也可以直接采用经过胶水逻辑处理后的变量。两种方法,第一种是灰盒验证式的(采纳部分设计变量),第二种是黑盒验证式的(全部采用自有变量)。


错误报告验证

既然能够检测出错误,那么将错误正确无误地归类并且将8位的错误码发送出去,就属于错误报告的验证部分了。

在下面简化后的代码中可以看到,只要错误能够检测出来(我们对这一步仍然做假设,可以利用设计中的变量,采取灰盒验证),就能够投入到错误报告的验证当中。在设计中,要归类这些错误类型,也往往会有可以直接使用的error flag变量,再结合输出端口的错误代码,即能够对这些错误报告做验证。

这部分代码显然可以复用,即当我们给入不同的error flag变量和对应的错误类型代码时,我们就可以同时验证256个错误类型。只不过形式验证不需要我们采用CBRV的方式去穷举这个256个test case,而只要我们的激励环境具备这个能力(assume group需要能够支持产生错误激励,且同时有条件出发不同的错误类型)。

在这种情况下,我们不必像CBRV为了每个test case去考虑支持插入的错误类型,要注意这些错误类型甚至都无法由某一个错误帧构成,可能是多个错误帧共同影响下的产物,FPV毫无疑问降低了为此我们要不断更新driver的压力。我们只需要让assume group能够自洽地去有条件产生一些我们想得到的和没有想到的激励,继而让它们去触发一些错误类型,并且去满足给定的错误类型断言。

可以预见到的是,错误类型断言未必都能够得到检查,即空成功(vacuous success),即这些没有被触发前置条件的错误断言类型由于我们给定的assume过约束(over constraint)而没有被触发检查。在这种情况下,我们往往需要多个任务场景,构建多种assume group,才能最终将这么多的错误类型都做到覆盖。

控制恢复逻辑验证

智能网卡对于能够从数量众多的错误中恢复正常数据处理的要求很高,这也使得在本文中的解压缩IP验证中,需要在错误检测和报告之后,仍然需要确保设计功能能够恢复正常。

例如给出的这个简化后的状态机,既需要考虑是否所有的状态都已经遍历,而且也要在遍历之后检查设计功能是否正常。对于状态机的测试,在CBRV层面如果不受额外的人工介入,那么覆盖率将会在到达某个阶段后缓慢爬坡。而如果人工需要介入,那么就还需要考虑设计特定的测试场景去触发那些没有覆盖到的状态跳转情况。往往状态机越复杂,用来分析状态机的难度就越大,用来单独设计为增加跳转覆盖率的测试用例就越难以把控。这里测试用例激励难以把控的原因是,这些激励需要通过若干不同的时序和逻辑处理后,才有机会去触发状态机的跳转,但这种跳转不是能够做到100%出现的。

那么当这些错误状态越多,解压缩IP的错误恢复控制逻辑测试对于CBRV的要求就越高,不但需要创建指定场景(有时这种场景都未必容易造出来),还需要在这些测试中关注每一种特定的状态跳转事件,继而触发某些信号用来收集覆盖率。

对于熟悉CBRV验证的朋友来说,如何去让状态机提高它的跳转覆盖率本身就不是SV/UVM能够直接起作用的,目前EDA公司也在推他们的有关“智能收敛”的方案,往往会跟他们的回归工具和仿真器做绑定,如果你们公司有精力做这样的尝试,可以试着联系EDA厂商的AE,试着在你们的环境中找个piolot项目先做做看,评估一下是否便于落地。

说回到FPV的验证方案,那就是考虑就这部分控制逻辑做单独验证,因为从激励的角度来看,你的激励距离目标越近,那么就更容易控制、触发目标设计中的逻辑,也就是去提高状态机的各种跳转覆盖率。如果就CBRV而言,这种方式不是一个常规方式,因为CBRV的环境里如果这部分control logic处于设计内部,那么设计内部的逻辑驱会驱动它,这种传导关系要求我们仍然从设计端口给激励。当然,我们也可以采用“侵入式”(invasive)激励,直接将激励数据灌入到内部设计的边界,只不过这种方式还需要改造UVM环境,毕竟它不是仿真环境原生支持的。

对于形式验证工具,它可以通过先切断(cut-point)设计中的驱动逻辑,再将目标变量的驱动交由assume property去做激励的形式,灵活地将激励从解压缩IP外部送入,同时将一部分激励直接给入到需要验证的control logic部分。在这种情况下,FPV可以更直接地去对control logic模块做激励,并且收集它的信号。这部分额外的assume/assert property可以通过单独的模块bind到这部分control logic模块。

从上面简化的代码来看,就单独测试状态机而言形式验证的穷举模式会更有效,但也别忘记,我们仍然需要去证明所接管control logic的error signal功能(已由错误报告验证方案完成),以及它的输出控制信号最后对设计恢复正常功能的作用。

未提及的FPV部分

本文将三部分逻辑的功能和联系讲清楚了,尽管有较多的简化,但总体的功能逻辑是清晰的。只不过在接下来的总结部分,并未提及覆盖率的部分,无论是代码覆盖、断言覆盖率还是功能覆盖率。而且,还有重要的一点是,FPV的验证方案只做了“切分”和“简化”,但未提及对于整体数据通路的数据完整性验证。要知道,如果没有这部分验证,那么我们肯定是对于FPV以后做独立完备性验证缺少信心的。但由于本文做了对比验证,那么CBRV部分的整体数据通路验证是完成的,也因此从项目上降低了对FPV的要求。也就是说,可以利用FPV的灵活性和穷举能力,让它更多地举出反例,帮助找到一些考虑不到的bug。往往是由于FPV的穷举能力,也就能够帮我们触发更多违例(violation)场景,挖掘到一些我们没有注意到的测试盲区并找到bug。

总结

一般形式验证的论文都会将FPV所发现的bug与CBRV做比较以此来证明它们“打扫全屋无死角”的能力,这对于开发IP确实很重要。那反过来看,如果IP验证时只采用了CBRV,而没有采用FPV的话,是不是意味着有很多“隐秘的角落”没有被访问过,手机前的你如果在做IP验证的话,是不是惊起了一身冷汗?

而从验证效率来看,FPV的收敛速度也较CBRV有明显提升,往往在设计75%测试点完成度上面,FPV使用了12周,而CBRV使用了28周的时间,也就是整整快了16周的时间(4个月,天啊,好奢侈的时间裕度)。不过从论文的描述来看,CBRV的环境是先行的,对于设计的理解和趟的坑也给后面开展FPV提供了提速条件。我推测做FPV和CBRV的人应该是同一批,他们一边做一边也在交叉记录和比较。

在最后的展望阶段,文章作者还预计要将这部分错误处理的经验带入到SoC验证上面,我倒是对他们准备如何展开SoC层面的分而治之的方案很感兴趣,不过相比之下我可能对于PSS的系统测试场景构建能力更有信心哦。

论文下载链接

链接:https://pan.baidu.com/s/11BJ4UdCeT5NBHeHrfmUVOQ

提取码:cw13

路科验证 专注于数字芯片验证的系统思想和前沿工程领域。路桑是Intel资深验证专家,主持验证架构规划和方法学研究,担任过亿门级通信芯片的验证经理角色。在工程领域之外,他在西安电子科技大学和西安交通大学客座讲授芯片验证课程。著有书籍《芯片验证漫游指南》。
评论
  • 现在为止,我们已经完成了Purple Pi OH主板的串口调试和部分配件的连接,接下来,让我们趁热打铁,完成剩余配件的连接!注:配件连接前请断开主板所有供电,避免敏感电路损坏!1.1 耳机接口主板有一路OTMP 标准四节耳机座J6,具备进行音频输出及录音功能,接入耳机后声音将优先从耳机输出,如下图所示:1.21.2 相机接口MIPI CSI 接口如上图所示,支持OV5648 和OV8858 摄像头模组。接入摄像头模组后,使用系统相机软件打开相机拍照和录像,如下图所示:1.3 以太网接口主板有一路
    Industio_触觉智能 2025-01-20 11:04 195浏览
  • 临近春节,各方社交及应酬也变得多起来了,甚至一月份就排满了各式约见。有的是关系好的专业朋友的周末“恳谈会”,基本是关于2025年经济预判的话题,以及如何稳定工作等话题;但更多的预约是来自几个客户老板及副总裁们的见面,他们为今年的经济预判与企业发展焦虑而来。在聊天过程中,我发现今年的聊天有个很有意思的“点”,挺多人尤其关心我到底是怎么成长成现在的多领域风格的,还能掌握一些经济趋势的分析能力,到底学过哪些专业、在企业管过哪些具体事情?单单就这个一个月内,我就重复了数次“为什么”,再辅以我上次写的:《
    牛言喵语 2025-01-22 17:10 181浏览
  • 故障现象 一辆2007款日产天籁车,搭载VQ23发动机(气缸编号如图1所示,点火顺序为1-2-3-4-5-6),累计行驶里程约为21万km。车主反映,该车起步加速时偶尔抖动,且行驶中加速无力。 图1 VQ23发动机的气缸编号 故障诊断接车后试车,发动机怠速运转平稳,但只要换挡起步,稍微踩下一点加速踏板,就能感觉到车身明显抖动。用故障检测仪检测,发动机控制模块(ECM)无故障代码存储,且无失火数据流。用虹科Pico汽车示波器测量气缸1点火信号(COP点火信号)和曲轴位置传感器信
    虹科Pico汽车示波器 2025-01-23 10:46 80浏览
  • 高速先生成员--黄刚这不马上就要过年了嘛,高速先生就不打算给大家上难度了,整一篇简单但很实用的文章给大伙瞧瞧好了。相信这个标题一出来,尤其对于PCB设计工程师来说,心就立马凉了半截。他们辛辛苦苦进行PCB的过孔设计,高速先生居然说设计多大的过孔他们不关心!另外估计这时候就跳出很多“挑刺”的粉丝了哈,因为翻看很多以往的文章,高速先生都表达了过孔孔径对高速性能的影响是很大的哦!咋滴,今天居然说孔径不关心了?别,别急哈,听高速先生在这篇文章中娓娓道来。首先还是要对各位设计工程师的设计表示肯定,毕竟像我
    一博科技 2025-01-21 16:17 159浏览
  • 数字隔离芯片是一种实现电气隔离功能的集成电路,在工业自动化、汽车电子、光伏储能与电力通信等领域的电气系统中发挥着至关重要的作用。其不仅可令高、低压系统之间相互独立,提高低压系统的抗干扰能力,同时还可确保高、低压系统之间的安全交互,使系统稳定工作,并避免操作者遭受来自高压系统的电击伤害。典型数字隔离芯片的简化原理图值得一提的是,数字隔离芯片历经多年发展,其应用范围已十分广泛,凡涉及到在高、低压系统之间进行信号传输的场景中基本都需要应用到此种芯片。那么,电气工程师在进行电路设计时到底该如何评估选择一
    华普微HOPERF 2025-01-20 16:50 123浏览
  •     IPC-2581是基于ODB++标准、结合PCB行业特点而指定的PCB加工文件规范。    IPC-2581旨在替代CAM350格式,成为PCB加工行业的新的工业规范。    有一些免费软件,可以查看(不可修改)IPC-2581数据文件。这些软件典型用途是工艺校核。    1. Vu2581        出品:Downstream     
    电子知识打边炉 2025-01-22 11:12 135浏览
  • Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用触觉智能EVB3568鸿蒙开发板演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持OpenHarmony5.0及Linux、Android等操作系统,接口丰富,开发评估快人一步!添加新账号1、使用adduser命令来添加新用户,用户名以industio为例,系统会提示设置密码以及其他信息,您可以根据需要填写或跳过,命令如下:root@id
    Industio_触觉智能 2025-01-17 14:14 145浏览
  • 嘿,咱来聊聊RISC-V MCU技术哈。 这RISC-V MCU技术呢,简单来说就是基于一个叫RISC-V的指令集架构做出的微控制器技术。RISC-V这个啊,2010年的时候,是加州大学伯克利分校的研究团队弄出来的,目的就是想搞个新的、开放的指令集架构,能跟上现代计算的需要。到了2015年,专门成立了个RISC-V基金会,让这个架构更标准,也更好地推广开了。这几年啊,这个RISC-V的生态系统发展得可快了,好多公司和机构都加入了RISC-V International,还推出了不少RISC-V
    丙丁先生 2025-01-21 12:10 626浏览
  • 飞凌嵌入式基于瑞芯微RK3562系列处理器打造的FET3562J-C全国产核心板,是一款专为工业自动化及消费类电子设备设计的产品,凭借其强大的功能和灵活性,自上市以来得到了各行业客户的广泛关注。本文将详细介绍如何启动并测试RK3562J处理器的MCU,通过实际操作步骤,帮助各位工程师朋友更好地了解这款芯片。1、RK3562J处理器概述RK3562J处理器采用了4*Cortex-A53@1.8GHz+Cortex-M0@200MHz架构。其中,4个Cortex-A53核心作为主要核心,负责处理复杂
    飞凌嵌入式 2025-01-24 11:21 50浏览
  •  万万没想到!科幻电影中的人形机器人,正在一步步走进我们人类的日常生活中来了。1月17日,乐聚将第100台全尺寸人形机器人交付北汽越野车,再次吹响了人形机器人疯狂进厂打工的号角。无独有尔,银河通用机器人作为一家成立不到两年时间的创业公司,在短短一年多时间内推出革命性的第一代产品Galbot G1,这是一款轮式、双臂、身体可折叠的人形机器人,得到了美团战投、经纬创投、IDG资本等众多投资方的认可。作为一家成立仅仅只有两年多时间的企业,智元机器人也把机器人从梦想带进了现实。2024年8月1
    刘旷 2025-01-21 11:15 666浏览
  • 2024年是很平淡的一年,能保住饭碗就是万幸了,公司业绩不好,跳槽又不敢跳,还有一个原因就是老板对我们这些员工还是很好的,碍于人情也不能在公司困难时去雪上加霜。在工作其间遇到的大问题没有,小问题还是有不少,这里就举一两个来说一下。第一个就是,先看下下面的这个封装,你能猜出它的引脚间距是多少吗?这种排线座比较常规的是0.6mm间距(即排线是0.3mm间距)的,而这个规格也是我们用得最多的,所以我们按惯性思维来看的话,就会认为这个座子就是0.6mm间距的,这样往往就不会去细看规格书了,所以这次的运气
    wuliangu 2025-01-21 00:15 325浏览
  • 本文介绍瑞芯微开发板/主板Android配置APK默认开启性能模式方法,开启性能模式后,APK的CPU使用优先级会有所提高。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。源码修改修改源码根目录下文件device/rockchip/rk3562/package_performance.xml并添加以下内容,注意"+"号为添加内容,"com.tencent.mm"为AP
    Industio_触觉智能 2025-01-17 14:09 206浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦