方式一:sv 的new函数
trans tr1,tr2;
malbox.get(tr2);
tr1 = new tr2;//仅用于浅拷贝,拷贝后tr1,tr2为两个独立的对象
方式二:uvm 域的自动化常用函数:copy / clone /
使用前提:
1. 函数都可用于uvm_object类型,copy 还可用于component类型;
2. 源对象和目的对象需已经注册在工厂中,注册方式如下:
`uvm_field_int(idx,UVM_ALL_ON) //参数注册
注:如果注册时使用了if,那么不满足条件的参数将不会被注册,以就不能使用函数了;
使用方法:
1. copy
trans tr1 tr2;tr1 = new;//copy在使用前需创建对象malbox.get(tr2);tr1.copy(tr2);//仅浅拷贝,copy是void类型函数
2. clone
trans tr1 tr2;malbox.get(tr2);if(!$cast(tr1,tr2.clone))//仅浅拷贝,clone在使用时,tr1为空句柄(不需要提前创建对象,因为clone=new+copy)
`uvm_error()
总结:
1. 两个方式的拷贝结果一致,使用方式略有不同;
2. 两种方式的拷贝均只用于浅拷贝,如果需要深拷贝,需要自行写出copy函数;
浅拷贝:仅拷贝变量和句柄,不拷贝句柄的对象;所有拷贝前后的两个句柄指向同一个对象;
深拷贝:拷贝变量/句柄/句柄所指向的对象;拷贝前后两个句柄指向两个不同的对象;