如何在systemverilog中使用“虚拟”关键字?

时间:2018-08-10 02:15:15

标签: system-verilog

我试图与功能一起理解'虚拟'关键字。

我做了如下实验,

  class A ; 
         function void disp (); 
          $display(" Non-Virtual from A "); 
        endfunction
        virtual function void vdisp (); 
          $display(" Virtual from A "); 
        endfunction
      endclass 

      class EA extends A ;
          function void disp (); 
          $display(" Non-Virtual from EA "); 
        endfunction
         virtual function void vdisp (); 
          $display(" Virtual from EA "); 
        endfunction
      endclass 

    module main ; 

      function void disp( A a);
        a.disp();
        a.vdisp();
      endfunction

        A my_a; 
        EA my_ea;


      initial 
      begin 
        my_a = new(); 
        my_ea = new(); 

        disp(my_a); 
        disp(my_ea); 

      end 
    endmodule

我从代码中得到了以下消息,

Non-Virtual from A 
 Virtual from A 
 Non-Virtual from A 
 Virtual from EA 

但是我的期望是这样

 Non-Virtual from A 
 Virtual from A 
 Non-Virtual from EA 
 Virtual from EA 

“ vitual”关键字在systemverilog中有什么作用?

请您解释为什么我得到这个结果?以及如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

您已经构造了两个对象,一个对象的类型为A,其句柄存储在my_a中,另一个对象的类型为EA,其句柄存储在my_ea中。调用disp(my_ea)时,会将EA句柄上移到类型为a的函数参数类变量A

当您调用非虚函数时,它使用类变量A的固定类类型a来选择要调用的方法。因此function A::disp被呼叫。

调用虚拟函数时,存储在类变量EA中的类句柄a的动态类型用于选择调用哪个方法。因此EA::disp被调用。

答案 1 :(得分:0)

换句话说:虚函数是一种特殊类型的函数,当被调用时,它会执行存在于父类和子类之间的“最”子方法。此属性也称为多态性。当子方法的签名(名称、参数类型、方法是否为常量)和返回类型与父类方法的签名和返回类型匹配时,将调用子方法。此类方法称为覆盖(或“覆盖方法”)。因为 class EA extends A ,你得到了 Virtual from EA ,作为 EA 的方法大多数孩子)