在现代IC设计流程中,当设计人员根据设计规格说明书完成RTL代码之后,验证人员开始验证这些代码(通常称其为DUT,Design Under Test)。验证工作主要保证从设计规格说明书到RTL转变的正确性,它包括但不限于以下几点:

  • DUT的行为表现是否与设计规格说明书中的要求一致

  • DUT是否实现了设计规格说明书中的所有功能

  • DUT对于异常状况的反应是否与设计规格说明书中的一致

  • DUT是否足够稳健,能够从异常状态恢复到正常的工作模式

图1 验证发现DUT中的bug

随着芯片规模的增大,验证占整个芯片设计流程的比例越来越大,验证的工作量已经占到整个SoC研发周期的70%到80%。因此,提高芯片验证的效率已变得至关重要。快速搭建一个强大、高效、灵活、可扩展性好的验证平台是芯片成功的关键。

1  UVM代表了验证方法学的发展方向

验证是服务于设计的,目前来说,主流的设计语言有两种:Verilog和VHDL。伴随着IC的发展,涌现出了多种验证语言,如Vera、e、SystemC、SystemVerilog等。其中,SystemVerilog刚一推出就受到了热烈欢迎,SystemVerilog是一个Verilog的扩展集,它既完全兼容Verilog,又具有所有面向对象语言的特性:封装、继承和多态,同时,还为验证提供了一些独有的特性,如产生带约束(constraint)的随机激励。在基于SystemVerilog的验证方法学中,主要有以下三种:

  • VMM(Verification Methodology Manual),这是Synopsys在2006年推出的; VMM中集成了寄存器解决方案RAL(Register Abstraction Layer)。当OVM出现后,面对OVM的激烈竞争,VMM已经开源

  • OVM(Open Verification Methodology),由Cadence和Mentor于2008年推出;从一开始就是开源的。它引进了factory机制,功能非常强大,但是它里面没有寄存器解决方案,这是它最大的短板。针对这一情况,Candence推出了RGM,补上了这一短板。只是很遗憾的是,RGM并没有成为OVM的一部分,要想使用RGM,需要额外下载。现在OVM已经停止更新,完全被UVM代替

  • UVM(Universal Verification Methodology),其正式版是在2011年2月由Accellera推出的,得到了Synopsys、Cadence和Mentor的一致支持。UVM几乎完全继承了OVM,同时又采纳了Synopsys在VMM中的寄存器解决方案RAL。UVM继承了OVM和VMM的优点,克服了各自的缺点,代表了验证方法学的发展方向


图2 验证方法学的发展

2  UVM验证平台的基本组件

UVM是一个以SystemVerilog类库为主体的验证平台开发框架,验证工程师利用其可重用组件可以构建具有标准化层次结构和接口的功能验证环境。UVM验证方法学有效结合了测试激励随机生成、自测试平台和随机化约束等方法,它采用最佳框架以实现覆盖率驱动的验证,使验证工程师通过采用高级验证技术来降低风险,满足缩短产品上市时间的迫切需求。

UVM是一个库,在这个库中,几乎所有的东西都是使用类(class)来实现的。类是面向对象编程语言中最伟大的发明之一,是面向对象的精髓所在。使用UVM的第一条原则是:验证平台中所有的组件都应该派生自UVM中的类。当要实现一个功能时,首先应该想到的就是从UVM的某个类派生出一个新的类,类中可以有成员变量,也可以有函数和任务,通过成员变量、函数或任务实现所期望的功能。

图3 简单的UVM验证平台

