systemverilog中'new'和'virtual'的目的是什么?

时间:2016-02-12 01:33:27

标签: system-verilog

我正在尝试了解SystemVerilog。在阅读它时,我遇到了以下代码,我无法完全理解:

测试1。

class A ; 
  task disp();
    $display(" This is class A "); 
  endtask 
endclass 

class EA extends A ; 
  task disp (); 
    $display(" This is Extended class A "); 
  endtask 
endclass 

program main ; 
  EA my_ea; 
  A my_a; 

  initial 
  begin 
    my_a.disp(); 
    my_a = my_ea; 
    my_a.disp(); 
  end 
endprogram 

的Test2。

class A ; 
  virtual task disp (); 
    $display(" This is class A "); 
  endtask 
endclass 

class EA extends A ; 
  task disp (); 
    $display(" This is Extended class A "); 
  endtask 
endclass 

program main ; 
  EA my_ea; 
  A my_a; 

  initial 
  begin 
    my_a = new(); 
    my_a.disp(); 

    my_ea = new(); 
    my_a = my_ea; 
    my_a.disp(); 
  end 
endprogram 

我对上面的test1代码有一些疑问。有人调用了一些“新”函数,但是没有在任何地方提供它的实现。那么这段代码如何编译和运行呢?

同样在test2中,您可以看到'virtual'关键字。我不明白使用'虚拟'背后的原因。你能解释为什么我们必须在这种背景下使用'虚拟'吗?

更新

我想从Greg实现示例代码。 但是我有一些问题,如下所示

                         Chronologic VCS (TM)
         Version J-2014.12-SP1-1 -- Wed Aug  8 08:33:23 2018
               Copyright (c) 1991-2014 by Synopsys Inc.
                         ALL RIGHTS RESERVED

This program is proprietary and confidential information of Synopsys Inc.
and may be used and disclosed only as authorized in a license agreement
controlling such use and disclosure.

Parsing design file 'design.sv'
Parsing design file 'testbench.sv'

Error-[SE] Syntax error
  Following verilog source has syntax error :
  "testbench.sv", 21: token is '('
    function(A a);
             ^

1 error
CPU time: .073 seconds to compile
Exit code expected: 0, received: 1
Done

1 个答案:

答案 0 :(得分:1)

new关键字是构造函数,它创建对象。由于未定义new,因此推断默认构造函数:

function new();
endfunction

必须在调用任何方法之前构造对象。 Test1应该通过空指针错误,因为你调用的对象的方法还没有被构造。

virtual关键字和概念在C ++,Java等中是相同的。virtual主题和多态性已经解释了很多解释,例如:Why do we need virtual functions in C++?

简而言之,指向子对象的父句柄可以执行对象的方法(如果它是虚拟的)。理解这一点的最好方法是创建一个具有虚拟和非虚拟方法的类和子类。例如:

module main ; 
  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 

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

  EA my_ea; 
  A my_a; 

  initial 
  begin 
    my_a = new(); 
    my_ea = new(); 
    disp(my_a); 
    disp(my_ea); 
    my_a = my_ea; 
    disp(my_a); 
  end 
endmodule