UVM实战指南(2)

2019-08-30 16:37

UVM实战指南——第1部分 2010-10-31 21:54:15| 分类: SystemVerilog | 标签:uvm |字号 订阅 验证的复杂度已经明显超过设计。为了处理复杂度,面向对象,设计模式等软件设计的思想逐渐渗透到了硬件设计领域。UVM的适时提出,有望能够尽早一统江湖,不再有各门各派军阀割据。 最近,出了一本UVM新书,工作之余,我抽空进行翻译,供大家参考。 英文来源:http://www.low-powerdesign.com/article_Cadence-UVM_082310.html UVM实战指南——第1部分 这篇文章是新书《A Practical Guide to Adopting the Universal Verification Methodology》的第四章 UVM library基础的节选。这一章的后续会在之后4周的周一连续发表。如果等不及,可以到amazon.com网站购买。 作者:Sharon Rosenberg and Kathleen A. Meade, Cadence Design Systems UVM是功能验证的第一个最佳实践和方法学。如之前提到,UVM实现了成熟的高级验证方法。尽管其类库可以任意使用,我们强烈建议按照后续章节描述的方式来使用,因为这些方法源自于成功经验。 这一章讲解库的结构以及基本功能,重点放在大多数验证环境所需要的基本特征上。 注意:为了简化,例子并没有完全遵循UVM建议的架构和方法学。

这一章主要包括:

? ? ? ? ? ?

使用UVM库 基本类 TLM端口 工厂模式 消息和汇报 配置机制

4.1 使用UVM库

为了使用UVM库,用户需要:

? ? ?

编译UVM包的顶层文件:uvm_pkg.sv 在所需要的地方导入uvm_pkg 包含UVM宏

4.1.1 Hello World例子

下面的例子功能是在屏幕上显示消息:\

1 // Compile the UVM package 2 `include ―uvm_pkg.sv‖ 3 module hello_world_example;

4 // Import the UVM library and include the UVM macros 5 import uvm_pkg::*;

6 `include ―uvm_macros.svh‖ 7 initial begin

8 `uvm _info (“info1”,“Hello World!”, UVM _LOW) 9 end

10 endmodule: hello_world_example

第1-2行:注释用来提醒需要编译UVM库。uvm_pkg.sv是UVM顶层文件,此文件将所有的UVM文件放在一个systemverilog文件包中。注意:SystemVerilog包需要在模块以外进行编译。建议用命令行方式进行编译。由于包常被多个单元使用,不要将包的编译绑定到某个指定的单元。

第5行:当库已经编译,用户可以在任意编译单元导入此systemverilog包

第6行:必须分别包含UVM宏,因为宏属于编译指令,不会在多个编译步骤中保持存在。为了避免重复编译整个库,宏被分开包含。(每个需要用的宏的文件都必须包含) 第8行:`uvm_info宏属于UVM消息打印功能的一部分。UVM消息打印允许格式化以及控制屏幕显示。在这里,我们仅仅打印消息“Hello World!”

4.1.2 UVM库使用指南

?

为了避免命名冲突,避免在全局环境中导入uvm_pkg. 其他的package也同样适用此原则(避免全局环境中导入) 顶层文件一般如下格式

?

`ifndef _SVH `define _SVH ... 文件内容 `endif

这种方式允许UVM库被多个地方引用而避免重复声明,一起编译的时候仅编译一次。建议用户在自己的UVM文件中也使用此方式。

?

在Cadence的Incisive Enterprise Simulator(IES)仿真器中运行仿真器自带的UVM库:

% irun -uvm myfile.sv

?

使用非仿真器自带的UVM库,使用命令行:

% irun -uvmhome $UVM _HOME myfile.sv

4.2 基本类

图4-1 类图描绘了UVM库中的一些类。这些类提供了一些自动机制,可以用来衍生出用户自定义的类以及类的行为。除了自动机制,这些基类还提供了支持统一和重用的API。

注意:此图没有显示uvm_transaction类。 尽管这个类仍然属于库,Accellera TSC并不建议使用它。(建议使用uvm_sequence_item) 后续章节讨论 uvm_object和uvm_component抽象类

4.3 uvm_object类

抽象类uvm_object是所有UVM数据类型的基类。他的主要功能是定义完成了一系列通用的操作方式,比如创建, 复制, 打包/解包(pack/unpack), 比较, 打印, 以及记录(record). 从uvm_object衍生出来的类必须实现类似create()和get_type_name()这样的纯虚函数。以下代码演示了一个没有使用UVM object类的AMBA APB传输的例子 实例4–1: 非UVM类定义

1 typedef enum bit { APB _READ, APB_WRITE} apb _direction _enum; 2 class apb_transfer;

3 rand bit [ 31:0] addr; 4 rand bit [ 31:0] data;

5 rand apb _direction _enum direction; 6 function void print();

7 $display(\8 endfunction : print 9 endclass : apb_transfer

上面简单的例子包含了一个几乎所有交易(transaction)都有的print()方法。 大部分数据项都需要打印,复制,比较,打包,解包以及其他功能。如果让开发者去自已去定义这些功能,将不方便复用,环境整合者必须学习从多个地方得到的不同类的使用规则以及行为特征。UVM库通过引入uvm_object基类解决了这个问题。基类定义了一些通用的服务。测试向量中所有的类都必须间接或直接由uvm_object派生出来。UVM类库也实现了一些宏,这些宏能够自动实现打印,复制,克隆,打包(pack),解包(unpack)方法等等。

实例 4–2: 从uvm_object继承而来的APB传输类

1 typedef enum bit { APB _READ, APB_WRITE} apb_direction_enum; 2 class apb_transfer extends uvm_object; 3 rand bit [ 31:0] addr; 4 rand bit [ 31:0] data;

5 rand apb_direction_enum direction;

6 // Control field - does not translate into signal data

7 rand int unsigned transmit_delay; //delay between transfers 8 //UVM automation macros for data items 9 `uvm_object_utils_begin (apb_transfer) 10 `uvm _field _int (addr, UVM _DEFAULT) 11 `uvm _field _int (data, UVM _DEFAULT)

12 `uvm _field _enum(apb _direction _enum, direction, UVM _DEFAULT) 13 `uvm _field _int(transmit _delay, UVM _DEFAULT | UVM_NOCOMPARE) 14 `uvm_obj ect_utils_end

15 // Constructor - required UVM syntax 16 function new (string name=\17 super.new(name); 18 endfunction : new 19 endclass : apb_transfer

第9-14行: UVM自动宏


UVM实战指南(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《苹果树上的外婆》整本书读书规划

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: