随着芯片变得越来越复杂并且更紧密地集成到封装或其他系统中,尤其是在预期寿命明显更长的安全和关键任务应用中,调试开始被重新思考和重新配置。如今,主要的错误发现方法使用了无处不在的受约束的随机/覆盖范围驱动的验证技术或形式验证技术。但是,随着设计变得越来越复杂,需要采用新的方法论和方法来确保随时间推移的质量。这可以包括从AI / ML到简单更新方法的所有内容,以在笔记本或电子表格中实现更高的自动化程度和更少的错误跟踪。
"对于约束性随机,通常的方法是从验证计划和目标中创建一个覆盖模型,它可以作为一张地图,说明在哪里瞄准刺激,以彻底测试重要的设计功能,"Cadence研究员Mike Stellfox说。"在一个受限的随机验证方案中,测试正在产生各种随机刺激,这些刺激在设计中行使不同的路径,而这些路径你不一定会想到是人,就会发现bug。因为你有覆盖率目标,你知道你是否行使了你认为重要的东西。通常会发生的情况是,会发现一个bug,比如某个行为,要么是由检查器识别出这个行为不正确而触发的,要么是其他二阶效应。这可能包括没有直接的检查器,状态机挂了,或者发生了其他错误的行为。一旦发现了bug,就会和设计者一起进行根本原因分析,以确定原因,这就是你要经历的调试过程。"
通常情况下,发现一个bug会有多人参与。可能涉及到不小心插入的设计者,也可能涉及到真正发现它的验证者。设计者修复它,作为这个过程的一部分,他们可能会确保问题是以它应该被修复的方式被修复的。这就是有机会更系统地做事情的地方。如今,这主要取决于验证工程师的经验和直觉。
"他们就会寻找'表兄弟bug',因为这个bug可能是在一组特定的刺激条件下修复的。"Stellfox说。"约束随机的好处是,如果你保持一点开放,除了原始测试,你可以在该区域运行很多其他刺激。你试着去浸泡这个区域,看看你是否会发现其他的表弟虫。这是一个有机会利用数据驱动方法的领域。"
同样的事情也发生在形式化验证中。"在形式化验证中变得非常流行的是bug猎杀,其中的目标不是关闭证明,"他指出。"这类似于约束随机方法中发生的事情,但你不是使用约束随机刺激引擎来锻炼设计,而是使用形式化引擎来锻炼它,这些使用类似的覆盖点概念来寻找关注的区域。形式化技术的好处是能够在所有情况下,相对快速地探索更多的空间。但当你在猎杀bug模式下,你通常会试图刺激一些特定领域的设计,在实现覆盖目标的同时找到bug。"
一些业内人士正在研究如何实现调试过程的自动化。随着系统变得越来越复杂,以及公差的收紧,过去被认为是三阶问题的东西现在都变成了二阶或一阶问题。这意味着需要在更多的地方寻找bug。良好的起点包括RTL和测试台,通常在那里引入变量或发生大部分变化。
"源代码修订控制系统追踪修订的地方,和验证工程师应该集中猎杀bug的地方之间有很高的相关性,因为这些地方往往是引入新bug最多的地方,"Stellfox说。"一旦引入bug,而且越早发现,就越容易调试和进行根源分析。如果一个设计师在做一个区块的时候,他们引入了bug,因为他们是写这个区块的人,如果他们能找到那里的bug,那是最快的方法,可以让bug根引起和删除。因为是一个人参与,所以范围很小,所以你可以很快的跑模拟或者正式。一直以来,我们都很注重这方面的工作,让设计师更早地找到低级的bug。"
随着范围的增加,比如一个IP,就会有一个验证工程师围绕更大的范围创建一个UVM约束的随机环境或形式化环境。这在一个层面上是有帮助的,因为它增加了一个新的视角。但由于是更大的范围,它可能需要更长的时间去发现错误,也需要更长的时间去修复它,他说。
所有这些都发生在硬件方面。在软件方面,情况就不同了。软件工程师习惯于处理技术的不断升级,这在涉及机器学习的应用中非常明显。
"这些应用在不断学习和改进,需要下载升级,"OneSpin Solutions的营销主管Rob van Blommstein说。"软件通常是运行在非常稳定的硬件平台上。但如何在不需要重建平台的情况下进行升级或差异化?为了跟上需求的变化,长期的定制化是必不可少的。做到这一点的关键之一是建立一个可重新配置的硬件平台,以实现这种灵活性。有很多方法可以实现这一点,但许多公司正在采用异构计算,其中包括不同的元素,如软件可编程引擎、加速器和可编程逻辑。将所有这些组件整合在一起,有助于满足低延迟、性能和容量需求,同时还能实现平台的灵活性。最终,我们的想法是随着对应用的不断改进,在整个产品生命周期内延长硬件的寿命。但做到这一点需要持续的验证。如果我们看一下敏捷开发流程,其中一个原则是进行持续集成和测试。如果我们把这一点应用到硬件开发中,我们就可以开始了解,随着变化的进行。还必须进行验证,以确保更改不会引入新的错误、安全问题或安全漏洞。"
不过,对于许多验证工程师来说,他们的个人笔记本是他们发现的跟踪找错活动的最佳方式。这很快被证明是不够的。
"某种程度上,我的笔记本必须是自动化的,与其让我翻阅笔记本,阅读我之前发现的所有漏洞,不如让笔记本来提醒我,当我已经做了一些事情,"Vtool的验证负责人Darko Tomusilovic说。"理想情况下,应该有一个工具,一旦我记录了一个调试周期,下一次我做同样的调试时,这个工具应该足够智能,能够提示是否是之前可能发生的同一个问题。该工具应该能够识别,或者至少建议我看一下某个特定的信号,如果它之前有帮助的话。或者,"看看这个消息。它以前帮过我。也许它还会有帮助。那么用户应该能够告诉工具它是对的还是错的,工具应该从中学习。通过使用用户的反馈,它会变得越来越聪明。"
通过数字进行调试
更为复杂的是,调试是很困难的,而且随着设备之间的依赖性不断增加,调试变得更加困难。如果有一个工具可以在每次调试时跟踪每一步,然后允许用户交互,工程师可以在一开始就采取行动,这样工具就可以学习和理解这些步骤。
"这可能会在最后帮助对下一个bug做出一些结论,或者至少说明这是工程师到目前为止没有做的事情,这也是很好的输入,也意味着要往不同的方向发展。"Vtool的项目经理Olivera Stojanovic说。"不过,要定义所有的步骤来做调试还是非常困难的。这是直观的东西。你需要在做调试的时候,根据之前的经验,搞清楚一些事情,得出一些结论,做出一些决定,或者往不同的方向去做。但很难定义你是如何得出某个结论的。"
Tomusilovic认为,工程师们太偏向于,太依赖自己的直觉。"有时候,你的直觉可以帮助你在短时间内解决一个问题。但另一方面,同样的直觉也会把你引向一个完全错误的方向,让你被困在那里好几天。不知怎么的,你的直觉应该在这个意义上得到更好的利用。经验有帮助,但即使在那里,你的经验也可能会把你引向错误的方向--尤其是在忽略一些简单的事情上。人们倾向于认为经验积累得越多,系统就越好理解,问题就越难,越难。这样一来,如果一个简单的问题出现了,可能很容易被忽略,这就会导致时间的流失。对一个非常复杂的问题进行怀疑并投入时间,就需要大量的时间去验证它、发现它、检测它。然后,如果发现其实是一些简单的问题,比如说没有时钟,没有复位,信号连接错误,或者类似的问题,这可能是一个进度杀手。一个好的工具可以帮助我轻松地检测出比较简单的问题,然后让我自己专注于更复杂的东西,相信自己的直觉和经验。"
然而,在每一个场景中,验证都有很多潜在的影响,不仅仅是对你现在所做的事情,而是对未来的影响。"随着CPU的复杂性增加,我们需要找到未来的bug,"Codasip的验证总监Philippe Luc解释道。"如果你的验证也增加了复杂性,你就不会发现更多的bug。你需要增加验证的强大测试,这样你的仿真能力就不会随着CPU的复杂度增加而快速增加。你必须更聪明地找到最佳算法,才能找到新的RTL设计bug。AI技术开始被用来提升结果。有一点,人类开始不理解验证方法的作用,因为太多的随机生成器混在一起。这是一个必须解决的问题,这是一个可以应用AI技术来进一步推进的地方。"
同时,这并不意味着AI/ML/DL是解决一切问题的答案,尤其是这个领域还有很多东西在发展。
"虽然说'我不用再工作了,我只要把数据给机器,它就会找到下一个测试方法'真的很令人满意,但缺点是我们不知道机器在做什么,"Luc说。"在验证中应用机器学习的一般思路是预先生成一些测试,问机器这些测试是否会好,也就是说它会发现一个新的bug,或者在上面增加更多的覆盖率。如果机器说它不会增加覆盖率,就不要运行这个工作。但如果它说它看到了发现新覆盖率的潜力,就运行它。"
然而,这种方法从验证任务中删除了一些测试,一些最有趣的bug并没有被刻意寻找出来。"你在一个复杂的设计上找到的最后五个bug--最后那些可能给客户带来大麻烦的bug--是靠运气找到的,"他说。"作为一个人,我不会预测这个测试为什么会发现这个bug。所以我担心机器学习算法会说,'对于这个测试,不要运行它,它看起来是一样的'。我真的很怀疑你能不能应用人工智能技术,神奇的说,'跑这些测试,不要跑这些测试'。今天我不确定AI会不会删除一个测试,导致我们找到下一个bug,所以我还没有足够的信心去应用它。"
尽管如此,Luc指出,第一步应该是确保所修复的东西真的是一个问题,这也是经验的重中之重。"验证的力度与CPU的复杂性是否足够?到目前为止,我所看到的可能是肯定的,但也有可以改进的地方。我们的目标是能够从经验中发现设计的下一个bug在哪里。当人们说没有想到的时候,说明有一些地方需要改进。这就是新的验证工程师工程师的困难。他们没有打破东西的心态,一般来说,很难说,'这里看的更深'。他们只是说,'没事。它通过。这是一个微妙的平衡,既要发现肯定需要改进的地方,又要说:'你真的应该看看这里,因为根据经验,我知道这是一个棘手的领域'。"
是bug还是流程的失败?
其他人则认为bug不仅仅是单一的发生,而是流程或工具的失败。
"很多时候,我们查看某人的测试,发现虽然他们测试了他们所说的内容,但却遗漏了任何其他没有考虑到的领域,"Imperas软件公司的CEO Simon Davidmann说。"有些人来到我们这里,要求我们找出bug,这样他们就可以修复它们,但这是一个失败的过程。你不想修复bug。你想修复的是让bug出现的过程。如果你单独修复一个bug,你就失败了,因为你在调试这个东西的存在。这是个错误的方法。相反,使用这个bug,分析它,并找出过程中失败的地方,这样的bug被允许放在那里,或者允许留在那里。"
可能是需要不同的工具,或者是工具或方法不足,或者是原来的验证计划没有正确理解事情。"也许这个过程与你使用的工具有关,"Davidmann说。"所以,找到一个bug,并且它帮助找到其他bug的概念是不太正确的。他们不应该寻找其他bug。他们应该寻找的是过程。如果你发现了一个bug,你不去修复这个bug,你去看看你的测试策略。你改变了所有这些,希望当你运行时,它不会发现一个bug,而是发现三个或四个。"
他指出,很多时间都是在试图帮助工程团队完成他们的流程,这对于RISC-V处理器验证来说是特别具有挑战性的事情,因为业界在这里没有一个验证解决方案。"如果你想验证一个USB块或一个SoC,这就是验证行业在过去20到30年里所做的事情。它开发了一套测试方法论。但对于RISC-V,我们要帮助人们的很多东西是他们的方法论和流程,而不仅仅是bug。你怎么找到bug?确保你已经有了这些东西,从验证计划开始。是的,你会在路上发现bug,但它们不应该是奇怪的、孤立的,在最后。前期应该有方法论、工具和流程。我们参与了很多对这些处理器的验证,因为我们正在成为那里事实上的参考,"他说。
不过,对于许多设计来说,这远不是一个解决的问题。"在验证方面,我们可以做的事情还有很多。"西门子业务旗下Mentor公司IC验证解决方案营销总监Neil Hand说。"AI/ML/数据分析--选取你最喜欢的时下流行语--将对其产生巨大影响。我们总是试图在巨大的虚无的设计空间里面找到bug,因为设计空间,对于任何合理的设计来说,都不可能全部被击中。如果你看覆盖率方法论和覆盖率分析,有些人认为那是万能的,终极的。但工程界说这很重要,但不够。"
目前的猎杀bug的方法主要是蛮力,Hand说。"如果你只有一把锤子,所有的东西看起来都像一个钉子。但当我们开始研究一些新的技术,以及AI/ML可以做的事情时,它开始变得非常令人兴奋,因为现在你可以开始确定哪里是重点。基于ML的数据分析可以指明在哪里投放注意力,因为那是最能带来回报的地方。但你可以超越这一点。你可以开始将所有这些机器学习技术应用到设计中,利用bug来寻找bug。如果你开始发现诸如某种风格的街区有更多的bug,或者你发现周五下午4点发生的签到有更高的bug概率,或者任何数量的看似随机的事情,这就是AI/ML发挥作用的地方。它可以识别出我们不会识别的关系,它可以开始说去哪里找。你也可以开始使用历史随着时间的推移,对于一个特定的设计。随着它越来越成熟,错误从设计的某一部分到设计的另一部分。同样,你可以使用机器学习来识别,因为你有一个无法解决的问题,你有比你能运行的更多的向量,而你能运行的最有效的向量是你不必运行的。没有比不用跑的更快的模拟周期了。这就是我们可以开始应用这些AI和ML技术的地方。"
这里一个未解决的挑战是共享数据。"公司不希望他们的竞争对手从他们的学习中受益,这是可以理解的,"Hand说。"在大多数情况下,你实际上无法对机器学习模型进行逆向工程,以获得任何有意义的数据,但同时你也不想帮助你的竞争对手,尽管你可能会帮助自己。挑战在于如何建立起必要的数据集,使之有效。你可以在单个设计上做到这一点。你可以在一个公司内的一组设计上做到这一点。但与任何机器学习问题一样,你能给它的数据越多,它就越有效。"
结语
调试没有灵丹妙药。这仍然是一个艰苦的过程,尽管随着芯片进入更多的工业、任务关键型和安全关键型应用,以及随着这些芯片被集成到需要长时间运行的更复杂的系统中,这个过程越来越重要。面临的挑战是加快调试过程,同时也要提高对结果的信心。
"大多数公司都有这样一位工程师,他们似乎可以非常迅速地找到问题的根本原因,"Hand说。"他们看一看,就开始调出信号,然后找到它,而一般的工程师可能要花几个小时才能达到目的。如果你能向这些工程师学习呢?如果你能然后突然开始呈现最有可能影响它的信号呢?因此,我们可以说,"这是你的信号,你可以在此基础上增加400个不同的信号",而不是说,"最有可能的是这两三件事情",或者,"开始看日志文件"。如果你发现日志中的错误,和波形中的错误之间的关系,这让你可以做一些非常酷的事情。而且你发现的错误越多,你就越能找到下一个错误,因为你现在已经有了一条面包屑线索。"