systemverilog-虚方法

1.虚方法

OOP中多个子程序使用一个共同的名字的现象叫做“多态”。虚方法就是一个基本的多态结构。
默认情况下,子类覆盖的方法并不会继承父类的同名方法,只有通过super.method() 的方式显示执行,才会达到继承父类方法的效果。

  • 类的继承是继承父类的成员变量成员方法
  • 子类对象中即有从父类继承而来的,也有子类扩展的方法和变量
  • 子类中重写的方法对父类是不可见的
    要想子类重写父类的方法能被父类看到,那就需要虚方法。
class Transaction;
	rand bit[31:0] src,dst,data[8];
	bit[31:0] crc;
	virtual functon void calc_crc();
		crc=src^dst^data.xor;
	endfunction
endclass:Transaction

class BadTr extends Transaction;
	rand bit bad_crc;
	virtual function void calc_crc();
		super.calc_crc();
		if(bad_crc) crc =~ crc;
	endfunction
endclass:BadTr
Transaction tr;
BadTr bad;
initial begin
	tr = new();
	tr.calc_crc(); // 调用Transaction::calc_crc

	bad = new();
	bad.calc_crc();// 调用BadTr::calc_crc

	tr = bad;
	tr.calc_crc();//调用BadTr::calc_crc
end

当决定调用哪个虚方法时:

  • SV 根据对象的类型,而非句柄的类型来决定调用什么方法(tr指向一个扩展类对象,所以调用的方法是BadTr::calc_crc)
  • 如果没有对calc_crc使用virtual修饰符,SV根据句柄的类型tr,而不是对象的类型(调用Transaction::calc_crc)

注意:

  • 在为父类定义方法时,如果该方法日后会被覆盖或者继承,那么加virtual;
  • virtual只需要在父类声明一次,子类可以无需再次声明
  • 虚方法的继承要和父类的参数和返回值类型相同,否则定义的方法就不算重写父类方法
  • 虚方法尽量定义在最底层的父类
  • 不能给成员变量添加virtual,不能用父类句柄找到子类中的成员变量

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