System verilog 为什么可以';我不能在初始块或始终块之外调用构造函数吗?

System verilog 为什么可以';我不能在初始块或始终块之外调用构造函数吗?,system-verilog,System Verilog,我尝试使用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 它在句柄声明后的对象创建中给出

我尝试使用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是“=”p=new()

但是,当我将模块“main”更改为


我没有发现这样的错误。这是为什么?

错误是由以下两行引起的:

P = new();
C = new();
是程序代码-它们必须位于
初始
始终
块内。它们是过程代码,因为它们调用一个函数——构造函数“new”

但是,这两行是声明性代码:

因此,它们在
首字母
始终
块之外是合法的。它们是声明性代码,因为它们声明了两个对象(
P
类的
parent
C
类的
child
)。这些对象也可以通过调用其构造函数进行初始化。这两个对象具有模块范围-它们将在整个模块中可见


将这两行代码放在
首字母
始终
块中也是合法的(只要它们出现在任何程序代码之前)。在这种情况下,这两个对象将具有块范围-它们将仅在该块内可见

错误是由以下两条线引起的:

P = new();
C = new();
是程序代码-它们必须位于
初始
始终
块内。它们是过程代码,因为它们调用一个函数——构造函数“new”

但是,这两行是声明性代码:

因此,它们在
首字母
始终
块之外是合法的。它们是声明性代码,因为它们声明了两个对象(
P
类的
parent
C
类的
child
)。这些对象也可以通过调用其构造函数进行初始化。这两个对象具有模块范围-它们将在整个模块中可见

将这两行代码放在
首字母
始终
块中也是合法的(只要它们出现在任何程序代码之前)。在这种情况下,这两个对象将具有块范围-它们将仅在该块内可见

parent P = new();
child C = new();