为什么我不能在初始或总是块之外调用构造函数?

时间:2018-03-28 10:56:49

标签: 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

在句柄声明后创建对象时出错。错误如下:

  

错误 - [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

我没有得到这样的错误。这是为什么?

1 个答案:

答案 0 :(得分:2)

错误是由这两行引起的:

P = new();
C = new();

程序代码 - 它们必须位于initialalways块内。它们是程序代码,因为它们调用函数 - 构造函数" new"。

然而,这两行是声明性代码

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

因此它们在initialalways块之外是合法的。它们是声明性代码,因为它们声明了两个对象(类P的{​​{1}}和类parent的{​​{1}}。通过调用它们的构造函数,这些对象也是初始化。这两个对象具有模块范围 - 它们将在整个模块中可见。

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