验证(uvm常见问题)--子类和父类的句柄和对象问题

sv中的子类和父类

在sv中,有如下两个类,child继承于parent。然后在test module中,正确转换的方法如下面所示。其中c1,c2,p1
都指向了同一个子类的对象c1。总结如下:

  1. 一个子类的对象是包括子类的成员变量,方法和父类的成员变量,方法。
  2. 子类的句柄c1可以直接赋值给父类的句柄p1,此时p1只可以访问父类的成员变量和方法,或者子类的虚方法,比如下面调用p1.display是可以显示“child da ben dan”的。但是无法访问子类的成员变量。
  3. 父类句柄p1要转换成子类句柄c2,一定要用cast,此时只有当父类句柄指向的是子类对象的时候,才能转换成功。
  4. 一般父类句柄转成子类句柄的原因是要访问子类的成员变量。
class parent;
int pp;
function void new();
endfuntion
virtual function void display();
	$display("parent da ben dan");
endfunction
endclass
class child extends parent;
int cc;
function void new();
endfuntion
function void display();
	$display("child da ben dan");
endfunction
endclass

module test;
child c1,c2;
parent p1;
initial begin
c1 = new();
p1 = c1;
void'(cast(c2,p1));
end
endmodule

在uvm中的运用

在uvm中运用到子类和父类的转换很广泛,主要在driver,monitor,sequence里面使用,主要的方式有以下两种:代码实例如下

  1. driver中要通过sqr的seq_item_port接口获取get_next_item,获得默认是uvm_sequence_item类型(父类,也可以指定对应的transfer),但是传输对象实际是用户定义的子类transfer的对象,所以要获得transfer里面的成员变量,要用cast。

  2. driver中获取到uvm_sequence_item类型转换成transfer对象之后,如果调用clone,copy等uvm定义的函数,返回的对象的句柄依然是父类的句柄,要再次调用cast,转换成子类的对象。

transer req,rsp;
uvm_sequence_item item;
seq_item_port.get_next_item(item);     //通过接口默认获取到的item是sequence item类型的,但是指向的是transfer子类对象
void'(cast(req,item));                             //转换成用户定义的transfer子类句柄
void'($cast(rsp,req.clone()));                 //调用req的clone函数返回的是object的父父类的句柄,用转换成子类的句柄
rsp.child_j  = 1;                                     //最后才可以访问子类transfer里面的成员变量

版权声明:本文为q876507447原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。