实验证明,该方法简单、快捷、可靠,能保证验证功能覆盖率达到100%,可以节省大量验证工作量,缩短SOC的开发周期,为加快芯片从设计到产品化的过程增加了一道安全的技术保障。
随着IC技术的发展,VLSI技术已进入以片上系统SOC(System-On-Chip)为代表的系统级芯片时代,所涉及的芯片规模越来越大,系统越来越复杂。如何能在整个设计流程中保障系统功能符合设计要求、尽量减少由于纠正错误而重复工作已成为IC设计流程的重点。因此,验证在设计流程中显得越来越重要。验证(Verification)主要作用是保证整个设计工作符合设计规格书(Specification)的要求。设计规格书是设计和验证工作的重点。在过去,一般是用文字描述设计所需达到的要求,这使得规格书常常在理解上模棱两可,且不能由机器识别并进行计算机辅助验证。导致规格书要求的各种功能很难被验证工作全面覆盖。因此,如果能有一种功能强大,语法简洁的语言进行规格书的描述,上述问题就可迎刃而解,PSL/Sugar语言正是在这样的背景下出现的。
精简指令集CPU(RISC)因其结构简单、指令格式固定而广泛应用于网络、通信、多媒体娱乐等嵌入式系统领域中。传统针对RISC的仿真验证方法,一般是通过建立指令集仿真器软件开发平台,将软硬件描述语言统一起来进行仿真验证,加速了SOC的软硬件协同设计,这就是软硬件联合(Co-Verification)设计验证的概念。这样的方法过程很复杂,仿真过程中不但要监控信号的变化,而且要判断变化的类别属性,最后还要根据信号类别判决产生结果。整个过程所需工作量非常大,而且验证的效果很大部分取决于软件部分,功能覆盖率很难达到100%。而本文采用了Cadence公司的IncisiveTM中的LDV5。0中的ABV(Assertion Based Verification)工具,在软硬件联合随机仿真的基础上,通过加入PSL/Sugar语言编写的Assertion代码,对具有MIPS架构的RISC模块进行基于仿真的形式验证,开辟了一条新的RISC模块的验证路径。
PSL/Sugar语言特点
Accellera组织推出的PSL/Sugar语言,其简洁标准的语句既可用来制定规格书,让系统工程师清晰地定义模块的结构功能与属性,又可让设计工程师在设计时准确地领会规格书的含义,还可让验证工程师作为依据,通过动态(仿真)或静态(形式验证)的手段来验证硬件RTL设计模块的功能。以断言形式出现的PSL/Sugar验证程序也可由其他硬件描述语言(HDL)完成,但是,用硬件描述语言写出的断言代码一定是冗长而复杂的,这些代码很容易自身出现缺陷(Bug),从而给验证工作引入更多的麻烦。PSL/Sugur语言采用精简且功能强大的命令集,使动态断言,甚至是极其复杂的断言成为非常简单的任务。由于PSL/Sugar语言来源于硬件描述语言且作用于硬件语言,所以它的语言特点和HDL有类似之处。但它也有区别于HDL的特点:
层次分明:PSL/Sugar语言的抽象结构由4个层次构成。
1)布尔代数层(Boolean Layer),用来构造布尔表达式,是构筑时序表达式的基础。
2)时序层(Temporal Layer),是语言的核心层,用来实现语言的主要功能,即描述设计模块的规格。
3)验证层(Verification Layer),和验证工具紧密结合的语言层,用来指示验证工具验证时序层所描述的模块规格。
4)建模层(Modeling layer),为验证过程所需的测试输入模块或辅助硬件模块建模。
针对不同硬件描述语言,有不同的风格的句法相匹配。
与其他语言有不同的操作符类型区分。PSL/Sugar把操作符划分为:HDL操作符、时钟操作符、时序合成(SERE)操作符、基础语言(Foundation Language)含义操作符、基础语言事件(Occurrence)操作符、结束操作符。
PSL/Sugar语言可嵌入到测试激励文本或设计模块中,也可单独作为约束文件对模块进行验证。
RISCCPU的结构与指令特点
本文基于MIPS32位RISC结构,在Cadence的IncisiveTM平台上,针对其ALU部分进行基于断言的验证。MIPSCPU是典型的寄存器型(Register-Register)微处理器,即除了load/store指令外,其它指令不能直接访问内存。其好处显而易见:寄存器的访问速度比存储器快,寄存器存储使编译器的效率提高,程序执行速度加快;另外,指令空间中用来表示寄存器的位数比用来表示内存单元的位数少,从而可改善指令密度。
RISC硬件实现的结构特点
和其他RISC系统结构类似,MIPSRISC硬件结构主要由运算单元、寄存器组(Register_Band)、指令译码单元(Instruction Decoder)、程序计数器(PC)等组成。其中运算单元是处理器的核心,它接收来自寄存器组、程序计数器或者指令译码单元的源操作数,并将结果送到寄存器组、地址总线、控制寄存器、程序加速器等单元,完成算术、逻辑、移位等运算;程序计数器完成指令地址的自加,将目标指令的地址送到地址总线,实现寻址;寻址获得的指令经过指令译码单元,将操作码,操作数送到运算单元。
指令特点
MIPS32的指令分为如下几类:
●存储访问指令(Load/Store):用于存储器和通用寄存器之间传递数据。
●运算指令:完成算术、逻辑、移位运算。
●跳转/转移指令(Jump/Branch):用于改变程序的顺序执行次序。
●协处理器指令:用于完成协处理器中的操作。
●特殊指令:用于执行一些特殊任务,包括在特殊寄存器和通用寄存器间传递数据,陷阱指令,设置断点等。这些指令均属于寄存器类型指令。
指令格式
MIPS采用的是Register-Register,又叫做Load/Store格式,所有指令的长度均为32位。基本的指令格式如图1所示。
图1指令格式
MIPSRISC的特点是指令执行效率高,大部分指令为单周期指令。本文验证的MIPSRISC模块采用了三级流水线(取指、译码、执行写回),允许多条指令并行执行,充分利用了硬件资源。
RISC的指令虽然简洁高效,但是由于其结构特点和指令多样性所决定,其验证工作仍是极其复杂的,工作量是很艰巨的。单单指令的排列组合就达到无数种,更不用考虑在执行过程中出现的流水线阻塞或者中断与意外事件。若采用常规的验证方法,将严重影响到整个产品的开发周期。PSL/Sugar语言和相应工具的出现无疑是解决了RISC验证工作的一个瓶颈。
基于PSL/Sugar语言的模块行为验证
目前基于断言的验证技术被越来越多的EDA软件公司所认同,许多EDA软件都在仿真和验证工具中嵌入了ABV功能。目前支持ABV的EDA工具有:Cadence公司的IncisiveTM,Mentor Graphics ModelSim,Safelogic的Safelogic Monitor和SafelogicVerifier等。
本文根据PSL/Sugar语言的特点,采用Cadence公司的IncisiveTMLDV5.0中的ABV工具,针对各种指令在RISC内部产生的行为进行验证。验证代码以注释的方式加在模块单元或测试激励代码里。验证工具可辨认这些注释是否包含PSL/Sugar关键字并根据这些断言代码进行验证。
下面分析该MIPSRISC几种指令的ABV行为验证,其他的指令具有类似的验证过程。
●根据各不同运算在ALU单元产生的行为进行验证。如加法指令:R-Type型指令中的操作数OP_OUT=0,操作项FUNC=32的时候(OP_OUT和FUNC为译码单元输入,对应所取指令相应字位段),ALU单元将进行加法运算,在取之指后的第2个时钟周期A_ALU和B_ALU取得操作数,同时在C_ALU得到运算结果;再比如乘法运算指令:当OP_OUT=0,FUNC=24时,ALU将进行乘法运算,在下个时钟周期ALU的乘法器输入start_mltply和do_accum信号为1,再经过18个时钟周期乘法器的输出信号result得到运算结果。如再深入了解乘法器的算法,还可验证乘法器内部寄存器中存储的数据在每个周期的中间计算结果。控制器和ALU以及乘法器之间的信号关系如图2所示。
图2控制器和ALU以及乘法器之间的信号关系(只画出相应的信号)
●测试激励代码的编写
首先采用PERL语言写程序机器码。即利用PERL语言对文件编写与管理的强大功能,循环并参照指令码的格式,在一个空白文档中写入操作数码、源寄存器码、目标寄存器码,操作码,并结合随机函数产生立即数码等。
PERL代码编译执行后,原来的空白文档就成了磁盘文件,磁盘文件里存储的信息就是验证RISC用的机器码。在测试代码中利用$readmemb或$readmemh将磁盘文件中的信息读入Verilog存储器(虚拟ROM)。
最后在测试文件中提供系统信号,如稳定的系统时钟和复位信号,整个系统便可以进行仿真。
●在测试文件中加入PSL/Sugar的断言代码。具体实现验证乘法运算的代码如下:
//Sugar sequencem_begin={(start_mltply==1)&&(do_accum==1)};
//Sugar sequencem_end={result==wor13word2+word3&&mltply_done==1};
//Sugar propertyalu_check=always
//{true[*];m_begin}|=>{true[*17];m_end}
//@(posedge clk);
//Sugar assertalu_check;
以上代码描述如下行为:首先定义两个逻辑时序,第1个时序m_begin定义了乘法器开始工作的条件start_mltply==1和do_accum==1,第2个时序m_end定义了乘法器操作结果result==wor1*word2+word3和mltply_done==1,其中mltply_done==1表示乘加运算已完成。在定义了两个时序的基础上,我们给ALU的乘法器单元描述了一个属性alu_check,即当时序m_begin发生的条件下,经过17个周期后,在第18个时钟周期时序m_end发生。其中true[*17]表示无关事件,意思是在17个周期内,不考虑模块的信号发生什么变化。从上面的代码可以看出,PSL/Sugar代码语法简单、易懂,用短短的几行代码就能验证RTL模块的复杂逻辑。
实验结果
在CadenceLDV5.0的ABV验证工具中,Assertion验证可以以波形的形式来展示,使验证工程师易于发现设计的错误并及时纠正设计模块的行为。图3是实现验证乘法运算的Assertion和有关信号同时展示在波形图里的情况。图中alu_check是验证波形,其他是乘法器的仿真信号波形。
在图3基础上,经过特意修改Assertion使得验证产生错误,如图4显示。由图4可看出,在验证产生错误时,会有打叉的记号,且错误事件按递增的数字标注,极大地方便了设计工程师对模块进行查错并纠正。如能在撰写规格书时就采用PSL/Sugar语言,就可直接把规格书作为验证代码,和设计的模块与Testbench一起直接输入到ABV验证工具里进行验证。毫无疑问,这样的验证工作达到的功能覆盖率一定是100%的,使得验证流程中还可以省却功能覆盖率检测这一步骤。
图3正确的验证波形
图4查出错误事件的验证波形
结论
随着芯片制造不断朝着超大规模方向发展,需要在设计阶段采用各种高效、简便的验证手段来保障设计的正确性。 本文成功利用了PSL/Sugar语言结合软硬件协同设计的方法对RTL级RISC模块进行ABV验证,实验证明,该方法简单、快捷、有效,保证验证的功能覆盖率达到100% ,与传统的软硬件协同验证的方法相比,可以节省大量工作量,大大缩短产品开发周期,为加快芯片从设计到产品化的过程增加了一道安全的技术保障,充分表明了该RISC模块验证手段在片上系统SOC高速发展的今天具有较大的应用价值。