UVM高手请进:请教关于SV的cast函数和UVM的clone函数
时间:10-02
整理:3721RD
点击:
最近空闲时间,看了一下一些之前没太注意的细节问题:
My_trans Tr_A;
My_trans Tr_B;
利用$cast(Tr_A, Tr_B.clone());将Tr_B完全赋给Tr_A, 二者拥有不同的内存;
现在,突发奇想,Tr_A = Tr_B.clone(), 可是这样VCS编译起来出错,说是等号左右两边的类型不匹配。
这样疑问就来了,systemverilog中的$cast的功能到底是什么?句柄的强制映射?请高人详解一下!
还有一个问题,.clone()函数返回的到底是什么东西?我理解为是My_trans类型的一个类,但是这样理解起来应该不对,不然上面的赋值语句为啥编译错误呢?
类的赋值(=号)的操作对象是什么?只是句柄的赋值么?肯定不改变内存的。
一些疑问,麻烦高人和专家指点一下吧?
非常感谢!
My_trans Tr_A;
My_trans Tr_B;
利用$cast(Tr_A, Tr_B.clone());将Tr_B完全赋给Tr_A, 二者拥有不同的内存;
现在,突发奇想,Tr_A = Tr_B.clone(), 可是这样VCS编译起来出错,说是等号左右两边的类型不匹配。
这样疑问就来了,systemverilog中的$cast的功能到底是什么?句柄的强制映射?请高人详解一下!
还有一个问题,.clone()函数返回的到底是什么东西?我理解为是My_trans类型的一个类,但是这样理解起来应该不对,不然上面的赋值语句为啥编译错误呢?
类的赋值(=号)的操作对象是什么?只是句柄的赋值么?肯定不改变内存的。
一些疑问,麻烦高人和专家指点一下吧?
非常感谢!
我想这是一个OOP问题,如果你在SV里把=号赋值函数重载一下,你就可以Tr_A = Tr_B.clone()这样赋值了。否则这样赋值只局限于普通数据类型(int,bit,logic等)。
难道UVM中的clone函数必须搭配sv的$cast函数么?
可以想象一下,定义clone这个函数时,这个类还没有真的实现,所以只能返回一个这个的基类,
因此,不能直接赋值,clone后必须$cast,否则就是将基类的句柄赋给扩展类
clone是基类uvm_object的方法,因此返回的是uvm_object的handle,需要cast给子类
have a study! thanks!
哇,benben开坛讲道啦,benben正解!顶!
学习学习顺便赚信元
学习学习顺便赚信元
说的很好,受教了