1 property and method
一般定义sequence item的class里面会包含一些变量(property)和函数或任务(method),以及constrains.
一些property前面会根据具体需求加上local或protected属性(local是class的内部method可以访问,class的不同对象可以访问;protected是class的内部method可以访问,class的不同对象可以访问,class的扩展类的对象也可以访问)。
method则有virtual和extern属性。
1 class simple_item extends uvm_sequence_item;
2 rand int unsigned addr;
3 rand int unsigned data;
4 rand int unsigned delay;
5 constraint c1 { addr < 16'h2000; }
6 constraint c2 { data < 16'h1000; }
7 // UVM automation macros for general objects
8 `uvm_object_utils_begin(simple_item)
9 `uvm_field_int(addr, UVM_ALL_ON)
10 `uvm_field_int(data, UVM_ALL_ON)
11 `uvm_field_int(delay, UVM_ALL_ON)
12 `uvm_object_utils_end
13 // Constructor
14 function new (string name = "simple_item");
15 super.new(name);
16 endfunction : new
17 endclass : simple_item
2 技巧一:用uvm field宏来enable print/copy/compare
如上面的代码例子中,addr,data,delay由于都被`uvm_field_int,故如果调用sequence item.print函数,这三个property都会被打印。
如果delay没有被加入field宏,后面调用sequence_item.print()函数,默认delay不会被打印,如果想打印delay,则有两种方法:
- 将delay加入field宏
- 自己写do_print函数,将delay打印实现在这个函数里,后期直接调用sequence_item.print()。
3 技巧二:在sequence item里加knobs(主要针对control信息)
出发点:对于产生delay值的空间来说,覆盖每一个可能的值既不现实也不必要,重要的是要产生诸如zero/short/media/large/max之类的值。然后testcase开发者可以在case里面利用knobs来控制delay的随机化。这个knobs也可以用作coverage collection,上面的代码需要重写如下(定义enum类型来增加可读性):
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
然后,写case时就可以按如下方式控制delay的随机化:
constraint delay_kind_d {delay_kind dist {ZERO:=2, SHORT:=1,MEDIUM:=1, LONG:=1, MAX:=2};}