Virtual Interface |
隔离抽象模型(class)和实际信号(port wire reg),可在仿真过程中动态控制连接信号。
在class内使用,这样class的不同实例可连外部不同的interface实例。 |
interface SBus; // A Simple bus interface logic [7:0] addr, data;
class SBusTransactor; function new( virtual SBus s ); ... endclass |
Virtual Class |
模板class,只能被继承,而不能被实例化 |
virtual class BasePacket; |
Virtual Method |
能被子类方法覆盖的方法(可继承,可另起炉灶、以下犯上),可只在父类中表明virtual。
如果把一个class的方法定义为virtual,那么在进行调用的时候,是根据对象的类型,而非句柄的类型,如果方法没有使用virtual进行修饰,则会调用句柄类型的方法,而非对象类型的方法。这个体现了OOP中的多态的特性。
子类句柄赋值给父类句柄时:当定义了virtual时,在子类中调用某function/task,会先查找在子类中是否定义该function/task,如果没有定义该function/task,则在父类中查找。未定义virtual时,只在子类中查找,没有定义就是编译错误。 |
class BasePacket; int B = 2; function void printA; $display("BasePacket::A is %d", A); endfunction : printA virtual function void printB; $display("BasePacket::B is %d", B); endfunction : printB endclass : BasePacket
class My_Packet extends BasePacket; int A = 3; int B = 4; function void printA; $display("My_Packet::A is %d", A); endfunction: printA virtual function void printB; $display("My_Packet::B is %d", B); endfunction : printB endclass : My_Packet
BasePacket P1 = new; My_Packet P2 = new; initial begin P1.printA; // displays 'BasePacket::A is 1' P1.printB; // displays 'BasePacket::B is 2' P1 = P2; // P1 has a handle to a My_packet object P1.printA; // displays 'BasePacket::A is 1' P1.printB; // displays 'My_Packet::B is 4' – latest derived method P2.printA; // displays 'My_Packet::A is 3' P2.printB; // displays 'My_Packet::B is 4 end
|
Pure Virtual Method |
virtual class中不包含具体实现的virtual method
因为virtual class永远不会直接例化,所以其method没实现也没关系。
但是,在其非virtual子类中必须给出method的实现。如果这样总给“空头支票”,实例调用该method还有什么意义呢。 |
------------------- virtual class BasePacket; |