SystemVerilog中的随机化激励
中国集成电路
ChinalntegratedCircult
设计
SystemVerilog中的随机化激励
神州龙芯集成电路设计公司
杨鑫
徐伟俊
陈先勇
夏宇闻
摘要:随着集成电路的验证工作日渐复杂,对验证的可靠性提出了越来越高的要求。传统的验证工作中也使用随机化激励以便减轻测试代码编写的工作量,以提升验证的可靠性。在SystemVerilog更强调了利用随机化激励函数以提高验证代码的效率和验证可靠性的重要性。本文以VMM库为例,阐述了如何在SystemVerilog中使用随机化函数来编写高效率的测试代码,重点介绍了可重用验证函数库的使用方法,以帮助读者理解如何使用SystemVerilog高效率地完成复杂的设计验证。关键字:VMMSystemVerilog激励随机化
1.前言
随着电路工艺设计技术的不断发展,集成电路的逻辑设计变得越来越复杂,随之对验证工作提出了更高的要求。由于投片(tip-out)的费用较高,很有必要在投片前对芯片设计进行全面、可信的验证,以尽量减少“设计———测试———投片———调试———发现Bug修改设计”这一流程的迭代次数。因此在集成电路芯片的设计中,尤其是复杂逻辑设计中,对测试工作的效率和可靠性提出了更高的要求。
在传统的验证方法中,也有将激励随机化的方较全面的法,这样可以用较少的测试代码生成较多、测试激励。这些方法减少了人为因素的干扰,能有效地提高验证的工作效率和可靠性。
在SystemVerilog中,强调在验证中使用可重用的验证IP,包括如何生成随机化激励。对于如何尽可能地使用已有的验证IP,以及编写符合标准的可重用验证组件,SystemVerilog提供了一整套的工作
:机制,这使得符合规范的随机化激励组件能够很好地在多个设计间复用,这更进一步地提高了验证工作的效率和可靠性。
2.在验证中使用随机化激励
在验证中,可以依照DUT(DesignUnderTest,被测设计,以下简称DUT)的验证要求来设计定向的激励,并对照DUT的预期响应,用人工的方法来判断设计是否正确。但也可以使用随机化激励来驱动DUT,并使用特定的机制来完成响应的自检测。
利用随机化来产生激励可以看作一种近似的自动化激励产生,因为随机化足够长的时间后,所生成的激励可以覆盖绝大部分的待验证特性。但是纯粹的随机化激励效率并不高,因为其中正确的,或是有意义的激励只占很少一部分。必须使用一定的约束条件限制随机化的范围,从而产生大量随机而有意义的激励。
2007・10・(总第101期)
37
设计
中国集成电路
ChinalntegratedCircult
(Transactor),以及为事务处理器提供DUT驱动的
3在SystemVerilog中
使用随机化激励
SystemVerilog极大地扩展了验证的编写方式,SystemVerilog引入了面向对象的概念,强调基于已
有验证库或验证IP,按照面向对象的方法编写可重用的验证组件。
驱动(Driver)等。事务处理器和相关驱动是与DUT相关的,提供了测试平台对DUT的抽象和底层信号连接。激励生成器则是测试平台中的激励源,编写适当的激励发生器,就能够方便灵活地产生各种所需的激励。
3.2数据与事务
传统的测试中,数据(data)和激励事务(trans-
VMM(VerificationMethodologyMaunulforSys-temVerilog,以下简称VMM)是由Synopsys公司推
介的一套SystemVerilog验证解决方案,其中提供了
action)一般是一一对应的简单映射关系,这样使得
数据(data)不仅难于使用,而且不易维护和更改。在SystemVerilog中,事务(transaction)被看作是一个对象,使用面向对象的思想来封装数据,这既增强了数据的稳定性和可靠性,而且使事务的相关数据可以灵活地扩展或更改。
在VMM中,提供了基类VMM_DATA作为所有数据型类的基础,利用它我们可以方便地封装所需的数据,例如我们可以声明一个简单的事务
VMM库以供用户在VCS环境下使用。下文将结合VMM的使用,阐述在SystemVerilog中如何使用随
机化激励。
3.1VMM的验证结构层次
VMM使用了一套层次化的验证结构,它将整个
验证分为测试、验证平台和DUT三个主要部分,各个分立的测试(Test)通过一个相对稳定的验证平台(Test-Bench)来完成对DUT的测试,其总体结构如下图所示:
bus_trans,用来表示一次总线传输:enum_trans=READ,WRITE;classbus_trans
randrandrandrandendclass
在该例子中,所有属性都被标识为可以随机化———即标明了类型:rand。实际上如果没有特殊需求,应当将事务的所有属性都应将其标识为可随机化,这是为了能够让激励生成器能够最大限度地生成各种类型的事务。同时所有的事务属性都应当是
extends_trans
vmm_data;
Trans;
Addr;Data;
bit[7:0]ChipSel;bit[19:0]bit[31:0]
在整个结构中,测试平台是最为关键的部分,它负责响应测试的控制,对DUT施加激励,收集DUT的响应,并根据预期值判断、统计和报告测试情况。其内部也分为若干层次,其中在激励的施加路径上,包括用于产生事务级激励的激励发生器(Genera-
共有属性(Public),这样才能通过外部来引用或改变事务的各个属性。
在事务的类声明中,可以根据需要添加一些约束,以便保证所生成的事务是所需要的。例如可以在上述例子的事务中加入一个约束,以要求片选信号
tor),用于接收和处理、解析事务的事务处理器
ChipSel只能取1、8、16三个值:
(101期)
2007・10・
中国集成电路
ChinalntegratedCircult
设计
classbus_trans
…
extendsvmm_data;endtaskendclass
constraint16};}endclass
chip_select{ChipSelinside{1,8,
这样就可以产生并随机化事务,然后将其通过通道传输到下游的事务处理器。
但是,使用这种简单的实例化方的激励发生器仍然不够灵活,其中一个主要问题是:如何通过激励发生器为事务添加新的约束块。通过添加新的约束块来产生必须的激励事务是非常有效的控制方式,但采用上述控制方式的激励发生器要做到这一点却并不容易。因为对于这种激励发生器,如果需要添加这将极新的约束,就必须改写激励发生器的源代码。大地影响其使用的灵活性。
因此这里需要使用面向对象思想的又一思想:工厂模式(factoryPattern)。使用工厂模式的思想来建立激励发生器,使之成为一个生产“事务”的“工
事务的约束中有些是必须遵守(must-obay)的,例如要求某些属性必须为非零等,这些约束是不能被关闭(turn-off)的,而其他的约束则是应当遵守(should-obay)的,在必要时,可以通过一些操作将其关闭,这些需要根据具体需要来指定。
在测试平台的编写中,事务的定义很重要,只有恰当地定义各种事务,才能有效地完成测试。在编写事务类时,可以利用其各种面向对象的特性,例如可以使用继承和派生的方式衍生出新的事务类,在需要时重载或重写约束以达到新的边界情况等。
3.3使用工厂模式的激励发生器
事务的实例化和随机化都是在激励发生器中完成的,在编写激励发生器时,需要控制激励事务的产生和约束控制等,以便在适当的情况下产生适当的事务。激励发生器的编写也应该使用面向对象的思想,将事务和相关的操作封装到一个类中。以便于管理和使用。
在VMM中,提供了基类VMM_XACTOR,用来封装所有与事务处理相关的对象。激励发生器应当从VMM_XACTOR派生得到,而与此相关的事务处理器等也应从VMM_XACTOR派生而来。例如,可以声明如下一个最简单的激励发生器:
厂”,而生产所需的“原料”则由更高层次的测试来控制和提供。例如,编写形如下面所示的激励发生器:
classbus_master_factoryextendsvmm_xactor;
bus_transtrans=new();tastrun();while(run)beginbus_transtr;
void=trans.randomize();¥cast(tr,trans.copy());process(tr);endendtaskendclass
该激励发生器在运行时将会不断地将其属性
classbus_masterextendsvmm_xactor;
…
tastmain();
foreverbeginbus_trans
trans=new();
void=trans.randomize();this.chan.put_t(trans);end
trans随机化,然后将随机化的结果复制成一个新的
实例,最后将这个新复制的实例经过处理发送到下游。在整个流程中,其起点是类属性trans,该属性在该激励发生器实例化时会自动实例化,但是,在启动任务run()之前,外界,也就是更高层次的测试是
:2007・10・(总第101期)
39
设计
中国集成电路
ChinalntegratedCircult
可以将其替换成其他新实例的,只要新实例是属性
4受控随机化激励生成
依照所需激励的不同,可以编写出各种不同的
trans所属类bus_trans的同类实例或派生类实例即
可。
这样的话,如果需要加入新的约束,只需派生出相关的新类,在新类中加入所需约束,并用新类的实例替换工厂实例即可得到所需的效果。例如,在下面所示的例子中,根据原有的事务类派生出了新类,并在新类中增加了约束,最后在测试中替换了原工厂实例:
激励发生器,其具体形态和复杂度也相差很大。在
VMM中,根据激励发生器的特性,可以将激励发生
器大致分为:基元发生器(AtomicGenerator),场景发生器(ScenarioGenerator),多流发生器(Mu-
til-StreamGenerator)以及基于状态的发生器
(State-DependentGenerator)。下面就简要介绍一下各种发生器的特点和基本用途。
classmy_bus_transextendsbus_trans;
constraintnew_constraint{addr[19:18]=0;}endclassprogramtest
verif_envinitial
env;begin
4.1基元发生器
基元发生器是最简单的激励发生器,它用于生成的相互独立的数据项和事务。也就是说,在基元发生器所产生数据项序列或是事务描述符序列中,每个数据项或是事务描述符与其前后项都是相互独立的。用基元发生器来产生激励就好像调用了一个随机函数,只不过返回的是一个复杂的数据结构而非一个标量。
基元发生器的描述和使用都非常简单,实际上本文之前举出的例子就是一个基元发生器。但是基
env=new();env.build();begin
my_bus_transendenv.run();endendprogram
在该例中,在验证环境完成初始化之后,整个验证环境运行前,
使用my_bus_trans类的实例
my_trans=new();
元发生器太过于简单了,实际上在实际应用中,如果需要产生一个真正有意义的序列,一般都要求发生器能够根据序列的前后项来约束随机激励。只有在产生一些非常简单的数据或事务时,才可以使用基元发生器来完成。
env.src[0].trans=my_trans;
4.2场景发生器
与基元发生器相比,场景发生器能够产生更为复杂的数据序列或是事务描述符序列,这得益于它使用了称为的数据结构。场景发生器“场景描述符”和基元发生器是很相似的,事实上可以说它们是一样的,而唯一的不同在于被随机化的对象的种类:基元发生器是直接随机化数据项或是事务描述符,而场景发生器则是随机化包含有数据项和事务描述符的场景描述符。
通过应用面向对象的方法,场景描述符也被封
my_trans替换了验证环境env中的激励发生器src[0]的工厂实例trans。
使用工厂模式的激励发生器大大提高了激励发生器使用时的灵活性,激励发生器应尽量使用工厂模式。
(101期)
2007・10・
中国集成电路
ChinalntegratedCircult
设计
装成类。但值得注意的是,实际中是使用场景描述符的不同变体(variation)
来描述不同的场景。在
流,不过其生成过程也是非常复杂的,有时候可以将整个生成过程分解成若干个步骤来进行,以便能够更方便地描述或是表达相关约束。
VMM中还将给每个场景分配一个唯一的场景标识
(scenario_id),以区分每个场景。
在实际应用中,还可以通过描述过程性的场景、手动控制激励流向等方法来加强对激励序列的控制,因此场景发生器的编写是非常灵活多样的。但是VMM推荐使用预定义的宏vmm_scenario_gen来创建场景发生器,以便生成的场景发生器具有标准化的结构形态。
4.5发生器的选取
每种发生器都具有自身的特点,需要根据不同的应用场合来选取不同的发生器。在整个验证环境中,各种配置信息一般仅在最开始的时候生成一次,这些最简单的数据不需要很复杂的生成规则,完全可以使用基元发生器来完成。而在一般的应用中,都可以使用场景发生器来生成所需激励,在大部分的情况下,都不需要使用多流发生器。如果所需激励需要遵循特定的协议状态,那么就必须使用基于状态的发生器。
4.3多流发生器
一般来说,单个场景发生器只能生成一个激励数据流,如果激励需要多个激励数据流的配合,相关约束就必须跨越多个数据流,这时就需要多流发生器。多流发生器能够产生多个数据流,同时能够在它们之间的配合上加上约束。
实际上多流发生器与单流发生器(如场景发生器)是非常类似的,只不过多流发生器拥有多个输出通道而已,而单流发生器实际上也可以通过编写一些过程性的手动处理将数据流分配到多个输出通道。
5.总结
本文结合VMM介绍了随机化激励在Sys-
temVerilog中的一般概念和基本分类,并结合其具体
实现,简单地分析了各部分的基本特性,以便读者能够对其有基本的了解,学会简单的使用。熟悉并掌握
SystemVerilog中随机化激励的使用,能显著地提高
4.4基于状态的发生器
当所需的激励序列不能通过预先的描述完全确定下来,而是需要根据运行时的各种状态参量来决定,那么就需要使用基于状态的发生器。要让随机化过程依赖于外部的状态信息,传统的做法是将外部状态数据以代码的形式潜入到发生器本身,这样如果需要修改规则以生成新的激励,则须要修改代码本身。
让激励发生器的随机化生成工程能够基于外部状态来进行,可以采用的方法有很多,例如可用在编写数据模型或事务描述符时,加入所有必要的信息,这些信息的来源有很多,可以包括但不限于DUT配置信息,接口信号值,内部状态或是协议状态描述符等。
基于状态的生成器能够生成非常复杂的激励
复杂数字系统的验证效率和可靠性,必将推动我国
CICIC设计事业的发展参考资料
[1]IEEEStd1800TM-2005IEEEStandardforSys-temVerilog—UnifiedHardwareDesign,andVerificationLanguage
[2]JanickBergeron&EduardCerny&AlanHunter&AndrewNightingale《VerificationMethodologyManualforSystemVerilog》Springers2006Synopsys,IncandARMLimited
[3]《VerificationMethodologyManualTutorial》2006.6SynopsysInc
[4]夏宇闻《Verilog数字设计教程》北京航空航天
大学出版社2003
2007・10・(总第101期)
Specification,
:41