4 modeling sequence item的一些技巧

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,则有两种方法:

  1. 将delay加入field宏
  2. 自己写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};}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值