基于System Verilog的可重用验证平台设计及验证结果分析

FPGA/ASIC技术

190人已加入

描述

采用System Verilog语言设计了一种具有层次化结构的可重用验证平台,该平台能够产生各种随机、定向、错误测试向量,并提供功能覆盖率计算。将验证平台在Synopsys公司的VCS仿真工具上运行,并应用到包交换芯片的仿真验证中。仿真结果显示,新设计的验证平台能通过修改随机信号约束条件和产生随机信号的权重值,使芯片的功能覆盖率达到100%。随着集成电路制造工艺技术水平不断进步,芯片设计规模越来越大,验证所花费的时间占据了整个产品设计周期的70%,而且随着设计复杂度的提高呈指数性增加[1]。芯片一次流片的成功率从很大程度上取决于功能验证是否充分[2]。因此,验证已经成为制约芯片开发的瓶颈问题。

传统的验证平台主要依赖验证人员观察波形的方法进行验证,验证效率低,不能满足当今验证规模的需求。VMM验证方法学[3]的出现极大程度上提高了验证的效率,进而出现了一批借鉴VMM验证方法学的验证平台[4-7],如参考文献[4]所设计的验证平台就采用了VMM验证技术。但是其设计的验证平台只产生了随机激励,验证时仅使用随机激励很难测试到电路的边界情况,而且验证过程收敛性差。

为了快速定位设计中的问题及边界情况,同时提高验证效率,本文拟采用System Verilog语言,根据VMM验证方法学中的分层设计思想,搭建一个可重用的验证平台,以求同时提供定向测试、受约束的随机测试和错误激励测试。

1 平台框架

验证平台可分为4层,即测试层、建立层、事务层和物理层,如图1所示。

数据

(1)物理层:包括被测设计模块(DUT)集合和电路模型。

电路模型用来与被测代码进行比较,以实现自检验的验证。采用Verilog语言或者System Verilog语言模拟与设计代码等价的功能。

(2)事务层:包括激励产生器、监视器、和覆盖率统计器等。

激励产生器的主要功能是驱动DUT和电路模型的接口信号。本平台的激励产生器能够产生定向测试向量、错误测试向量和受约束的随机向量。

监视器的主要功能是监视DUT和电路模型输出的信号,并对两者进行比较。当DUT的输出信号和电路模型的输出信号不一致时,仿真可能被强迫结束,同时打印出当时出错的时间和出错的信号名称及内容。

覆盖率统计器的主要功能是根据激励产生器产生的测试向量、DUT输出信号以及覆盖点的要求统计出电路功能的覆盖概率。覆盖点是一种有效的验证机制[8],它的编写根据具体的测试对象而定,可以对单个信号进行功能覆盖率统计,也可以统计多个信号的交叉覆盖率。

以上介绍了事务的类型,根据不同的测试需求可以创建各种平台所需的事务,如随机事务、各种回调函数事务等。

(3)建立层:包括验证框架的建立和电路初始配置。

验证框架建立的主要功能是利用事务层的各种事务构建出整个平台的框架。包括平台环境的配置及参数的设定;激励产生器和监视器的句柄定义和对象声明;与覆盖率相关的回调函数类的句柄定义和对象声明;激励产生器和监视器与回调函数的通信建立。本平台还研发了面向通信交换设备的配置软件和专用的图形界面。

(4)测试层:包括配置文件和测试用例。

在平台搭建好之后,测试层的主要功能是提供定向测试的测试实例和与DUT相关的一些配置信息。例如对高性能路由器转发单元进行验证时,需要通过微机接口对转发单元进行配置,不同的配置参数DUT将会提供不同的功能。本文设计开发了面向定向测试的数据块/包的软件辅助工具。测试人员可以使用辅助工具来产生所需要的数据。

2 通信交换设备验证平台

2.1 交换功能介绍

本文假定所测试的交换设备具有N个输入/输出端口,这里N通常是2的整数次幂,考虑到内部复用,这N个端口可以映射到k组总线,每m=N/k个端口分时复用一组总线,k 2.2 验证平台

验证平台需要按照数据包/块格式的要求提供各种不同类型、包长、优先级、源端口和目的端口,以及包含其他参数和配置的网络数据包,同时能够根据各个端口输出的数据包个数计算出该端口的速率,以此来产生链路的忙/闲状态,模拟配置规定的速率和其他要求。

根据层次化结构,并结合交换设备的功能,对验证平台进行了详细的设计。

(1)物理层:DUT采用Verilog语言编写,电路模型采用System Verilog编写,编写过程不是设计的重点,所以这里不再进行叙述。

(2)事务层:根据功能描述可知,如果要从端口处进行验证,本验证平台需要N个激励产生器,用于产生来自N个输入端口的数据包/块,还需要N个监视器来观察N个输出端口的数据包/块。如果要从总线处进行验证,则需要k个激励产生器和k个监视器用于监视来自电路模型和DUT的k组总线上的输出数据。这里,每个激励产生器需要模仿m=N/k个端口及其速率,每个监视器需要记录m个端口的输出。同时还需要一个覆盖率统计器用于统计激励产生器产生的所有情况下的数据包。

①激励产生器:将激励产生器定义为一个类,该类的属性包含了虚接口的定义、待发送包的队列定义、激励发生器编号和回调函数队列定义等,此外还包含了运行方法、定向测试、随机测试、端口速率配置方法、定向包入队方法、定向包驱动方法、随机包产生方法、随机包入队方法、随即包驱动方法和丢弃概率计算方法等。

其中定向测试的测试流程如图2所示。

数据

首先调用端口速率配置方法对所有N个端口的速率进行配置,然后调用定向包/块入队方法,根据测试层的测试实例进行定向包/块的入队操作。按照发送时序要求将定向包依次驱动到DUT的输入端口上,直到发送完所有的定向包,并触发随机包产生事件,然后宣告定向测试结束。测试中在包与包或者块与块之间引入了受约束的随机时延。随机时延的范围采用辅助工具进行配置。在测试层不仅能使用随机数据,还能使用随机时延,从而最大限度地验证被测电路的功能和时延正确性,保证了被测模块的鲁棒性。

随机测试流程如图3所示。首先为每个端口或者总线设置一个数据结构和包/块的队列。产生的数据包/块先被送入相应的队列。然后为每个输入端口的队列预存入一个数据包,等待随机事件被触发。当随机事件被触发后,程序分为两个分支:分支一用于产生随机数据包并进行入队操作;分支二用于调用回调函数,产生错误指示信号,根据错误指示信号丢弃该包、或者发送错误的数据信息、又或者正常发送该包。当发送完一个数据包后再次调用回调函数进行覆盖率的统计;最后判断是否结束随机测试,如果结束,则退出测试。否则重复上述操作。分支一和分支二之间通过事件进行同步通信。

数据

②监视器:监视器的类结构与激励产生器相近,其中包含了属性(虚接口的定义、监视器编号、回调函数队列等)和方法(数据结果比较、端口速率计算)。数据结果比较方法将DUT和行为模型的有效输出数据信号进行比较,如果输出结果不一致,则可能停止仿真,并打印出当前仿真的时间和错误数据信息;如果输出结果一致,则调用回调函数进行覆盖率的统计。端口速率计算方法的主要功能是统计每个端口输出的数据包,根据数据包个数产生相应的链路空/闲指示信号。

③覆盖率统计器:覆盖率统计器的类结构与激励产生器的类有所不同,其结构由属性、方法和覆盖组构成。属性主要是为进行覆盖率统计而定义的一些中间变量;方法为进行覆盖率统计准备数据,这些数据涉及到相应的覆盖点,并调用采样函数,进行覆盖率统计操作;覆盖组由多个覆盖点组成,首先定义多个独立的覆盖点。然后根据具体的情况将这些独立的覆盖点进行交叉覆盖率计算定义,如cross packet_type、packet_dport等。

(3)建立层:建立层定义为一个类,该类由属性和方法构成。属性包含了m个激励产生器和m个监视器的句柄定义、m组总线的虚接口定义、覆盖率类的句柄声明等。其方法包含了建造方法、DUT配置方法和运行方法。其中建造方法用于对m个激励产生器和m个监视器进行对象声明,同时将回调函数压入激励产生器和监视器的回调函数队列中。DUT配置方法的主要功能是按照微机接口时序利用测试层提供的配置文件,对电路进行初始配置。运行方法主要的功能是启动m个激励产生器和m个监视器的线程,这里采用fork join_none语句实现。

(4)测试层:按照数据包的格式要求编写定向测试向量文件,同时提供电路的各种配置参数文件。

最终搭建好的验证平台如图4所示。

数据

3 验证结果和分析

本文的验证平台搭建在Sysnopsys公司的VCS仿真平台上,使用了DVE环境。运行结果如图5所示。可以看出本平台能够按照DUT输入数据信号的要求产生正确的输入信号,并能够按照一定的概率产生错误的数据。同时,当DUT和电路模型输出的数据不一致时,验证平台能够强行停止仿真过程,并打印错误信息。该错误信息包括了错误信号及错误信号产生的时刻等,这些信息能够帮助设计人员快速地定位错误,从而提高验证效率。

数据

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分