基于VMM的ALU验证.docx
- 文档编号:20105869
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:9
- 大小:21.73KB
基于VMM的ALU验证.docx
《基于VMM的ALU验证.docx》由会员分享,可在线阅读,更多相关《基于VMM的ALU验证.docx(9页珍藏版)》请在冰豆网上搜索。
基于VMM的ALU验证
基于VMM的ALU验证
摘要:
基于VMM方法学设计和实现了一个随机验证环境,验证一个64位ALU。
该验证环境具备一套功能完备的随机测试程序发生器,可以生成覆盖率指导的有约束的定点、浮点指令序列,调用一个由C语言实现的参考模型进行运算结果自检,并采用覆盖率收敛技术实现覆盖率快速收敛。
实践结果表明,设计的随机验证环境,能够高效验证ALU的各项逻辑功能,减少测试时间,且随机测试程序生成模块可以简单移植应用于处理器其他模块的功能验证。
关键词:
SystemVerilog;VMM;验证;算数逻辑单元
中图分类号:
TN407?
34文献标识码:
A文章编号:
1004?
373X(2015)07?
0144?
04
随着高性能处理器设计日趋复杂,如何对处理器各设计模块进行有效而充分的验证,是芯片设计成功的关键因素之一[1]。
目前芯片的研发过程中,功能验证会消耗70%以上的资源,验证的自动化程度、验证语言的使用、验证平台的可重用性等问题都严重制约着验证的进度。
为此,Synopsys推出了VMM(VerificationMethodologyManual)验证方法学解决了上述问题。
VMM使用SystemVerilog验证语言,采用了覆盖率主导、随机约束生成、基于断言的层次化验证结构。
本文围绕Synopsys的VMM,构建了一个ALU(ArithmeticLogicUnit,算术逻辑单元)的随机验证环境。
1DUT
ALU是微处理器中最重要和最常用的部件之一,它是集多种算术功能和逻辑功能于一体的单元电路[2]。
一般来讲,微处理器内部主要由数据通路和控制通路两部分组成,ALU是数据通路的重要组成部分,是微处理器的核心功能部件,对微处理器性能具有决定性的影响[3?
6]。
该环境验证了一款高性能处理器的64位ALU,其支持123条定点、浮点运算指令。
ALU接收Decode(译码)模块的译码信息(包括指令类型、寄存器号、线程号等控制信息),从下级模块RegisterFile(寄存器堆)相应位置取出操作数进行运算。
其控制逻辑alu_ctrl分为salu_ctrl和calu_ctrl两个模块,分别控制SALU和CALU。
ALU内部结构如图1所示。
图1ALU内部结构
SALU的控制模块将定点和浮点比较/选择指令的rstage译码信号转换成fx1stage的控制信号,并根据ELU(ErrorLogicUnit,异常逻辑单元)的flush指示判断是否将salu_dph的运算结果写回寄存器堆。
SALU的data_path负责定点指令(乘加/除法除外)和浮点选择/比较类指令的执行,执行流水线经历fx1→fx2→fx3→w。
CALU的控制模块将定点乘法/除法和浮点乘加/除法、开方、转换、舍入指令的rstage译码信号转换成fx1stage的控制信号,同样的也根据ELU是否发生flush决定是否写回calu_dph的运算结果。
CALU的data_path负责浮点运算指令(加减、乘法、除法、开方、舍入、转换)和定点乘加、除法的执行。
执行流水线有3条:
(1)定点乘加类指令,流水线经历fx1→fx2→fx3→fx4→fx5→fx6→fw;
(2)浮点乘加、加减、舍入、转换运算,流水线经历fp1→fp2→...→fp8→fpw;
(3)浮点除法、定点除法运算、浮点开方运算,为Blocking执行,经历34个cycle。
考虑到定点与符点运算的指令类型非常多,控制信号的数量庞大,对该模块各种输入信息的随机控制非常繁琐复杂,而且测试过程中很多功能点的验证容易遗漏,所以采用了从Decode模块开始注入激励的验证方案,即DUT为Decode、ALU、RegisterFile三个模块。
这样可以直接对DUT注入十六进制指令码,而不需要对ALU的控制信号逐一约束,采用这种方案极大地减少了随机信号生成的工作量,测试的覆盖点也非常全面且容易控制。
2基于VMM的ALU验证结构
基于VMM的ALU验证需充分利用VMM的特点,即有约束的随机激励生成,自动数据对比检查和功能覆盖率收集。
2.1有约束的随机激励生成
VMM提供了有约束的随机数生成。
根据指令语意将ALU指令集进行分类,这样可以通过一定的约束随机的生成指令以及指令所需的参数[7?
8],在下一节的指令生成中会详细介绍指令的分类及指令参数的生成方法。
指令生成后,需要通过一个由C代码实现的汇编器对指令进行处理,这样汇编指令可以实时转化为十六进制代码,并可以直接读入DUT进行仿真测试。
2.2自动数据对比检查
由于ALU是进行各种算数运算和逻辑运算的部件,传统的注入汇编代码,通过观测仿真波形来确定结果正确性的验证方法需要消耗大量人工成本,而且测试数量非常有限,不适用于递归以及大量TestCase的验证,所以需要一个参照模型能够生成对应的参照结果,以便快速找出bug。
验证环境里实现了一个用C语言描述的ALU参照模型。
该模型以十六进制指令码作为输入,在每条指令执行完毕后会写出对应参考结果。
ALU通过RegisterFile来保存数据和状态,可以通过对比RegisterFile的内容,来保证ALU的每一条指令的工作状态都是和参考模型是一致的。
验证环境可以读出ALU执行指令后的运算结果并传递给Scoreboard,环境里C参考模型执行的每一条指令的结果也都会保存下来供Scoreboard读入,Scoreboard可以实现运算结果的自动对比,并且在log中打印出来。
2.3覆盖率收集
为设计中的特征单独编写一套定向测试的方法需要人工编写代码,这需要消耗大量的时间和精力,并且很难统计指令的执行情况,依靠这种方法得到满意的覆盖率非常困难。
基于VMM的验证环境中,鉴于C模型与DUT实现的功能相同,可利用C模型的运行结果来实现对指令执行情况的统计。
由于在每条指令执行完毕后都会自检,可将C模型执行的结果作为功能覆盖率的采集点,根据DUT的设计特征、需要使用的输入条件等信息提取出覆盖率模型,在仿真执行过程中自动收集,仿真结束后将所有测试用例的覆盖率信息合并,给出最终的覆盖率结果[9?
10]。
一般来说,要求代码覆盖率及功能覆盖率都需要达到100%。
3验证环境各功能模块的具体实现
基于VMM,实现了一个64位ALU的随机验证平台,该平台能够随机产生长度可控的定点和浮点指令序列,并在每一条指令执行结束后进行结果对比检测,图2即为该验证的详细框图。
下面将该平台的详细实现加以介绍。
图2验证平台框图
3.1指令生成及Generator模块
该64位ALU的设计基于ARMv8架构,支持所有的ARMv8定点和浮点指令。
首先根据功能对指令分类,如Arithmetic(immediate)类指令包括ADD、ADDS、SUB、SUBS、CMP、CMN、MOV这7条指令。
而对于ADD指令,根据操作数还分为两种情况:
ADDWd|WSP,Wn|WSP,#aimm
Add(immediate):
Wd|WSP=Wn|WSP+aimm.
ADDXd|SP,Xn|SP,#aimm
Add(extendedimmediate):
Xd|SP=Xn|SP+aimm.
这就需要对位宽进行约束,代码如下:
constraintc_width_sel
{
width_selinside{32,64};
}
另外,还要对寄存器号进行约束,代码如下:
constraintc_reg_num
{
source_reg_num0inside{[0:
31]};
dest_reg_num0inside{[0:
31]};
}
对立即数的范围进行约束,代码如下:
constraintc_aimm
{
aiminside{[0:
2047]}
}
对寄存器间的依赖关系也可以进行约束,代码如下:
constraintc_correlation_S0
{
S0_correlation_mode_selinside{′S_NONE,′S_S,′S_D};
S0_correlation_depthinside{[0:
′CORRE_DEPTH-1]};
S0_corre_selectinside{0,1};
S0_corre_selectdist{0:
=10,1:
=10};
}
确定了指令类型,随机得到指令助记符、指令相关参数,在以上约束下便可以生成一条满足语法要求的指令[11]。
在测试用例中对指令配比、地址、数据等信息进行约束,便能够控制Generator生成的指令。
通过变换随机种子就可以生成各种各样不同的指令序列。
验证环境里可以改变各类指令的配比,寄存器关联模式的配比,以便将一些边缘情况测到。
得到了汇编指令序列后,通过汇编器,将汇编指令编译成十六进制指令码。
为了方便Scoreboard进行结果比对,随机环境还利用脚本处理,将生成的汇编指令的助记符提取出来以确定指令执行的时钟周期长度。
此外,Generator还可以随机获取线程号、分支预测指令的目的地址、方向等信息。
3.2Driver模块
Driver实现的功能比较简单,将Generator产生的十六进制代码及其他随机参数依次送入DUT中。
另外,Driver也可以直接从外部文件得到asm代码或十六进制代码,这样已有的ALU测试程序都可以在这个环境中直接调用。
3.3Assert模块
Assert用于加强环境的验证能力,使用它可以很容易对设计者期望的行为进行描述,并在环境中捕捉设计者的这些期望,代码如下:
assert(valid=1)
3.4Scoreboard
Scoreboard根据Decode模块译码出来的目的寄存器号,从RegisterFile中相应的位置取出寄存器的值,与ALU的C模型运算出来的寄存器结果作对比。
由于ALU模型写出的值是每条指令执行之后的值,而RegisterFile传递过来的数据是每个时钟周期的值,为了保证结果对比的正确性,必须确定好结果对比的时机。
这里根据Generator模块生成的助记符可以确定该条指令执行的时钟周期长度,Scoreboard不但要负责解读C模型运算出的参照RegisterFile的结果文件,还要从RegisterFile模型传递过来的数据中选取该指令执行完毕后的一个时钟周期的数据与参照数据进行对比,如果对比失败,Scoreboard的自检机制会终止测试。
需要补充的是,因为DUT是由时钟驱动,而C语言实现的参照模型不带时序关系,有些指令运算结束后可能会乱序提交执行结果,这就需要根据具体情况做出时序调整。
3.5C模型
环境中使用了汇编器和仿真器两个C模型。
由Generator生成的指令代码会被写入asm文件,通过makefile调用一个由C语言实现的汇编器来处理该asm文件,生成一个HEX代码文件,命令如下:
aarch64?
linux?
gnu?
objdump?
Dasm_file>hex_file
Generator再读入这个HEX代码并传送给下级模块。
仿真器是用C语言实现的ALU模型,该模型可以实时写出每一条指令执行结束后RegisterFile的状态,这是判断ALU的运算结果是否正确的依据。
验证环境通过DPI调用C函数的代码如下:
import"DPI?
C"functionvoidAddsIm32(inputbit[31:
0]inst,inputbit[1:
0]threadid) 3.6功能覆盖率模型
对于ALU这样的DUT,代码覆盖率已经不能够代表验证进度,需要把重心放到功能覆盖率的收敛上。
VMM验证方法学的核心优势是具备了功能覆盖率驱动的随机约束能力,能够比较方便地得到更高的功能覆盖率。
为了使ALU的功能覆盖更快收敛,使用了两种方法:
一是改变随机种子,如图3所示。
由于运行一次仿真,只能测试到一种配置、一次激励,得到相应的功能覆盖率,那么每次仿真,可以通过命令选项的形式来制定不同的随机种子(RandomSeed),从而改变生成的随机变量,以得到不同的配置来测试与前一次不同的功能,命令如下:
vcs+ntb_random_seed=999…
通过脚本控制,可以实现自动运行多次仿真,并且每次仿真都使用不同的随机种子,这样可以在某种程度上降低重复的随机变量的生成,快速达到较为理想的功能覆盖率。
然而这种方式存在一定弊端,即仿真运行的次数无法事先确定,需要人为判断覆盖率的收敛情况,再确定是否需要继续执行仿真,及执行次数,这是个需要重复多次的过程。
而且通过变换随机种子的方式来控制随机变量的生成,具有一定盲目性,并存在较多的重复配置,因此功能覆盖率的收敛仍然需要较多的运行次数,增加了总的运行时间。
鉴于改变随机种子的收敛方法的弊端,在后续的测试中采用了第二种方法,即功能覆盖率收敛技术(CoverageConvergenceTechnology,CCT),如图4所示,这是Synopsys公司推出的一项技术[9]。
与改变随机种子方法的思路一样,CCT的基本原理同样是根据每次仿真后的Coverage值来控制下一次随机变量的生成,所不同的是不再是简单地改变随机种子,而是会根据当前的覆盖率来指导测试向量的生成,减少重复的测试向量生成,以便实现覆盖率的快速收敛。
图3改变随机种子的图4CCT验证流程
方法的验证流程
通过脚本可以在覆盖率结果与测试向量生成之间形成一个反馈环路,避免了手动反馈覆盖率带来的大量时间精力消耗,在功能覆盖率达到理想状态时可以自动停止仿真。
实现CCT需要如下两个步骤:
首先,将DUT设计结构的功能点及需要随机的输入条件等信息提取来建立功能覆盖率模型,即在验证平台里将需要监测的随机变量定义覆盖组和覆盖点,然后在类里对这些变量进行创建和随机,同时对已建立的功能点进行采样。
其次,脚本控制过程分为四个阶段实现功能覆盖率的收集与反馈,一是在编译时加上?
ntb_optscct选项,去掉+ntb_random_seed选项;二是首次运行仿真,建立覆盖率反馈控制的偏差记录;第三多次运行仿真,每一次的仿真过程中,Synopsys的VCS仿真工具中的CCT功能,可以实现通过当前覆盖率反馈指导随机变量生成,进一步减少重复的测试向量生成,加速功能覆盖率的收敛,节省了流片前的宝贵时间[12];最后利用脚本提取每次仿真后的功能覆盖率增加情况,并判断覆盖率是否已收敛,若收敛则自动终止仿真。
4结语
本文实现了一个基于VMM的ALU随机验证环境。
该环境不但可以生成随机指令作为DUT和C模型的输入,也可以使用已有的测试程序;另外提供了RegisterFile检测环境,可以在每一条指令执行后检查RegisterFile的值,从最全面角度保证每条指令执行结果的正确性;此外还建立了功能覆盖率模型,收集覆盖率信息。
参考文献
[1]张瑾,王剑.基于龙芯2F处理器的硬件验证平台的设计与实现[J].计算机工程与科学,2009(z1):
270?
275.
[2]游肖君.高性能ALU优化设计研究[D].西安:
西安电子科技大学,2009.
[3]雷普红.高速算术逻辑部件的设计与验证[D].长沙:
国防科学技术大学,2006.
[4]王大宇.高性能浮点加法器的研究与设计[D].南京:
南京航空航天大学,2012.
[5]王重阳.单、双、扩展精度自适应浮点乘、除和开方运算单元的实现[D].北京:
华北电力大学(北京),2011.
[6]梅家祥.64位流核心运算部件的设计与实现[D].长沙:
国防科学技术大学,2012.
[7]潘能刚,曾凡平,曹青.随机测试用例的自动化生成和约简[J].小型微型计算机系统,2011(10):
2035?
2040.
[8]于伽,黑勇,陈黎明.随机测试程序发生器的设计与实现[J].微电子学与计算机,2012(7):
103?
111.
[9]黄思远,邵智勇,于承兴,等.VMM中功能覆盖率收敛技术[J].现代电子技术,2010,33(4):
16?
21.
[10]石君友,王璐,李海伟,等.基于设计特性覆盖的测试性定量分析方法[J].系统工程与电子技术,2012
(2):
418?
423.
[11]朱思良.基于VMM验证方法学的MCU验证环境[J].中国集成电路,2011
(1):
53?
59.
[12]沈海华,卫文丽,陈云霁.覆盖率驱动的随机测试生成技术综述[J].计算机辅助设计与图形学学报,2009(4):
419?
431.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 VMM ALU 验证