SystemVerilog中的Virtual Methods

嵌入式技术

1367人已加入

描述

SystemVerilog中多态能够工作的前提是父类中的方法被声明为virtual的。

再回顾一下,当我们将子类对象实例赋值给一个父类句柄时,就可以使用父类句柄访问子类对象的方法,前提是
在父类的方法声明前面加上关键字“virtual”

一旦某个方法在父类中被声明为“virtual”,它总是“virtual”的,无法在继承类中将该方法修改成非“virtual”的。

下面是一个非virtual方法示例:

 

class packet;
 function void disp;
 $display("From packet");
 endfunction
endclass


class eth_packet extends packet;
 function void disp;
 $display("From eth_packet");
 endfunction
endclass


module class_TOP( );
 initial begin
 packet p1;
 eth_packet e1 = new;
 //assign child class handle to parent class variable.
 p1 = e1;
 p1.disp;
 end
 endmodule

 

在上面的例子中,我们声明了2个类“eth_packet”和“packet”,其中“eth_packet”扩展自“packet”。
然后我们实例化扩展类“eth_packet”,并将对象实例赋值给父类句柄“p1”。

最后,调用方法“p1.disp.”,结果打印的是父类中的函数声明内容,即使该句柄实际已经指向了扩展类“eth_packet”对象。

仿真log:

 

From packet
 V C S S i m u l a t i o n R e p o r t

 

如果我们在父类函数声明中加上“virtual”关键字

 

class packet;
 //parent class method declared 'virtual'
 virtual function void disp;
 $display("From packet");
 endfunction
endclass


 

打印log显示执行的是子类中声明的函数:

 

From eth_packet
 V C S S i m u l a t i o n R e p o r t

 

  审核编辑:汤梓红

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

全部0条评论

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

×
20
完善资料,
赚取积分