类型转换
显示转换:需要操作符号或系统函数介入,如静态转换和动态转换
隐式转换:不需要进行转换的操作
静态转换:tgt '(src), 不会对转换值做检查
动态转换 : $cast(tgt,src)
类句柄向下转换,即父类句柄转换为子类句柄时,需要$cast()
子类句柄赋给父类时,编译器认为合法,但子类句柄和父类句柄调用相同对象时,可能有不同表现
$ cast(tgt,src)会检查句柄所指向的对象类型,一旦元对象跟目的句柄是同一类型,或者目的句柄的扩展类,$cast()执行成功返回1,否则返回0
虚方法
类的继承包括成员变量和成员方法
在编译阶段就确定下来调用方法所处作用域的方式称为静态绑定
动态绑定指在调用方法时,会在运行时来确定句柄指向对象的类型,在动态指向应该调用的方法
在为父类定义方法时,如果该方法日后可能会被覆盖或继承,应声明为虚方法
尽量定义在底层父类
只需声明一次
遵循相同的参数和返回类型
当决定调用哪个虚方法时,SV感觉对象类型,而非句柄类型做决定。
对象拷贝
Packet p1; //句柄
Packet p2;
p1 = new(); //对象, p1 p2 代表两个不同的对象
p2 = new(p1); //将从p1拷贝的成员变量赋给对象p2, 浅拷贝
对象拷贝(成员变量的拷贝):创建一个新的对象,再将目标对象的成员变量值拷贝给新对象的成员
class basic_test; //父类
...
virtual function void copy_data(basic_test t);
t.def = def;
t.fin = fin;
endfunction
virtual function basic_test copy();
basic_test t = new(0);
copy_data(t);
return t;
endfunction
endclass
class test_wr extends basic_test; //子类
...
function void copy_data(basic_test t);
test_wr h;
super.copy_data(t); //父类成员变量copy
$cast(h,t);
h.def = def; //子类成员copy
endfunction
function basic_test copy();
test_wr t = new();
copy_data(t);
return t;
endfunction
endclass
module tb;
...
test_wr wr;
test_wr h;
initial begin
wr = new();
$cast(h,wr_copy());
$display("wr.def = %0d", wr.def);
$display("h.def = %0d", h.def);
h.def = 300;
$display("wr.def = %0d", wr.def);
$display("h.def = %0d", h.def);
end
...
endmodule
//两个独立句柄
输出 结果:
# wr.def = 200
# h.def = 200
# wr.def = 200
# h.def = 300
成员拷贝函数copy_data()和新对象生成函数copy()