我正在尝试了解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
答案 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