我尝试使用Synopsys VCS运行此代码:
class parent;
int a = 10;
endclass
class child extends parent;
int b = 10;
endclass
module main;
parent P;
child C;
P = new();
C = new();
initial begin
$display("a=%d\n",C.a);
end
endmodule
在句柄声明后创建对象时出错。错误如下:
错误 - [SE]语法错误以下verilog源语法错误:“class.sv”,20:token is'='P = new();
但是,当我将模块“main”更改为此
时module main;
parent P = new();
child C = new();
initial begin
$display("a=%d\n",C.a);
end
endmodule
我没有得到这样的错误。这是为什么?
答案 0 :(得分:2)
错误是由这两行引起的:
P = new();
C = new();
是程序代码 - 它们必须位于initial
或always
块内。它们是程序代码,因为它们调用函数 - 构造函数" new"。
然而,这两行是声明性代码:
parent P = new();
child C = new();
因此它们在initial
或always
块之外是合法的。它们是声明性代码,因为它们声明了两个对象(类P
的{{1}}和类parent
的{{1}}。通过调用它们的构造函数,这些对象也是初始化。这两个对象具有模块范围 - 它们将在整个模块中可见。
将这两行代码放在C
或child
块中(只要它们出现在任何过程代码之前)也是合法的。在这种情况下,两个对象将具有块范围 - 它们仅在该块内可见。