事务对象是用户自定义的验证环境所处理的事务类,例如作为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
未经作者同意,请勿转载!
推荐阅读
想了解更多内容,欢迎关注芯片数字实验室专栏