SystemVerilog没有那么多的OVER
1 overload
overload一般译为重载,是一个类中多态性的一种表现,指在一个类中定义了多个同名方法,它们或有不同的参数个数或者有不同的参数类型.例如:
function int func(bit sig)和function int func(int sig); // 两个方法的参数类型不同
function int func(bit sig)和function int func(bit sig1,bit sig2); // 两个方法的参数个数不同
这里需要注意,同名方法调用时,会根据参数列表确定调用哪个方法,重载不关心方法返回类型(所以,如果仅仅只是返回值不同的不是overload).
虽然overload具有这么智能的调用特性,但是这个特性在SystemVerilog中并不支持.
2 override
override一般译为覆盖,也是基于继承和多态特性,指派生类中存在重新定义的方法,其方法名,参数列表,返回值类型,所有都必须同基类中被重写的方法一致,方法体不同并且父类中该方法必须在声明时指定为virtual方法.调用该被override的同名方法时,会根据句柄(handle)指向的对象的类型决定调用基类中的还是子类中的同名方法,经常在验证环境中会使用一个父类的句柄去动态地引用子类对象.
【示例】
3 overwrite
overwrite可以按照字面译为重写,但是更被经常称为隐藏,是指派生类中的函数把基类中相同名字的函数屏蔽掉了.overwrite发生在子类和基类之间,即不同的类域之间.overwrite发生在同名函数中,同不同参无所谓.发生overwrite的函数必须是非虚函数,这是同override不同的,在调用被overwrite的函数时,会根据句柄(handle)的类型决定调用基类中的还是子类中的同名函数.
【示例】
示例中,pt指向parent类型的对象时,此时调用的disp为parent中定义的disp,cd指向child类型对象时,此时调用的disp为child中定义的disp,到这里,overwrite和overload似乎一样.但是当pt指向cd指向的对象时,此时调用disp并没有根据pt指向的对象的类型而调用disp,而是由句柄本身的类型决定调用disp,因为此时pt的句柄类型为parent,所以此时调用的disp仍然为父类中的disp.这里需要注意:不同句柄类型之间的相互转换,详情可查阅“SystemVerilog中不同句柄之间的动态类型转换.
综上所述,我们可以得到三种over的关系如下表:
over类型 | SystemVerilog是否支持 | 被重写方法是否为虚方法 | 调用方法依据 |
overload | 不支持 | - | - |
override | 支持 | 是 | 句柄指向对象类型 |
overwrite | 支持 | 否 | 句柄类型 |