验证用于找出DUT中的bug,这个过程通常是把DUT放入一个验证平台来实现的。上图描述了一个简单的UVM验证平台,下面结合该图简要描述UVM验证平台的基本组件。

  • transaction,派生自uvm_sequence_item,它是一个抽象的概念,用于描述各个组件传递的信息,是各个组件传递信息的基本数据结构。

  • driver,派生自uvm_driver,用于给DUT施加各种激励,负责驱动transaction,它本身并不产生transaction

  • monitor, 派生自uvm_monitor,监测DUT的输入输出信号。用于收集DUT的端口数据,并将其转换成transaction交给后续的reference model和scoreboard组件进行处理

  • sequencer,派生自uvm_sequencer,用于检测仲裁队列中是否有发送transaction的请求,以及检测driver是否申请transaction

  • in_agent,派生自uvm_agent,它是一个容器,用于实例化driver、monitor和sequencer

  • out_agent,派生自uvm_agent,它也是一个容器。由于在输出端口中不需要驱动任何信号,只需要监测信号,所以out_agent中只需要实例化monitor

  • reference model,派生自uvm_component,用于完成和DUT相同的功能,得到预期结果。一般采用高级语言描述,不用可综合,其输出被scoreboard接收,用于和DUT输出相比较

  • scoreboard,派生自umv_scoreboard,根据DUT的输出来判断DUT的行为是否与预期相符合,实现将DUT的输出和reference model的输出进行比较

  • sequence,派生自uvm_sequence,用于产生transaction,即产生激励。sequence用于创建transaction的实例,并将其送给sequencer。

在以上各组件中,driver、monitor、sequencer、agent、reference model和scoreboard都是属于派生自uvm_component的类,它们是验证平台中的固定组成部分。transaction是派生自uvm_object的类,它是验证平台中各组件之间传输的基本数据结构,一般来说,物理协议中的数据交换都是以帧或者包为单位。sequence也是派生自uvm_object的类,它定义了transaction的产生方式,包括产生带约束的transaction,它与具体的测试用例相关。

3  UVM中的sequence与测试用例

sequence机制是UVM中最重要的机制之一,它由两大部分组成:sequence和sequencer。sequence与sequencer之有着密切的联系,这点从二者的名字就可以看出来。sequence直接与sequencer打交道,当driver向sequencer索要数据时,sequencer会检查是否有sequence要发送数据,当发现有sequence_item待发送时,会把此sequence_item交给driver。简言之,sequence用于产生transaction;sequencer则用于承载sequencer产生的transaction并转交给driver使用。

图4 UVM中的sequence机制

UVM中引入sequence机制的好处是将激励从driver中剥离出来,有利于测试平台的重用。通过编写不同的sequence,实现不同的测试用例。

  • 当一个sequence启动之后,会自动执行task body中的代码,用于创建transaction

  • sequence中可以产生带约束的transaction,它与测试用例密切相关

  • sequence中可以嵌套调用其它sequence

  • 当一个验证平台中存在多个sequencer时,通常会采用virtual sequencer来进行调度。virtual sequencer同样派生自uvm_sequencer,它与一个virtual sequence对应

  • virtual sequence用来统一调度多个sequence,以便与测试用例直接相连,其本身并没有定义新的sequence。virtual sequence中的task body可以采用fork … join等并行语句来控制多个sequence的行为

随着验证的进行,测试用例的数量一直在增加,在增加的过程中,很重要的一点就是保证后增加的测试用例不影响已经建好的测试用例。在UVM中,最常用的方法是在仿真脚本或命令行中通过指定UVM_TEST_NAME来寻找测试用例的名字,创建它的实例并运行。每个UVM测试用例启动后,都会对应一个完整的UVM树结构,每颗UVM树的顶层都是uvm_test_top。

图5 某测试用例建立的UVM树

4  UVM验证平台:案例学习

下图描述了某SoC系统的UVM验证平台总体结构框图。如图所示,该SoC系统实现的是一个8端口的以太网交换功能,其设计代码DUT对外的主要引脚包含1组AXI-Lite接口(用于寄存器配置)和8组AXI-Stream接口(用于以太网收发包)。验证的目的就是DUT实现了预期的交换功能。

图6 某SoC系统UVM验证平台总体结构

