嵌入式技术
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
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !