>
首页 » 技术文章 » E_language在模块级功能验证中的应用

E_language在模块级功能验证中的应用

作者:刘君  时间:2006-12-04 19:01  来源:电子设计信息网-www.edires.net
摘要:随着SoC运算能力和控制复杂程度的飞速发展,功能验证已经成为整个设计过程中的主要瓶颈,为此,新的验证方法学和验证技术在不断发展以突破这种限制。本文介绍了一种基于高级验证语言E_language的验证技术,以及这项新技术在SoC的RTL级模块验证中的具体应用。

关键词:高级验证语言;E_language模块级验证参考模型验证环境

1 引言

集成电路工艺的发展,为设计复杂度的提升提供了可能,但设计复杂度的提升的同时也使设计者必须解决另一个难题——设计的正确性。SoC作为大规模集成电路工艺发展的产物,随着其运算能力和控制复杂程度的飞速发展,功能验证已经成为整个设计的主要瓶颈,据统计,验证在设计周期中所占比例为50%~70%,验证的难度随设计复杂度呈指数增长。要突破这个瓶颈,就必须探索新的验证方法和技术,高级验证语言(HVLs)应运而生。E_language(IEEE 标准验证语言)就是一种HVLs,本文介绍了SoC的RTL级验证中,一个基于E_language的模块级验证环境搭建方法。

2 基于E_language的验证环境

所谓基于模拟的验证,就是通过施加焦点或随机测试向量,而后观察输出结果来验证设计。目前,它仍然是SoC验证中最常用的方法。但是,要得到满意的覆盖率,通常需要非常大的测试集合。因此,基于模拟的验证方法必须要解决两个关键的问题:一是如何高效率、高质量地生成测试激励,二是如何实现结果自动检查和测试的可回归性。
传统的验证方法是,设计或者验证者根据设计对象所实现的功能,编写相应的焦点测试激励,然后手工检查设计行为的正确性,同时结合代码覆盖率分析,来编写下一步的测试激励。但是,传统方法无法实现验证环境的重用和结果的自动检查,于是,随着需求发展,验证专用语言HVLs出现了,其中的E_language 提供了一种面向事务的编程方法(Aspect Oriented Programming),即通过编写说明性语句而非过程性语句搭建验证环境。E_language根据任务不同将验证环境划分成激励生成、激励驱动、结果检查、覆盖率分析等相对独立的部分,每种任务由一个基件负责完成。用这种方法搭建的验证环境,对不同抽象层次、不同规模的模型具有可重用性,并能有效地解决上述两个问题。 基于E_language 的验证环境能够完成以下五项功能:

(1)激励生成
编写伪随机生成引擎是E_language在验证环境中最重要的应用。用户通过描述规则重用、权重,定义事件和序列等方式在伪随机基础上加入约束条件,通过写一个test而改变其随机种子的方法生成大量合法的测试激励,且激励生成具有可回归性。

(2)激励驱动
E_language针对用HDL描述的DUT模型设计了一套将激励驱动到DUT模型的机制。对于用C和C++描述的模型,用户还需添加接口代码。

(3)输出采样
类似激励驱动,E_language设计了一套DUT模型的输出采样机制。

(4)结果检查
结果检查可以是基于参考模型的数据检查,也可以是基于算法和协议的协议检查。

(5)覆盖率分析
基于模拟的验证必须依赖于覆盖率分析结果反馈,E_language支持功能覆盖率分析,但其难点在于功能点的提炼和功能点描述的完整性。

3 模块级验证的必要性

SoC的RTL级验证从结构角度来说,可以分为模块级验证和整片级验证两个层次。其中,模块级验证的重点是遍历模块一级的所有功能点;而整片级验证的重点是验证模块之间接口协议的正确性、模块之间各种功能组合的正确性,以及整片的性能指标是否达到设计要求。

伴随着设计规模的增长,整片的状态集呈指数级增长,有些状态在整片的模拟验证中很难达到,而模块级验证可以解决这个问题。同时,模块自身的设计规模和复杂性也越来越高,因此,要提高SoC验证的正确性,就有必要在整片级验证之前进行模块级验证。

4 以SystemC模型为参考模型的模块级验证

自顶向下的设计过程是一个抽象层次逐步细化的过程,通常是在高层抽象模块充分验证的基础上,进入更深层次的设计。对于模块级RTL模型的验证,为了提高验证效率,同时又能重用系统级的验证成果,可以采用相应的系统级模型作为参考模型,比较验证目标和参考模型的关键内部状态来验证模块级模型,并通过增加可比的关键数据结构提高验证的正确性。

