SystemVerilog中的Virtual总结

 

Virtual Interface

隔离抽象模型(class)和实际信号(port wire reg),可在仿真过程中动态控制连接信号。

 

在class内使用,这样class的不同实例可连外部不同的interface实例。

interface SBus; // A Simple bus interface
logic req, grant;

logic [7:0] addr, data;
endinterface

 

class SBusTransactor;
virtual SBus bus;

function new( virtual SBus s );
bus = s; // initialize the virtual interface
endfunction

...

endclass

Virtual Class

模板class,只能被继承,而不能被实例化

virtual class BasePacket;
...
endclass

Virtual Method

能被子类方法覆盖的方法(可继承,可另起炉灶、以下犯上),可只在父类中表明virtual。

 

如果把一个class的方法定义为virtual,那么在进行调用的时候,是根据对象的类型,而非句柄的类型,如果方法没有使用virtual进行修饰,则会调用句柄类型的方法,而非对象类型的方法。这个体现了OOP中的多态的特性。

 

子类句柄赋值给父类句柄时:当定义了virtual时,在子类中调用某function/task,会先查找在子类中是否定义该function/task,如果没有定义该function/task,则在父类中查找。未定义virtual时,只在子类中查找,没有定义就是编译错误。

class BasePacket;
int A = 1;

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;
pure virtual function integer send(bit[31:0] data); // No implementation
endclass
class EtherPacket extends BasePacket;
virtual function integer send(bit[31:0] data);
// body of the function
...
endfunction
endclass

 

发布了20 篇原创文章 · 获赞 4 · 访问量 3090

猜你喜欢

转载自blog.csdn.net/niceshotgoodball/article/details/104046197