SystemVerilog中的Virtual(Abstract)Class和Pure Virtual Method

嵌入式技术

1368人已加入

描述

在许多项目中,我们希望声明一个原型类,其中声明的方法需要被扩展的子类覆盖,目的是让所有的子类都共享一个相同的类和方法(function或者task)原型。

为此引出概念virtual classpure 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的实现。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分