SV语言-高级话题

类型转换

显示转换:需要操作符号或系统函数介入,如静态转换和动态转换
隐式转换:不需要进行转换的操作
静态转换: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()

回调函数

参数化的类

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值