嵌入式技术
在许多项目中,我们希望声明一个原型类,其中声明的方法需要被扩展的子类覆盖,目的是让所有的子类都共享一个相同的类和方法(function或者task)原型。
为此引出概念virtual class 和pure virtual method。
virtual class 不允许被实例化,因为它仅仅是一个原型。如果你希望实例化一个virtual class,会得到一个编译错误。
virtual class 是很多方法学类库(配置、打印和进程通信等等)的一个基础,例如UVM。
声明一个virtual class 的方法很简单,就是在声明时加上关键字“virtual”
virtual class Packet; endclass
同理,virtual class中的virtual method也是一个原型,不提供方法的实现,声明时需要加上关键字“pure virtual”
virtual class Packet; pure virtual packetDisp ( ); endclass
下面是一个展示virtual class和virtual method的完整示例:
virtual class BaseClass; pure virtual function void disp( ); virtual function void disp1( ); $display("Virtual Function 'disp1' from class BaseClass"); endfunction function void disp2( ); $display("Function 'disp2' from BaseClass"); endfunction endclass class ChildClass extends BaseClass; //MUST defne implementation of 'disp' since it is declared 'pure virtual' in 'virtual class' BaseClass function void disp( ); $display("pure virtual function 'disp' of baseClass implemented in class ChildClass"); endfunction function void disp1( ); $display("virtual function 'disp1' of baseClass overridden in class ChildClass"); endfunction endclass module tb; BaseClass base; ChildClass child; initial begin //base = new; //cannot instantiate virtual class - Compile ERROR child = new; base = child; //upcasting base.disp; base.disp1; base.disp2; end endmodule
仿真log:
pure virtual function 'disp' of baseClass implemented in class ChildClass virtual function 'disp1' of baseClass overridden in class ChildClass Function 'disp2' from BaseClass V C S S i m u l a t i o n R e p o r t
上面的打印log表明了pure virtual method、virtual method以及其他method的区别。
pure virtual method一定要在扩展类中实现。disp( )
virtual method可以通过父类调用扩展类的方法。disp1( )
即非virtual method又非pure virtual method,方法的调用关键看所调用类的类型,而不看这个句柄具体指向的对象类型。disp2( )
我们再看一个层次化的virtual class扩展示例:
virtual class bus; bit [7:0] addr; pure virtual function void IC; endclass virtual class iConnect extends bus; //Not necessary to provide body for function IC //You may, but not necessary endclass class iConnect1 extends bus; //MUST provide body for function IC function void IC; endfunction endclass
在上面的例子中,我们声明了一个virtual class “bus”,但是扩展自“bus”的类依然声明成了一个virtual class “iConnect”。
因为类“iConnect”依然是一个virtual class,所以可以不进行pure virtual method的实现。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !