继承是面向对象编程范式的关键概念。类用来创建用户自定义类型. 继承使得用户可以用非常安全,非侵入的方式对类的行为进行增加或者修改。从基类做扩展并产生新的子类的过程叫类的派生,当一个类被扩展并创建之后,该派生类就继承了其基类的数据成员、属性和方法,这就是类的继承。
继承后的类可以实现以下功能:
继承了原来类的方法,并可以修改
添加新的方法
添加新的数据成员
在实现以上功能的同时需要满足一定的规则:
子类继承父类的所有数据成员和方法
子类可以添加新的数据成员和方法
子类可以重写基类中的数据成员和方法
如果一个方法被重写,其必须保持和基类的原有定义有一致的参数
子类可以通过super操作符来引用父类中的方法和成员
被声明为local的数据成员和方法只能对自己可见,对外部和子类都不可见;对声明为protected的数据成员和方法,对外部不可见,对自身和子类可见。
之前定义过的类Packet,可以进—步扩展构成一个新的类LinkedPacket。通过extends,LinkedPacket继承于其父类Packet,包括继承其所有的成员(变量/方法)。
class LinkedPacket extends Packet;
LinkedPacket next;
function LinkedPacket get_next();
get_next = next;
endfunction
endclass
子类可以继承父类的成员,所以LinkedPacket对象也是一个合法的Packet对象。
由此,父类句柄可以指向子类的对象。
LinkedPacket lp = new;
Packet p = lp;
关于父类和子类的句柄,可以将子类句柄直接赋值给父类句柄,子类可以拥有与父类同名的成员方法,子类可以拥有与父类同名的成员变量。
super是用来访问当前对象其父类的成员。尤其当子类的成员如果与父类的成员同名,那么需要使用super来指定访问其父类成员,而非默认的子类成员。
class Packet; // base class
integer value;
function integer delay();
delay = value * value;
endfunction
endclass
class LinkedPacket extends Packet; //derived class
integer value ;
function integer delay();
delay = super.delay ()+ value * super.value;
endfunction
endclass
为了使得可以在多个模块(硬件)或者类(软件)之间共享用户定义的类型,SV添加了包(package) 。
包的概念参考于VHDL,用户自定义的类型如类、方法、变量、结构体、枚举类等都可以在package…endpackage中定义。
module、interface、class等可以使用包中定义或者声明的内容。
可以通过域的索引符::号直接引用。
definitions::parameter
definitions::instruction_t inst
可以指定索引一些需要的包中定义的类型到指定的域中。
module M;
import definitions::instruction_t;
instruction_t inst;
endmodule
通过通配符 * 来将包中所有的类别导入到指定的域中。
module M;
import definitions::*;
instruction_t inst;
endmodule
package这个容器可以对类型做一个隔离的作用。package的意义在于将软件(类、类型、方法等)封装在不同的域中,以此来与全局的域进行隔离。
库是编译的产物,硬件( module、interface、program)都会编译到库中,如果不指定编译库的话,会被编译进入默认的库中。库可以容纳硬件类型,也可以容纳软件类型,例如类、方法和包。
包只能容纳软件类型例如类、方法和参数。