(8)UVM Sequence和Item

概述

在介绍如何使用item和 sequence,可以有序穿过 sequencer抵达 driver之前,有必要首先认识 sequence与item之间的关系。
这里的 sequence指的是 uvm_ sequence类,而item指的是uvm_sequence_item类,我们简称其为 sequence和item。对于激励生成和场景控制,是由 sequence来编织的,而对于激励所需要的具体数据和控制要求,则是从item的成员数据得来的

Item

item是基于 uvm_object类,这表明了它具备UWM核心基类所必要的数据操作方法,例如 copy、clone、 compared、record等。
对于激励所需要的具体数据和控制要求,则是从item的成员数据得来的。
item通常应该具备有什么类型的数据成员呢?我们将它们划分为如下几类

  • 控制类。譬如总线协议上的读写类型、数据长度、传送模式等。
  • 负载类。一般指数据总线上的数据包。
  • 配置类。用来控制 driver的驱动行为,例如命令driver的发送间隔或者有无错误插入。
  • 调试类。用来标记一些额外信息方便调试,例如该对象的实例序号、创建时间、被 driver解析的时间始未等。

Item示例

class bus_trans extends uvm_sequence_item; 
	rand bit write; 
	rand int data; 
	rand int addr; 
	rand int delay; 
	static int id_num; 
	`uvm_object_utils_begin(bus_trans)
		`uvm_field_int ...
	`uvm_object_utils_end 
	...
endclass
class testl extends uvm_test; 
	`uvm_component_utils(test1)
	...
	task run_phase(uvm_phase phase); 
		bus_trans t1,t2; 
		phase.raise_objection(phase);
		#100ns; 
		t1=new("t1"); 
		tl.print();
		#200ns; 
		t2=new("t2"); 
		void'(t2. randomize()); 
		t2.print();
		phase.drop_objection(phase); 
	endtask 
endclass

Item使用时的特点

item使用时的特点:

  • 如果数据域属于需要用来做驱动,那么用户应考虑定义为rand类型,同时按照驱动协议给出合适的constraint。
  • 由于item本身的数据属性,为了充分利用UVM域声明的特性,建议将必要的数据成员都通过`uvm_field_xxx宏来声明,以便日后uvm_object的基本数据方法自动实现,例如上面的print()函数。
  • t1没有被随机化而t2被随机化了,这种差别在item通往sequencer之前是很明显的。UVM要求item的创建和随机化都应该发生在sequence的body()任务中,而不是在sequencer或者driver中。
  • 按照item对象的生命周期来区分,它的生命应该开始于sequence的body()方法,而后经历了随机化并穿越sequencer最终到达driver,直到被driver消化之后,它的生命一般来讲才会结束。之所以要突出这一点,是因为一些用户在使用中会不恰当地直接操作item对象,直接修改其中的数据,或者将它的句柄发送给其它组件使用,这会无形中修改item的数据基因,或者延长一个item对象的寿命。这种不合适的对象操作方式是需要注意的,可以取代的方式则是合理利用copy()和clone()等数据方法

Item与Sequence的关系

一个sequence可以包含一些有序组织起来的item实例,考虑到item在创建后需要被随机化,sequence在声明时也需要预留一些可供外部随机化的变量,这些随机变量一部分是用来通过层级传递约束来最终控制item对象的随机变量一部分是用来对item对象之间加以组织和时序控制的

Sequence

为了区分几种常见的sequence定义方式,在介绍sequence之前首先将其分类为:

  • 扁平类(flat sequence)。这一类往往只用来组织更细小的粒度,即item实例构成的组织。
  • 层次类(hierarchical sequence)。这一类是由更高层的sequence用来组织底层的sequence,进而让这些sequence或者按照顺序方式,或者按照并行方式,挂载到同一个sequencer上
  • 虚拟类(virtual sequence)。这一类则是最终控制整个测试场景的方式,鉴于整个环境中往往存在不同种类的sequencer和其对应的sequence,需要一个虚拟的sequence来协调顶层的测试场景。之所以称这个方式为virtual sequence,是因为该序列本身并不会固定挂载于某一种sequencer类型上,而是将其内部不同类型sequence最终挂载到不同的目标sequencer上面。这也是virtual sequence不同于hierarchical sequence的最大一点。

Flat Sequence介绍

一个flat sequence由细小的sequence item群落构成,在此之上sequence还有更多的信息来完备它需要实现的激励场景。

一般对于flat sequence而言,它包含的信息有:

  • sequence item以及相关的constraint用来关联生成的item之间的关系,从而完善出一个flat sequence的时序形态。
  • 除了限制sequence item的内容,各个item之间的时序信息也需要由flat sequence给定,例如何时生成下一个item并且发送至driver。
  • 对于需要与driver握手的情况(例如读操作),或者等待monitor事件从而做出反应(例如slave的memory response数据响应操作),都需要sequence在收到另外一侧组件的状态后,再决定下一步操作,即响应具体事件从而创建对应的item并且发送出去

Flat Sequence示例

class bus_trans extends uvm_sequence_item; 
	rand bit write; 
	rand int data; 
	rand int addr; 
	rand int delay; 
	static int id_num; 
	uvm_object_utils_begin(bus trans)
		`uvm_field_int...
	`uvm_object_utils_end 
	...
endclass
class flat_seg extends uvm_sequence; 
	rand int length; 
	rand int addr; 
	rand int data[]; 
	rand bit write; 
	rand int delay; 
	constraint cstr{
		data.size()==length; 
		foreach(data[i]) soft data[i]==i; 
		soft addr=='h100; 
		soft write==1; 
		delay inside{[1:5]};
	}; 
	`uvm_object_utils(flat_seq)
	...
	task body(); 
		bus_trans tmp; 
		foreach(data[i]) begin 
			tmp=new(); 
			tmp.randomize() with { data==local:: data[i]; 
							addr==local:: addr +i<<2; 
							write==local:: write; 
							delay==local:: delay;}; 
			tmp. print(); 
		end
	endtask
