ChatGPT浪潮,在各行各业引起了不小的颠覆,芯片验证也不无例外。随着芯片设计复杂度的不断增加,交付周期越来越短。设计工程师可能需要花费将近一半的时间在功能验证上。功能验证本身具有计算和数据密集的性质,因此也成为了机器学习(ML)技术的理想领域,二者的融合交叉尝试也一直没有间断。
许多ML算法已经在功能验证的不同领域进行了尝试,并取得了不错的效果。ML在功能验证中的应用主要分为:需求工程、静态代码分析、验证加速、覆盖率收集和BUG的检测及定位。
需求工程
需求工程(Requirement Engineering)一般指定义、文档化和维护验证需求的过程,这也是保证最终的设计符合spec的重要一环。
需求定义
需求定义(Requirement definition)将自然语言(NL)的验证目标转化为标准化的验证规范。传统的验证flow需要多次手动校对以确保质量,借助机器学习,目前有两种经典的方法进行自动化翻译。
第一种方法是引入约束自然语言(CNL)进行描述需求,然后使用基于模板的翻译引擎进行翻译。只要CNL配套的工具足够强大,CNL可以描述FV中遇到的大多数需求。但这需要开发人员学习新的语言,具有一定的门槛[9]。
第二种方法是使用经典的自然语言处理(NLP)来解析自然语言(NL)的需求,提取出关键要素[10]。随着大模型的训练和演进,后续可以直接将自然语言的需求翻译为SystemVerilog、Assertions (SVA)、Property Specification Language (PSL)或其他语言。目前已经有一些端到端的翻译尝试,但离大规模使用还有比较大的gap,主要的障碍在于训练数据集的稀缺[11]。
代码总结和翻译
Code summarization and translation to NL,与需求定义相反,将代码翻译成自然语言。可以帮助开发人员理解一些复杂的逻辑代码,提升代码的可维护性和可读性。
但目前,IC设计验证领域的Code summarization几乎没有尝试。不过跨语言模型的发展或许有助于将其他编程语言的实践经验转移至IC设计。需要注意的是,IC设计和验证的code存在语义的并发,如fork,module等,这在其他语言中并不常见。
特性挖掘
特性挖掘(Specification mining)在软件工程领域比较常见,Dallmeier、Valentin等人以及Wenchao、Forin和Seshia等人都曾对进行研究[14][15]。Specification mining从待测试设计(DUT)的执行中提取规范的方法,用于替代手写spec的方法。机器学习可以从仿真中挖掘到某些重复的模式,可能是DUT的预期行为。此外很少出现的事件模式可以视为异常,也可用于debug和调试[16]。
Azeem等人提出了一种通用的软件工程方法,利用机器学习来寻找spec,并找到可能存在问题的协议实现[17]。
代码分析
芯片开发中的错误修复成本呈现一种指数级增长的规律,越是靠后的开发阶段,其错误修复成本越高。因此静态代码分析(Static code analysis)可以作为设计开发早期阶段的一种有效手段,用来改进代码质量和可维护性。
代码质量评价
Code smell detection and quality assessment.
Code smell指那些功能正确,但是维护性以及可读性差,违反一些规范或者最佳实践。典型的例子就是在多处重复编写相同功能的代码。
常见的code smell检测,依赖于定义好的规则来识别源代码中的问题。而机器学习的方法是,在大量可用的源代码上进行训练,以识别出code smell的模式,而不是手动编写这些规则或指标。Fontana等和Aniche等所述的研究表明,使用机器学习的方法可以显著减少模式实现的工作量[18][19],并帮助开发人员持续改进产品质量。此外,基于机器学习的代码重构可以为改善code smell提供有用的提示,甚至进一步提供更改方案。
遗憾的是,这方面的应用在FV中还不太明显,而且缺乏大规模的训练数据集也是其重要的阻碍因素。
辅助编码
简单的代码补全或者提示是集成开发环境(IDE)的标准功能,开发人员的效率也可以得到提升。而深度学习则提出了更高级的技术[21],并且正在快速迭代成熟[22]。现在可以从许多大规模开源代码库中训练具有数十亿个参数的人工神经网络(ANN),并给出开发人员实现意图或基于上下文的合理代码片段的建议。
ML也有可能帮助IC开发人员通过语义代码来进行搜索,通过自然语言查询来检索相关代码[23]。虽然理论上,应用于其他编程语言的相同ML技术可以应用于IC设计,但目前还没有相关的研究。
验证加速
Verification Acceleration包括Formal和Simulation-based两种。
Formal verification
Formal使用形式化数学算法来证明设计的正确性。作为一种统计方法,机器学习虽然不能直接解决Formal验证的复杂度问题,但是在资源调度方面很有帮助。通过预测计算资源和解决问题的概率,然后以最佳方式利用这些资源来缩短验证时间 [25],即先调度具有更低计算资源消耗、可求解成功的任务。基于Ada-boost决策树的分类器可以将成功解决的比例从95%提高到97%,平均加速1.85倍。[25]中的另一个实验能够预测Formal验证的资源需求,平均误差为32%。
Simulation-based verification
和Formal验证不同,simulation通过对DUT添加随机或固定模式的激励,把DUT输出和参考输出进行比较,以验证设计行为的正确性。基于simulation的功能验证也是芯片开发流程中耗时较长的一步。
机器学习在该领域的一个可能思路是对复杂系统的行为进行建模和预测。多层感知器(MLP)(一种至少具有一个隐藏层的前馈人工神经网络)可以以任意精度逼近任何连续函数。而标准化循环神经网络(RNNs)(一种特殊形式的人工神经网络)则可以逼近任何具有存储器的动态系统。先进的机器学习可以使人工神经网络可以对一些IC设计模块的行为进行建模,以加速其仿真。根据人工智能加速器的能力和机器学习模型的复杂性,可能会实现显著的加速。
测试激励产生和覆盖率收集
在simulation中,除了手工编写测试用例外,还有较为常见的受限随机测试方法,以及基于图形化的测试平台生成技术。覆盖率在验证前期会增长很快,但也存在“长尾”效应。最后20%的覆盖率闭环,可能需要80%的资源消耗。所以机器学习在这方面的应用,也都集中在如何提升覆盖率的收集速度。
一些研究表明引入机器学习,可以获取比随机测试更有效的case。大多数研究也都是基于“黑盒模型”,假设DUT是一个黑盒,其输入有测试激励控制,并监测输出。其重点是从历史输入/输出/观测数据中学习,进而调整随机测试生成器或减少不必要的测试上,而不是试图学习DUT的行为。
在[31]的研究中,使用基于强化学习(RL)的模型来从DUT的输出中学习并预测缓存控制器的最有效的case。当ML模型给出的反馈是FIFO深度时,模型能够从历史结果中学习,并在几次迭代中达到FIFO深度的全覆盖,明显优于基于随机测试的方法。但文中没有进一步实验证明在更复杂的设计中的表现,在较为复杂的设计中,反馈不容易定义。
[28]引入了一个更精细的ML架构,对每个覆盖点都训练一个ML模型。还采用了三进制分类器:是否应vwin 测试、丢弃或用于进一步训练模型。使用支持向量机(SVM)、随机森林和深度神经网络对CPU设计进行了实验,结果表明,达到100%的覆盖率时,模型能够减少67% ~ 80%的case数量。对存在状态机设计的结果表明,与定向序列生成相比,减少了69%和72%。
但是,上面的这些研究都仅针对自有的设计进行,其模型的训练结果无法作为先验知识,被其他模型使用。其原因也是模型的训练数据不可用。
Bug analysis
Bug analysis是指找出潜在的bug,定位包含bug的代码块,并提供修改建议。机器学习已用于帮助开发人员识别设计中的bug,并更快地修复bug。Bug analysis需要解决三个问题:通过其根本原因进行bug聚类、分类根本原因和提供修改建议。大部分的研究集中在前两个问题上,还没有第三个问题的研究结果。
在研究[34]中的方法,使用半结构化的模拟日志文件。它从日志文件中提取元数据和消息行的616个不同特征。机器学习可以预测哪些提交最有可能包含bug,可以显着减少手动bug-hunting的时间。但是,由于采用的ML技术一般相对简单,无法兼顾代码中多样化的语义,以及无法从历史bug修复中学习。因此,这些模型一般也无法解释bug发生的原因和方式,无法自动或半自动地修复bug。
ML前沿技术及其在FV中的应用
近年来,机器学习技术、模型和算法方面取得了重大突破。如果将这些新兴技术引入到FV中,则有希望可以解决FV面临的诸多难题。基于大量文本语料库训练出的具有数十亿参数的自然语言处理模型,表现出接近或超过人类水平的性能,例如问答、机器翻译、文本分类、概括性总结等。
在代码分析中应用这些研究成果,也展示了这些模型的优势[12][24]。这些模型可以吸收大量的训练数据,将所学习的知识进行结构化,并提供易于访问的方式。这种能力在静态代码分析、需求工程和代码辅助工具中是非常重要。
图形神经网络(GNN)的进展为FV带来了新的机遇[33]。其研究将设计转换成一种代码/数据流图,然后进一步使用GNN来帮助预测case的覆盖率。这种白盒方法可以洞悉设计中的控制和数据流,从而生成针对性的测试。图形可以表示在验证过程中遇到的复杂多样化的关系、结构和语义信息。进而通过在图上训练机器学习模型,可以为许多FV问题提供解决方案,例如bug analysis和coverage closure。
大规模开源验证数据现状
尽管在 FV 中应用机器学习取得了一些不错的研究成果,但要实现成熟和大规模的应用,还必须解决许多难题。其中最大的挑战是缺乏训练数据集。
由于缺乏大型数据集,许多研究只能采用相对原始的机器学习技术,这些技术只需要数百个样本的小型训练数据集。这种情况不利于高级机器学习技术和算法的应用。IC设计一直以来是私有化的,设计及其关联的验证数据(包括验证计划、仿真设置、断言、回归结果、仿真日志、覆盖数据、跟踪文件、修订和提交)都是其公司内部的商业秘密数据。一项调查显示,典型的机器学习项目会花费团队高达70%的时间用于数据准备。包括数据清理、报告和可视化。
缺乏高质量的训练数据和高成本的数据准备是研究 FV 的机器学习面临的重大障碍。目前很少有研究人员愿意公开分享他们的数据、代码或机器学习模型,因此其研究结果难以被其他研究人员重复或验证。
在2022年5月在GitHub、RISC-V和OpenCores上的搜索结果,在开源可用的设计数据有限,验证数据更少。
共约1000万行代码和注释,这个规模几乎无法与其他流行编程语言中的数百万个项目和数十亿行源代码相比。更重要的是,与验证相关的数据非常稀缺。即使可以从源代码集中生成验证数据,但也必须投入巨大的人力来进行仿真验证,以提取有效数据。
业界观察
如果机器学习能在FV中的成功应用,除了数据的稀缺性问题外,还有几个问题需要解决。
模型泛化是许多机器学习研究结果中最常见的挑战之一。泛化能力衡量了将训练出来的模型应用于新问题时的易用性。在特定类型的设计、编码风格、某些特定项目或某些小众数据的数据集上训练出的模型,可能无法很好地适用于其他领域。如果模型无法做到很好的泛化能力,其工业应用价值非常有限。
模型的可扩展性是另一个挑战。一个模型可能在相对简单的设计中表现得很好。然而,无法保证它在应用于数十亿个RTL门的大型设计,以及来自多个开发团队的代码时能够同样有效。模型压缩投入、额外的计算资源,都是引入机器学习需要考虑的成本。
第三个挑战与机器学习应用中的数据管理有关。在实际应用中,用于训练机器学习模型的数据集所有者、FV工具开发者和工具用户可能属于不同的组织。结合计算能力的分布和 MLOps 专业知识的可用性,他们共同决定了选择哪些机器学习模型。例如,数据私有化,而且没有机器学习基础设施的组织,可能无法使用需要大量计算的机器学习模型。
总结
FV本质上是一个数据分析问题,尽管使用了不同的机器学习技术,但研究大多仍采用原始的机器学习技术,并受到训练数据规模的限制。目前的机器学习应用还没有完全利用许多语义、关系和结构信息,开源和高质量的训练数据可能是目前遇到的最大问题。机器学习在FV领域的应用是非常有希望的,前途是光明的,不过目前距离大规模的应用,还须更多努力。
本文译自于:DVCov US 2023:A Survey of Machine Learning Applications in Functional Verification.
编辑:黄飞
评论
查看更多