UVM核心基类
一、前言
UVM世界中的类最初都是从一个uvm_void跟类(root class)继承来的,而实际上这个类并没有成员变量和方法。uvm_void只是一个虚类(virtual class),还在等待将来继承于它的子类去开垦。在继承于uvm_void的子类中,有两个类,一个为uvm_object类,另外一个为uvm_port_base类。
在UVM世界的类库地图中除过事务接口(transaction interface)类继承于uvm_prot_base,其它所有的类都是从uvm_object类一步步继承而来的。从uvm_object提供的方法和相关的宏操作来看,它的核心方法主要提供与数据操作的相关服务:
- Copy
- Clone
- Compare
- Pack/Unpack
在SV模块的学习中,我们懂得了什么是句柄拷贝和对象拷贝。因此,无论是copy或者clone,都需要确保在操作的过程中,需要有source object和target object。
二、域的自动化
在SV中,关于对象的复制,需要自己编写copy()成员方法来规定哪些成员数据需要复制。可以想象的是,如果对uvm_object类的成员数据的复制、打印等操作都要用户自己去定义的话,那么这会带来额外的编码负担,并且可能由于用户代码的不规范也容易出错。
UVM通过域的自动化(Field Automation),使得用户在注册UVM类的同时也可以声明今后会参与到对象赋值、克隆、打印等操作的成员变量。域的自动化解放了verifier的双手,这使得在使用uvm_object提供的一些预定义方法时,非常便捷,而无需再实现自定义方法。在了解了域的自动化常用的宏之后,用户需要考虑哪些成员变量在注册UVM类(`uvm_{component,object}_utils)的时候,也一并将它们归置到对应的域列表中,以便为稍后的域方法提供可以自动实现的基础。
class box extends uvm_object;
int volume=120;
color_t color=WHITE;
string name="box";
`uvm_object_utils_begin(box)
`uvm_filed_int(volume,UVM_ALL_ON)
`uvm_filed_enum(color_t,color,UVM_ALL_ON)
`uvm_filed_string(name,UVM_ALL_ON)
`uvm_object_utils_end
endclass
- 域的自动化的相关宏都是`uvm_field_{int,object,string,enum,event,real…}{ARG,FLAG}。ARG表示成员变量,FLAG表示用来标记的数据操作。
- FLAG初学者可以默认为UVM_ALL_ON或者UVM_DEFAULT
- 如果你考虑到你接下来的成员变量可能会参与到copy,compare,print类似的操作时,那么在注册时,通过域的自动化对变量做声明
三、拷贝(copy)
class ball extends uvm_object;
int diameter=10;
color_t color =RED;
`uvm_object_utils_begin(ball)
`uvm_field_int(diameter,UVM_ALL_ON)
`uvm_filed_enum