endclass
class test1 extends uvm_test; 
	`uvm_component_utils(test1)
	...
	task run_phase(uvm_phase phase); 
		flat_seq seq; 
		phase.raise_objection(phase); 
		seg=new(); 
		seq.randomize() with { addr=='h200; 
		...}
		seq.body(); 
		phase.drop_objection(phase);
	endtask 
endclass

结果如下所示:
在这里插入图片描述

flat_seq类可以看作是一个更长的数据包,数据包的具体内容、长度、地址等信息都包含在flat_seq中。在生成item过程中,通过将自身随机变量作为constraint内容来限定item随机变量,这是flat sequence的大致处理方法。

Hierarchical Sequence介绍

Hierarchical sequence区别于flat sequence的地方在于,它可以使用其他sequence和item,这么做是为了创建更丰富的激励场景。

通过层次嵌套关系,可以让hierarchical sequence使用其它hierarchical sequence、flat sequence和sequence item,这也就意味着,如果底层的sequence item和flat sequence的粒度得当,那么用户就可以充分复用这些sequence/item来构成形式更加多样的hierarchical sequence。

Hierarchical Sequence示例

class hier_seq extends uvm_sequence; 
	`uvm_object_utils(hier_seq)
	function new(string name="hier_seq"); 
		super.new(name); 
	endfunction 
	task body(); 
		bus_trans t1,t2; 
		flat_seq sl,s2; 
		uvm_do_with(t1,{ length==2;})
		fork 
			`uvm_do_with(s1,{length==5;}) 
			`uvm_do_with(s2,{length==8;})
		join
		`uvm do with(t2,{ length==3;})
	endtask 
endclass

从hier_seq::body()来看,它包含有bus_trans t1,t2和flat_seq s1,s2,而它的层次关系就体现在了对于各个sequence/item的协调上面

上例中使用了uvm_do_with宏,这个宏完成了三个步骤:

  • sequence或者item的创建
  • sequence或者item的随机化
  • sequence或者item的传送

区别于之前的例子,这个例子通过 uvm_do_with宏帮助理解,所谓的sequence复用就是通过高层的sequence来嵌套底层的sequence/ite.,最后来创建期望的场景。
在例子中既有串行的激励关系,也有并行的激励关系,而在更复杂的场景中,用户还可以考虑加入事件同步,或者一定的延迟关系来构成sequence/item之间的时序关系。

这篇笔记参考《UVM实战》、《芯片验证漫游指南》和某验证视频整理而成,仅作学习心得交流,如果涉及侵权烦请请告知,我将第一时间处理。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
UVM(Universal Verification Methodology,通用验证方法学)是一种常用的硬件验证方法学,其提供了一套完整的验证框架和工具,方便进行复杂的设计验证工作。 在UVM中,Sequence Item(序列项)是用于描述被验证设计中的信号、寄存器或其他需要验证的对象的数据结构。它可以看作是将待验证设计中的信息抽象出来的一个模型。 设计一个UVM Sequence Item主要是为了对待验证对象进行建模,并且在验证环境中进行重复使用。它包含了待验证对象的属性、状态和行为等信息。根据设计规范,Sequence Item一般需要继承自uvm_sequence_item类,并且需要实现必要的函数和任务。 使用UVM Sequence Item设计模式有以下几个好处: 1. 抽象层次高: Sequence Item将待验证设计抽象为一个独立的对象,使得验证人员只需关注待验证对象的功能和行为,而无需过多关注其内部实现细节,从而提高了验证的复用性和可维护性。 2. 灵活性和可扩展性: 通过继承和重载函数,可以对Sequence Item进行扩展和定制化,以适应不同的需求。可以在Sequence Item中添加必要的约束和约定,以确保验证的正确性和完整性。 3. 与其他验证组件的连接性: Sequence Item验证环境中不同组件之间交互的桥梁。通过使用Sequence Item,可以方便地将验证组件(如生成器、驱动器、监控器等)与待验证对象进行连接和通信,实现验证环境的协同工作。 总结来说,UVM Sequence Item设计模式提供了一种有效的方法来抽象和建模待验证对象,使得验证工作更加高效、灵活和可维护。它是UVM验证框架中不可或缺的一部分,对于复杂的设计验证工程具有重要的意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数字ic攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值