目录
一、uvm_object
- uvm世界中的类最初都是从一个uvm_void根类(root class)继承来的,而实际上这个类并没有成员变量和方法。
- uvm_void只是一个虚类(virtual class),还在等待将来继承于它的子类去开垦。在继承于uvm_void的子类中,有两个类:uvm_object类和uvm_port_base类。
- 除过事务接口(transaction interface)类继承于uvm_port_base,其它所有的类都是从uvm_object类一步一步继承而来的。
1.核心方法
从uvm_object提供的方法的相关宏操作来看,它的核心方法主要提供域数据操作的相关服务:
- copy
- clone
- compare
- pack/unpack
2.说明
在SV模块的学习中,我们懂得了什么是句柄拷贝和对象拷贝。所以,不管是copy或者clone,都需要确保在操作过程中,需要有source object和target object。
二、域的自动化(field automation)
1.field automation 机制相关的宏
- uvm_field_int(ARG,FLAG)
- uvm_field_real(ARG,FLAG)
- uvm_field_enum(T,ARG,FLAG)
- uvm_field_object(ARG,FLAG)
- uvm_field_event(ARG,FLAG)
- uvm_field_string(ARG,FLAG)
注:ARG表示成员变量,FLAG表示用来标记的数据操作。
FLAG:初学者只需要默认采取UVM_ALL_ON或者UVM_DEFAULT,即将所有的数据操作方法都打开。
2.field automation 机制的常用函数
- copy
- compare
- record
- pack
接下来的部分逐一介绍这些数据操作方法。
(1)copy
在UVM的数据操作中,需要对copy和clone进行区分。(无论是copy还是clone,都需要对数据进行复制)
- copy
copy默认已经创建好了对象,只需要对数据进行拷贝; - clone
clone=new+copy;
clone会自动创建对象并对source object 进行数据拷贝,再返回target object句柄;
(2)compare
默认情况下,如果不对比较的情况作出额外配置,用户可以再调用compare()方法是,省略第二个参数,即采用默认的比较配置。
- 比较方法经常在两个数据类中进行,两者一致时,返回1,否则为0;
(3)print
打印方法是核心基类提供的另外一种便于开发和调试的功能,用于打印所有字段。
- 通过field automation,使得声明之后的各个成员域会在调用uvm_object::print()函数时自动打印出来。
- 相比于再仿真中设置断点,逐步调试,打印是另外一种调试方法。它的好处在于可以让仿真继续进行,会在最终回顾执行过程中,从全局理解执行的轨迹和逻辑。
(4)pack &unpack
- pack
为了将自动化声明后的域(标量)打包为比特流(bit stream),即将各个散乱的数据,整理到bit数据串中,类似于struct packed 的整理方式。 - unpack
与pack相反,将串行数据解包变为原有的各自域。适用于从硬件一侧接收串行数据,进行校验之后,还原为软件一侧中各自对应的成员变量。