story · 2020年06月11日

数字IC验证系列之事务对象

事务对象是用户自定义的验证环境所处理的事务类,例如作为DUT的激励。

UVM库提供了uvm\_sequence\_item基类。 每个用户定义的事务对象都必须直接或间接地从这个基类派生。

要创建用户定义的事务对象,需要:

a)根据DUT的设计规范描述特定的约束,task和function。

b)直接或间接地从uvm\_sequence\_item基类派生。

c)为事务对象定义构造函数。

下面的simple\_item类定义了几个随机变量和约束。\`uvm\_object\_utils宏用于factory注册类

classsimple_item extends uvm_sequence_item;
rand int unsigned addr;a
rand int unsigned data;
rand int unsigned delay;
constraint c1 { addr < 16'h2000; }
constraint c2 { data < 16'h1000; }

// UVM automation macros for general objects
`uvm_object_utils_begin(simple_item)
`uvm_field_int(addr, UVM_ALL_ON)
`uvm_field_int(data, UVM_ALL_ON)
`uvm_field_int(delay, UVM_ALL_ON)
`uvm_object_utils_end

// Constructor
function new (string name = "simple_item");
 super.new(name);
endfunction : new
endclass :simple_item

第1行从uvm\_sequence\_item派生事务对象

第5行和第6行为事务对象添加约束,以便符合设计规范。

UVM提供内置宏可以简化验证环境的开发。宏自动化了基类定义的函数的实现,如copy(),compare()和print(),从而节省许多行代码。

为了满足验证目标,验证组件用户可能需要通过向类定义添加更多约束来调整事务对象。在SystemVerilog中,可以使用继承完成的。

以下示例了派生事务对象word\_aligned\_item,其中包含一个附加约束仅选择字对齐的地址。

class word_aligned_itemextends simple_item;
constraint word_aligned_addr { addr[1:0] == 2'b00; }
`uvm_object_utils(word_aligned_item)
// Constructor
function new (string name = "word_aligned_item");
super.new(name);
endfunction : new
endclass : word_aligned_item

在事务对象中,可以定义控制字段以控制事务对象的其他字段变量。为了便于阅读,使用枚举类型表示各种控制字段的类别。

typedef enum {ZERO,SHORT, MEDIUM, LARGE, MAX} simple_item_delay_e;
class simple_item extends uvm_sequence_item;
rand int unsigned addr;
rand int unsigned data;
rand int unsigned delay;
rand simple_item_delay_e delay_kind; // Control field
// UVM automation macros for general objects
`uvm_object_utils_begin(simple_item)
`uvm_field_int(addr, UVM_ALL_ON)
`uvm_field_enum(simple_item_delay_e, delay_kind, UVM_ALL_ON)
`uvm_object_utils_end
constraint delay_order_c { solve delay_kind before delay; }
constraint delay_c {
(delay_kind == ZERO) -> delay == 0;
(delay_kind == SHORT) -> delay inside { [1:10] };
(delay_kind == MEDIUM) -> delay inside { [11:99] };
(delay_kind == LARGE) -> delay inside { [100:999] };
(delay_kind == MAX ) -> delay == 1000;
delay >=0; delay <= 1000; }
endclass : simple_item

本文转载自公众号:芯片数字实验室
原文链接:
https://mp.weixin.qq.com/s/ck-YamoXqp8\_3XylF8Z\_ow
未经作者同意,请勿转载!

推荐阅读
想了解更多内容,欢迎关注芯片数字实验室专栏
推荐阅读
关注数
12320
内容数
221
前瞻性的眼光,和持之以恒的学习~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息