在该UVM验证平台中,包含了两个层次:testbench和testcase。testbench中包含了每个testcase的公有部分。为了与DUT的顶层信号对接,在该SoC系统UVM验证平台的testbench中,共设计了8个用于收发包的port_i(i=0,1,…,7)和1个用于配置寄存器的axilite。除此之外,testbench中还包含virtual sequencer和scoreboard。在该UVM验证平台的每个testcase中,都对应两类trasnaction:一类是与AXI-Lite配置寄存器相关的axi_trans,包含地址、数据和操作类型(读/写)三个字段;另一类transaction是与物理层收发包相关的以太网包packet_trans,它包括目的地址、源地址、帧类型、包长度、帧数据、CRC校验等字段。

  • axilite:与DUT的寄存器配置相关,内部包含driver、monitor和sequencer。其中,driver根据AXI-Lite协议完成axi_trans到AXI-Lite读写时序的转换;monitor监测验证平台施加给DUT的axi_trans,并将它们传送给scoreboard;sequencer与配置寄存器的sequence相关联;

  • port_i(i=0,1,…,7):与每个port的收发包相关,内部包含driver、monitor和sequencer。其中,driver根据AXI-Stream协议完成packet_trans到AXI-Stream读写时序的转换;monitor通过监测DUT的输入输出AXI-Stream接口信号,将它们转换为发送包/接收包的packet_trans,并将它们传送给scoreboard;sequencer与收发包的sequence相关联;

  • virtual sequencer:用于调度管理axilite和port_i中的sequencer,内部包含多个sequencer实例。在一个测试用例中,virtual sequencer与一个virtual sequence相关联;

  • scoreboard:根据axilite中monitor收集的配置信息和各个port_i收集的发包信息,计算出预期的收包信息,再与monitor实际收到的收包信息进行自动对比,输出对比结果。注意到在该验证平台中,我们没有单独使用reference model,因为我们已经把reference model的功能内嵌到scoreboard之中。

测试用例的编写与sequence密切相关,每个测试用例对应一个virtual sequence。根据验证平台的结构,virtual sequence与各sequence的调用关系如图7所示,它将不同的sequence加载到对应的sequencer实例之上。图中以cseq_xxx开头的sequence都与寄存器配置相关,而tseq_xxx开头的sequence都与发送包相关。在每个测试用例中,一般来说,在发送包之前需要完成相关寄存器的配置,例如配置路由表。

图7 virtual sequence的调用关系

因此,基于上述UVM验证平台,编写测试用例的基本步骤为:

  • 创建测试用例的cseq_xxx,通过对axi_trans的地址、数据、操作类型字段施加约束可完成相关寄存器的配置;

  • 创建测试用例的tseq_xxx,通过对packet_trans的帧类型、包长度等包格式字段施加约束可以发送特定的包;

  • 创建测试用例的virtual sequence,在virtual sequence中进行调度,将sequence加载到具体端口的sequencer实例之上;

  • 创建测试用例的测试类(testclass),在testclass中指定它与新创建的virtual sequence的类名相关联;

  • 在仿真脚本中指定UVM_TEST_NAME的值为新创建的testclass类名。启动仿真,即可对该测试用例进行验证。

基于UVM验证方法学可以快速构建层次化、可扩展性强的验证平台。本文简要介绍了UVM验证平台的基本框架和测试用例的编写步骤,对UVM中的代码细节并未过多提及。后续将会介绍UVM中的寄存器模型,敬请期待。

( 转)UVM验证方法学之一验证平台的更多相关文章

  1. paypal支付平台如何使用二次验证码_虚拟MFA_两步验证_谷歌身份验证器?

    一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 paypal支付平台如何使用二次验证码_虚拟MFA_两步验证_谷歌身份验证器? 二次验证码小程序于谷歌身份验证器APP的优势 ...

  2. 无责任Windows Azure SDK .NET开发入门篇二[使用Azure AD 进行身份验证-2.2身份验证开发]

    2.2身份验证开发 在我们的案例中,我们是用户通过Web应用程序进行身份识别. 上面的图示说明了如下的一些概念 l Azure AD 是标识提供程序,负责对组织的目录中存在的用户和应用程序的标识进行验 ...

  3. Xilinx约束学习笔记(一)—— 约束方法学

    <Xilinx约束学习笔记>为自己阅读 Xilinx 官方 UG903 文档后的学习笔记,大多数为翻译得来,方便大家学习. 1 约束方法学 1.1 组织约束文件 Xilinx 建议将时序约 ...

  4. [置顶] Web用户的身份验证及WebApi权限验证流程的设计和实现 (不是Token驗證!!!不是Token驗證!!!都是基於用户身份的票据信息驗證!!!)

     转发 http://blog.csdn.net/besley/article/details/8516894 不是Token驗證!!!不是Token驗證!!!都是基於用户身份的票据信息驗證!!! [ ...

  5. 七牛云如何绑定二次验证码_虚拟MFA_两步验证_谷歌身份验证器?

    一般情况下,点账户名——账户设置——安全设置,即可开通两步验证 具体步骤见链接  七牛云如何绑定二次验证码_虚拟MFA_两步验证_谷歌身份验证器?   二次验证码小程序(官网)对比谷歌身份验证器APP ...

  6. ASP.NET MVC的客户端验证:jQuery的验证

    之前我们一直讨论的Model验证仅限于服务端验证,即在Web服务器根据相应的规则对请求数据实施验证.如果我们能够在客户端(浏览器)对用户输入的数据先进行验证,这样会减少针对服务器请求的频率,从而缓解W ...

  7. atitit.数据验证--db数据库数据验证约束

    atitit.数据验证--db数据库数据验证约束 1. 为了加强账户数据金额的安全性,需要增加验证字段..1 2. 创建帐户1 3. 更改账户2 4. ---code3 5. --fini4 1. 为 ...

  8. thinkphp自动验证中的静态验证和动态验证和批量验证

    1.静态定义 在模型类里面预先定义好该模型的自动验证规则,我们称为静态定义. 举例说明,我们在模型类里面定义了$_validate属性如下: class UserModel extends Model ...

  9. Jquery对文本框的值、字符串的验证;正则表达式字符串的验证

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. ext4 disable journal

    ext4 disable journal At one high loaded web project I needed a very fast file system. I decided to u ...

  2. 并发-Java中的Copy-On-Write容器

    Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改, ...

  3. JVM实用参数(四)内存调优

    理想的情况下,一个Java程序使用JVM的默认设置也可以运行得很好,所以一般来说,没有必要设置任何JVM参数.然而,由于一些性能问题(很不幸的是,这些问题经常出现),一些相关的JVM参数知识会是我们工 ...

  4. oracle数据库如何创建用户并授予角色

    目标:1.  创建角色test1_role,  授予 CREATE PROCEDURE, CREATE SEQUENCE, CREATE SYNONYM, CREATE TABLE, CREATE T ...

  5. 模拟下载的进度条ProgressBar

    作者:堕落的天使 图片效果 activity_main.xml(代码) <RelativeLayout xmlns:android="http://schemas.android.co ...

  6. storm 配置,呵呵。

    配置项 配置说明 storm.zookeeper.servers ZooKeeper服务器列表 storm.zookeeper.port ZooKeeper连接端口 storm.local.dir s ...

  7. jira的使用

    http://www.cnblogs.com/yangxia-test/p/4448002.html linux下的安装: http://blog.csdn.net/crave_shy/article ...

  8. 如何在IDEA上 添加GIT和maven、mybatis插件

    IDEA工具上,添加GIT和maven.mybatis插件,相对比较简单: 首先下载GIT.maven.mybatis. 先添加GIT插件: 首先在IDEA找到file中找到setting,然后搜索g ...

  9. MongoDB(八)Mongodb——GridFS存储

    mongoDB的文档以BSON格式存储,支持二进制的数据类型,当我们把二进制格式的数据直接保存到mongoDB的文档中.但是当文件太大时,例如图片和视频等文件,每个文档的长度是有限的,于是mongoD ...

  10. 调用百度地图API出现 error inflating class com.baidu.mapapi.map.mapview

    问题如下 本来以为解决了,但后来重新运行了一下,又坏了,然后改成原来的样子,又好了. 结果就是:对不住了各位看官,没找到解决办法,不过经测试有个地方,可能在程序运行时,出现error inflatin ...