随着SoC设计日趋复杂,验证成为SoC设计过程中最关键的环节。本文介绍了Synopsys的RVM验证方法学,采用Vera硬件验证工具以及OpenVera验证语言建立目标模型环境,自动生成激励,完成自核对测试、覆盖率分析等工作。通过建立层次化的可重用性验证平台,大大提高了验证工程师的工作效率。文中以一个SIMC功能模块的验证为例,详细介绍了RVM验证方法学在SoC芯片验证中的应用。
功能验证
一个设计被综合前,首先要对RTL描述进行逻辑功能验证,以确保模块或芯片的功能正确性。通常,RTL级的功能验证主要采用自底向上的验证策略,可分为模块级验证和系统级验证两个阶段。
传统验证方法大多是在信号级的接口上直接与待验证设计(DUT)通信,即用激励直接驱动DUT的引脚,通过检查接口信号的值和变化来达到验证设计功能的目的。这种方法的抽象层次较低,验证平台的开发与DUT的接口协议紧密相关,使得验证平台的重用性较差。如果要做到一个验证平台可以验证多个不同的DUT,必须将验证平台的抽象层次提高到事务级,而且应该构建层次化的结构,层与层之间具有一定的独立性,改变底层并不会影响上层。
基于事务的验证
所谓事务(Transaction)是指设计对象与事务处理器(Transactor)之间通过接口所做的一次数据传输。从硬件的角度来看,事务可看成作用在一个特定接口上的一组信号的集合单元。事务具有3个要素:起始时间、终止时间,以及所有与这个事务相关的信息。
基于事务的验证工具让用户除了可以在信号/引脚级上进行验证,还可以在事务级上进行验证,从而提高了设计生产率。
基于事务验证环境的基本要素
DUT:待验证设计对象的RTL描述或门级描述。
事务:在DUT和事务处理器之间通过接口在特定起止时间内的一次数据传输。事务能够对信号波形进行标识,表示相关的信号属性,还可以标识错误。
事务处理器:也叫总线功能模型(BFM)。事物处理器可以表示事务所代表的信号变化,并与DUT通过接口进行连接。一个典型的DUT往往具有不同的接口,因此一个验证环境中具有不同的事务处理器以产生相关的测试向量对DUT进行激励。
测试例(Testcase):用来产生验证DUT特定功能所需要的事务。
基于事务的验证处理过程
测试例通过特定的事务来调用事务处理器的任务,事务处理器按照DUT所遵循的协议对事务进行处理,经过处理后的事务通过连接DUT的接口输入到DUT中,DUT对输入的激励进行响应。DUT输出的响应再转换为事务的形式,这样验证平台的自核对模块就可以在事务级上对激励和响应进行核对,以检查DUT的功能是否正确。
RVM层次化验证方法学
RVM验证方法学是一种层次化的验证方法学,它能把验证的步骤分层进行,将验证工作提高到更高的抽象层次,即事务层。层次化的验证方法使得验证工程师只需关心DUT的输入/输出接口,而不必关心DUT内部的具体实现。
根据RVM方法学,验证工程师可以搭建出具有随机测试、自动检错核对、功能覆盖等功能的层次化验证平台。这类验证平台包含很多参考模型,每个模型可完成不同的功能。在搭建验证平台的过程中,还可以直接调用Synopsys提供的RVM基类库,其中定义了丰富的标准类。利用RVM基类以及面向对象的技术可以更方便地生成验证平台各个层次的模块。
基于RVM的验证平台分成5层,每层完成独立的功能,层与层通过接口互相连接。RVM验证模型如图1所示。
信号层
信号层提供验证平台与DUT的信号级连接。验证平台通过信号层将上层产生的激励驱动到DUT中。具体实现时,需要定义验证平台与DUT连接的虚端口,当DUT的接口改变时,只需要修改验证平台虚端口中的信号,上层模块不需要修改,方便整个验证平台的重用。
命令层
命令层将信号层的信号抽象为事务,给高层提供DUT的接口与事务的转换。命令层主要包括驱动器模块和监视器模块,与上层模块通过事务级通道连接,与下层模块通过虚端口连接。驱动器完成对DUT激励的驱动。监视器检测DUT的输出,将输出反馈给上层模块。
功能层
功能层模拟DUT的基本行为,将DUT的行为抽象为更高一级的事务。功能层中包括事务处理器模块和自核对模块。事务处理器模块根据DUT所遵循的协议将上层产生的事务进行处理,经过事务处理器处理的事务通过事务级通道传给下层。自核对模块用于对比事务经过DUT处理之后是否符合协议的要求,通常用于检查DUT传输数据的正确性。
激励产生层
激励产生层用于产生对DUT的激励事务。这一层包括产生器模块,该模块产生一系列的事务对象,通过事务级通道传输给下层。RVM支持两种产生器: Atomic产生器,用于产生一组相似的事务对象; Scenario产生器,用于产生顺序可控制的事务对象。
测试层
测试层用于对DUT的逻辑功能进行验证。这一层主要是用户为了验证DUT的逻辑功能而编写的不同测试例,在测试例中可以对各个模块的限制条件进行修改。通过对不同测试例运行结果的统计,可以查看DUT的功能覆盖率,只有功能覆盖率达到一定要求,才能够认为该DUT已经被完备的验证通过。
SIMC模块的功能验证
SIMC是SIM卡控制器的简称,通过SIMC可以在手机基带处理芯片上外接SIM卡,实现数据的发送和接收。SIMC模块连接在系统的APB总线上,ARM微控制器通过APB总线对SIMC进行访问。该模块主要包括波特率产生部分、接收数据的串并转换部分、发送数据的并串转换部分、发送FIFO的控制部分、接收FIFO的控制部分等。发送数据时,SIMC模块会将发送数据寄存器的数据先放到发送FIFO中,再将FIFO中的数据发送出去;接收数据时,SIMC模块将接收到的数据放到接收FIFO中,再由处理器从接收数据寄存器中读取数据。如果接收数据后,判断校验位或停止位出错,则数据不会被放入接收FIFO中,SIMC模块的状态寄存器会有相应的指示。
本文将以一款基带处理芯片的SIMC为例,详细介绍RVM验证方法学的应用。其中DUT的RTL代码用Verilog编写,验证平台的代码用OpenVera编写。OpenVera语言是一种新型的高阶验证语言(HLV)。用OpenVera编写的代码中调用了RVM的基类和库函数,充分应用了面向对象技术。
SIMC模块的RVM分层验证平台结构
SIMC模块的验证平台利用Synopsys公司Vera验证工具搭建,验证平台的搭建遵循RVM验证方法学,代码的编写过程调用了RVM基类库。SIMC模块验证平台结构如图2所示。
图 2 SIMC模块RVM层次化验证模型
信号层
信号层包括定义的虚端口,用于和SIMC模块RTL代码的接口相连。首先定义一个interface变量,该变量中定义的接口对应于SIMC模块的接口信号,interface变量的定义语句中用hdl_node关键字和RTL代码的接口信号相连。定义的虚端口再和interface中的信号绑定。
命令层
命令层包括ARM端的驱动器和监视器、SIM卡端的驱动器和监视器。ARM端的驱动器模仿APB总线,按照协议的规定对DUT进行驱动,SIM卡端的驱动器模仿一个SIM卡对DUT进行驱动。两端的监视器检测DUT的输出数据和驱动到DUT中的数据,将数据保存在自核对模块中进行比较,通过比较来检查DUT传输数据是否正确。
编程实现时,可以通过继承RVM基类库中的rvm_xactor类得到所需要的子类,在子类的代码中加入需要实现的功能。
功能层
功能层包括将SIM卡事务转化为ARM事务的事务处理器、实现中断服务功能的事务处理器、自核对模块。编程实现时,事务处理器可以通过继承RVM基类库中的rvm_xactor得到,在子类的代码中加入需要实现的功能。自核对模块用于比较DUT的激励和响应是否符合要求。
激励产生层
激励产生层包括两个Atomic产生器,两个产生器是同一个类的两个对象。产生器为DUT产生随机激励,激励封装在一个事务中,通过事务通道传到下层模块中。两端的产生器都是产生SIM卡事务的,ARM端有一个将SIM卡事务转化为ARM事务的事务处理器来完成SIM卡事务向ARM事务的转化。通过产生器可以随机产生符合协议规范的激励。编写代码时,产生器可以通过调用RVM的宏rvm_atomic_gen很方便地实现。
测试层
在测试层,用户可以编写不同的测试例对DUT的功能进行验证。在测试例中,通过对约束的限制、环境类的例化、配置类的约束来实现对DUT的功能覆盖,以达到100%的功能覆盖率。
验证平台的重用
对单个模块验证完毕之后可以进行系统级的验证。根据RVM验证方法学搭建的层次化验证平台可以被重用到系统级的验证中。系统级验证侧重于检查各模块间的接口和数据交互是否符合设计规范,某些模块级验证的模块可以被复用到系统级验证中。对SIMC模块来说,系统级验证时,ARM端的驱动器、监视器以及激励产生器都可以被APB总线代替,SIM卡端的各模块可以继续使用,达到重用的目的。
应用RVM验证方法的注意事项与技巧
RVM验证方法学由Synopsys公司提出,利用RVM验证方法学首选的编程语言是OpenVera硬件验证语言。笔者在应用RVM验证方法学搭建验证平台过程中的一些技巧和注意事项归纳如下:
1、 验证某个模块前,首先要阅读相关文档,熟悉模块的功能特性,然后搭建验证平台的基本框图,选择RVM的相关技术,在验证平台基本框图指导下编程实现。
2、 验证平台中功能覆盖点的定义是验证成败的关键,验证过程中利用RVM的覆盖率驱动技术,分析所定义的覆盖点的覆盖情况,改善该验证平台,每个功能覆盖点都必须被覆盖到。
3、 RVM基类库提供了丰富的函数,但是Synopsys没有开放RVM基类的源代码,所以验证代码的编写过程中应随时查阅RVM文档,尽量使用RVM基类提供的函数,而不是自己去重新开发一个函数。
4、 RVM验证平台中各个模块之间通信有很多种方法,可以用RVM的callbacks类,也可以使用双通道等。
5、 RVM为验证平台中的进程间通信提供了多种数据结构,例如semaphore、region、mailbox等,编程时应根据需要进行选择。 例如,在某一时刻有多个并行的进程对同一个信号进行驱动,仿真工具会停止仿真并打印出错信息。解决的方法是应用semaphores数据结构,每个进程得到semaphore才可以驱动信号,对信号驱动后再释放semaphore供其他进程使用。
6、 如果要打印信息,应使用rvm_log类而不是printf()函数。rvm_log类除了将信息打印出来,还可以显示出信息来源于验证平台中的哪个模块以及该模块的仿真时间,便于编程人员调试代码。
7、 随机激励的产生不是真正意义上的随机,而是一种伪随机。编程人员在多次运行同一个测试例时应改变验证平台的随机种子,可通过调用srandom()函数来实现。
结语
用RVM验证方法学搭建的层次化验证平台将大大提高验证环境的执行效率。RVM验证方法学中的随机测试技术可以在很短的时间内达到更高的功能覆盖率,提高验证工程师的工作效率,达到有效缩短验证周期的目的。
参考文献
1.[美]PeterPaterson.系统芯片(SoC)验证方法与技术[M].孙海平,丁健译.北京:电子工业出版社,2005. 16~20
2.张亚楠,申敏,游敏惠.基于RVM的可重用测试方法及应用[J].重庆邮电学院学报, 2006,18(3):303~306
2.Synopsys Inc. Reference Verification Methodology User Guild.http://www.synopsys.com/