随着芯片规模的不断加大,其验证难度和复杂度也在不断提高,在完整的开发周期中,验证所花费的时间已经占到50%以上,且仍有不断攀升趋势
[1].在有限的时间周期和人力成本约束下,传统的验证模式逐渐不适应芯片的测试任务.当前芯片验证主要以受约束的随机测试(constrained random test,CRT)为主,以期可以发现更多的边界错误
[2],而随机情况会产生大量的冗余激励
[3],进一步延长验证时间.如何在更短时间内实现功能覆盖的快速收敛,已经成为验证工作的主要挑战
[4].
覆盖率驱动测试
[5-6],是当前普遍使用的验证方法,目标是通过观测覆盖率指导测试向量生成,其对各种待测试设计(design under test,DUT)适用性较强,但收敛速度较慢,相比之下,各种机器学习算法表现出了优秀性能.文献[
7-
9]采用遗传算法进行分析,利用其交叉及变异特性进行激励加速.贝叶斯网络
[10]、马尔科夫链
[11-14]、决策树
[15]、支持向量机
[16]、聚类
[17]等智能化算法也表现出了优异性能.近年来,随着深度学习技术的成熟,验证模式也有了新的发展方向,文献[
18]采用深度学习网络进行覆盖预测,可在更少的指令条件下达到更高的代码覆盖率.文献[
19]采用深度神经网络(DNN)算法进行隐式过滤,从而实现覆盖率的加速收敛,文献[
20]采用了一种自适应神经网络,以加速有限序列的生成.文献[
21]提出了一种结合机器学习的硬件验证环境,可实现约束的实时更新.文献[
22]对DNN、随机森林、支持向量机(SVM)、长短期记忆(LSTM)等多种网络结构进行了尝试,通过事务修剪及有向序列生成,有效提高了覆盖率的收敛速度.以上算法在不同程度上实现了对覆盖率的加速提升,但其多为针对特定待测设计开发而成,普适性较差.
目前对于专用集成电路的设计,通常设置多种配置模式,以使其满足不同场景下的功能需求.对于验证人员而言,理论上需对所有配置项进行遍历,以满足测试完备性.实际工作中,每增加一项配置,排除与其他项的互斥因素,其验证复杂度基本为倍数增长,这导致芯片验证的复杂度与配置项几乎呈指数关系、状态空间出现爆炸情况
[23].在随机测试情况下,根据粗略的统计,庞大的配置集合,其所用的完整测试案例达到配置集数据的百倍以上.考虑其复杂度如此宏大,目前功能覆盖率的统计多采用切片处理,即对各个配置项单独统计,或分析特定场景部分配置项的组合情况.其统计办法较为粗糙,且不能充分覆盖不同配置的组合情况.
针对上述问题,为满足约束随机测试模式下的交叉覆盖,提出了一种改进型引擎网络(engine optimization net, EoNet),通过模型训练及参数调节,在随机测试模式下,可迅速挑选出超过阈值范围的功能覆盖生成向量,从而达到较高的覆盖要求.与传统模式及常用的神经网络相比,文中算法的预测精度更高,可在更短的测试向量或更少的资源占用下达到覆盖率的快速收敛.
1 设计及验证需求
对于采用较多配置的芯片验证,本方法具有普适性.本文以数字滤波芯片为例进行说明,其主体结构如
图1所示.其中最左侧为AD接口,主要包含数据输入及相关控制信号;最右侧为CPU接口,主要进行芯片的参数配置及对滤波后结果的读取.
图1中心一列为芯片的配置寄存器,其包含多种配置模式,如滤波模式可选择FIR滤波、IIR滤波、先FIR后IIR滤波;数据输入输出可采用串行或并行方式;输入输出采样率范围;AD采样位宽;AD串行采样通道数,每通道采样数据等.各个配置参数之间既有组合情况,又有限定及互斥情况.功能点交叉情况复杂,覆盖集较为庞大.
该验证平台的功能覆盖率模型由覆盖组(cover group)实现,依据配置寄存器的特点及组合应用场景,划分为多个覆盖点(cover point).每个覆盖点依据复杂度创建相应数量的仓(bin),并在仿真中记录该覆盖点是否被覆盖及覆盖次数.针对单个配置寄存器参数,设定单点仓(single bins);针对寄存器功能点组合情况及应用场景,设置交叉仓(cross bins)和深度交叉仓.
测试的核心激励为配置寄存器的随机组合情况.除滤波器系数需根据场景使用特定的数据外,其余所有配置均可进行随机处理,并进行功能覆盖点观测.共设计单点覆盖点51个,交叉覆盖点43个,其中交叉覆盖点中深度交叉覆盖点数目为8,功能覆盖需满足上述覆盖点中所有仓均实现命中.排除参数互斥条件,交叉仓可认为是其中各个覆盖点仓数的乘积,而深度交叉仓可认为是其中交叉仓的乘积,因此深度交叉仓的覆盖是实现功能完备性的关键.在受约束随机测试条件下,要实现其完整覆盖,所需测试集极大,且包含诸多重复案例情况,因此考虑借助神经网络实现.
2 网络数据集生成
设置的8个深度交叉覆盖点共包含27 036个仓,占到所有仓的80%左右,且涵盖了所有典型测试场景.故而将其覆盖率情况作为学习网络的输出,与其有相关度的配置参数,如滤波模式、输入数据串并行情况等,作为学习网络的输入,所有配置参数的组合情况即可实现完整覆盖.
验证环节会占用大量仿真资源,如CPU使用、内存及硬盘占用等.为加速测试案例完成,实际中通常采用多进程并行仿真方式实现.考虑采用较少资源占用满足测试情况,将仿真进程并行度作为一个输入参数,设定范围为5~70.每个进程仿真事务数目直接影响仿真的时间,将其作为参数输入,设定范围为500~30 000.考虑到这两个参数数值波动较大,容易导致训练不收敛,采用min-max方法对其进行归一化处理,其余参数由于本身即为权重大小,将其转换为对应百分比即可.最终实现的神经网络输入参数见
表1,其中前七个参数分别对应
图1中的SCR、ADCR、ADSR、DOSR、INTR等配置寄存器,cpu_parallel对应CPU接口的HPAR_N端口.
图2所示为网络生成与使用流程图,该验证过程使用统一验证方法学
[24](universal verification methodology, UVM)实现.在其随机生成组件uvm_sequence_item中,生成数据以权重体现,为简化操作,设定每个变量的权重分布总和为100,各参数可在0~100之间随机产生.考虑部分数值过低或过高会有明显不合理情况,将其数值进行进一步约束.生成数据送入测试平台中运行,并收集得到的输出功能覆盖率数据,与输入数据向量送入网络进行训练,得到可使用的网络模型.再随机生成大量输入数据,送入网络进行前向传播,然后将得到的功能覆盖率数据进行筛选,超过设定阈值的数据进行排序后,选取结果重新送入测试平台中运行,选定其中的覆盖率最高值,最终采用该组参数进行完整仿真测试.
神经网络的一个难点在于需要大量的训练集数据
[25-26],对于代码覆盖率,需经过完整的事务仿真后得到覆盖率结果,这本身需要占用大量时间,在功能仿真中无明显优势.而对于功能覆盖点,uvm_sequence组件在生成一笔随机事务后可通过uvm_driver直接传递到覆盖组件uvm_subscriber,经分析即可产生功能覆盖率结果,此后可结束仿真进程,不必经过待测设计,而此过程不消耗仿真时间,如
图3中实线箭头所示.
3 神经网络设计
神经网络的输入构造为1×21的一维向量,输出为1×8的一维向量,由于没有绝对正确性的判定条件,采用输出值的均方误差来判别学习的准确度.考虑网络的输入和输出呈相对线性关系,且与图像或语音相比,其输入数据量相对较小,尽量采用简单的神经网络
[27].本文分别采用多层感知机(multilayer perceptron,MLP)、手写体识别卷积神经网络
[28](LeNet)与改进型引擎网络EoNet实现并进行比较.
3.1 简单网络实现
与其他深度学习网络相比,MLP计算量相对较小,但仍有较好的泛化能力及非线性表达,应用范围广泛.综合考虑模型复杂度及参数影响情况,经多次尝试,采用MLP的网络实现,设计的神经网络总体如
图4所示.共包含四个隐层,为保持中间数据规模,设定第一隐层神经元为800,其余各个隐层的神经元数量设定依次减少为600、400、200.
由于输入数据向量较小,也可考虑采用经典手写识别网络LeNet实现,
图5所示为参照实现的网络结构.其输入数据设定为一维维度,经两次卷积和最大池化后进入全连接层.其中卷积核大小为1×4,池化的卷积核及步长为1×2,激活函数采用Sigmoid函数.
3.2 EoNet网络实现
实验表明,MLP网络训练精度相对较低.LeNet虽为CNN结构,但由于数据仍为一维维度,且池化层的存在进一步减少了数据量大小,其效果并不理想,因此对其进行改进.网络设计主要基于以下几个方面的考虑:
1) 考虑一维卷积核对数据量减少较为明显,为便于利用卷积的特性,将输入数据排列为二维方形结构,并在末尾补零,由1×21形状改为5×5大小.池化层的存在不利于特征向量的保存,因此网络中去掉了池化层.
2) 实验表明,适当增加中间数据量可显著提高网络精度,同时网络首层需尽量保存边缘信息.综合考量,设计的卷积块如
图6所示,上层1×1卷积块主要为增加通道维度,使通道数增加到16,之后3×3卷积在四周进行一层数据填充,如此保持其输出的 宽和高与输入一致,并将通道数增加到32.下层进行1×1卷积仅将通道数增加到32,保持了初始数据信息.最终两个并行通路的输出在通道维度上进行连接,并经ReLU激活函数输出,最终得到64通道的 5×5向量.
3) 第二、三层设计主要参照残差网络(residual network,ResNet),其实现核心在于解决深层网络中的梯度消失和梯度爆炸问题
[29],但其相加特性也有助于保留低级特性,且批量归一化的引入提高了模型的泛化能力.
综合考虑性能与复杂度,网络共设置两个残差块,每个块的结构如
图7所示.共设置两级,每级均包含两组3×3卷积及批量归一化,输出与输入相加后送入下一级,最终结果经ReLU激活函数输出.其中第一残差块输入输出维持通道数不变,均为64,第二残差块将输出通道数扩至128.最终实现的网络整体结构如
图8所示,残差块输出后展平进入三级全连接层,得到最后输出.
4 实验结果
4.1 神经网络训练结果对比
为便于直观比较,所有网络的损失函数都为均方差,训练与测试损失都为一个周期的总损失与向量数目的比值.以上三种网络的损失如
图9所示.可以看出,三种神经网络的训练和测试损失的下降趋势均保持一致,证实网络得到有效训练.其中LeNet在前几百周期内损失保持不变,调节参数后效果仍不明显,考虑其陷入局部最小值.
图10为三种网络的训练损失比较.从
图10(a)可以看出:相比于MLP及LeNet,本文提出的EoNet收敛更为迅速.
图10(b)为10万次迭代后三种网络训练损失,考虑总训练周期较大,后期三种网络的损失均趋近于零,为便于观测,此处采用对数坐标形式.可以看出:MLP最终稳定在10
-5量级,LeNet稳定在10
-3量级,而EoNet可以下探到10
-6量级.
4.2 覆盖率实测结果
训练后的模型可用于对随机输入向量进行 筛选,设定输出阈值为98.5%,并对输入向量进行排序,可选择最低资源占用(并行进程数)、最快速度(进程仿真事务数)或最高覆盖情况.排序后的输入向量进入测试平台进行实测,最终各个测试情况如
表2所示.
对于最少资源情况,仅需23个并行进程即可实现99%以上覆盖,而原始随机覆盖率仅为73%左右.对于最快速度情况,虽然进程数有所增加,但仿真事务数目仅为10 000个左右,这会大幅减少仿真时间,且与原始随机覆盖率相比效果明显.而对于最高覆盖情况,其关键仓覆盖率与其他相比略有提高,但与原始随机覆盖率比较效果不甚明显,且资源占用相对较大,实际应用中需综合考量.
5 结束语
针对随机测试不便对功能点组合情况完整覆盖测试的问题,利用功能覆盖分析不消耗仿真时间的特性,设计了一种轻量化的卷积神经网络EoNet.通过对输入进行权重处理,数据向量进行重新分布,并结合参数优化,实现了对任意激励覆盖情况的预测.与传统测试方法相比,该方案可在较少测试向量或较低仿真资源使用情况下达到指定覆盖要求,同其他标准神经网络相比,其表现出更快的收敛性及更高的预测精度.综上所述,文中算法对基于机器学习技术的功能覆盖方法进行了探索,为复杂模式下的芯片测试提供了一种通用性强的解决思路.
集成电路先进器件工艺仿真与智能EDA青年交叉团队项目(JCTD-2022-07)