下面,以Verisity公司基于E_language的验证开发工具Specman为核心,以一个系统级经过验证的模块级模型(使用SystemC 设计)作为参考模型, 验证对应的RTL级模型(使用NCVerilog 开发)的正确性。 SystemC 是一种用于硬件系统级设计的开发语言,它提供了一套描述硬件所需的节拍、端口和事务调度的机制。

4.1 验证环境的构成
搭建SystemC+Specman+ncverilog的验证环境,以系统级经过验证的模型(SystemC)为参考,验证RTL级模型(Verilog)的正确性。测试激励由Specman在模块驱动规则的约束下随机生成,由Specman控制将生成的激励同时驱动到验证模型和参考模型上,通过比较两个模型的关键内部状态和输出结果来验证RTL级的模型。参考模型使用SystemC-2.0.1版本开发。

4.2 搭建验证环境的关键技术
4.2.1 两个模型的同步
由于参考模型和DUT 的描述语言、抽象层次不同,所以在实时判断正确性的模拟验证过程中,必须解决参考模型和DUT之间的同步问题。本文所述的验证环境由Specman控制两个模型的同步运行,经编译的Verilog模型,由Specman控制在HDL模拟器上的模拟运行,通过在RTL级模块顶层内建一个时钟进行Specman和RTL级模块的同步。SystemC模型则经gcc编译成目标文件后添加到Specman 的运行库中,在Specman 运行时加以调用。这时,可编写一个C++接口文件,定义SystemC模型与Specman的连接函数,并通过它们实现Specman与SystemC之间的通讯和同步。Specman在每个时钟周期调用C++接口文件中的cycleSC()函数,该函数驱动SystemC模型的时钟信号发生一个周期跳变,从而实现SystemC模型与Specman的同步运行。

4.2.2 模型的驱动
由于系统级模型和RTL 级模型采用的描述语言不同,定义接口信号的数据类型不同,为了对两个模型同步施加相同的激励,需对Specman生成的随机激励进行数据转换后再送往SystemC模型。同理,为比较结果,需转换RTL级模型输出结果的数据类型,使之与SystemC模型输出的数据类型相同。由于Specman对C语言接口支持的不完善,实现Specman与SystemC模型的接口是搭建该验证环境的难点。

验证之前分别改造两个模型的接口,使之符合与Specman的连接规则。
(1)Verilog 模型的接口改造和连接
首先,建立一个顶层模块,在其中例化模块A,把原来Verilog顶层模块的接口中的参数都定义为模块内部变量,并连接到验证对象的输入和输出端口;然后,在顶层模块内建一个时钟CLK,作为整个验证环境的节拍驱动,根据需要还可以同时建立多个辅助时钟;最后,编写运行脚本,以实现Specman和ncsim的正确连接。
(2)SystemC 模型的接口改造和连接
在SystemC 顶层模块中,对应每个接口定义静态接口信号,并将这些静态接口信号连接到模块的相应接口;而后再对应静态接口信号,在顶层模块中加入相应的静态变量,以接收从Specman传送过来的激励,从而实现对静态信号的赋值操作: datastatic variable static signalmodule interface改造完模型接口,就可以进行Specman与两个模型的连接。考虑到模块的完整性, 划分SystemC参考模型时通常会包含多个子模块。首先,通过修改接口和内部调用合并子模块;然后,新建一个C++接口文件,定义与Specman 的连接函数。在Specman 的E 程序里添加这些连接函数的声明,Specman就可以通过调用这些函数实现Specman和SystemC之间的通讯了。在每拍传递输入、输出数据时,可采用相应的结构体(struct)将SystemC模块的所有输入、输出接口对应的变量都定义在该结构体内部,在每一拍SystemC和Specman间传送该结构体(如附图所示)。最后,编写运行脚本,实现SystemC程序的编译及Specman和SystemC的连接。


附图 验证环境中数据传递示意图

4.2.3 结果比较
可以将两个模型每拍的输出信号和内部关键状态输出到文件中进行比较,或使用Specman的数据检查语句进行实时比较。

5 结束语

E_language是当今国际流行的测试语言,采用这种语言编写模块级验证环境只是其应用的一个方面,E_language还具有支持编写序列库生成引擎、代码重用性等其它特性, 灵活使用E_language,可以进一步提高SoC验证的效率。

相关推荐

E_language在模块级功能验证中的应用

在线研讨会
焦点