System verilog:包对象的实例化

System verilog:包对象的实例化,verilog,system-verilog,Verilog,System Verilog,我有一个包,其中声明了类param0和param1。 有人能解释一下为什么要实例化这些类吗 ( ex:param0 = new() ) 应该在顶部模块上完成,而不是直接在软件包内部完成 我希望在包内执行此操作的原因是在类内使用类param0的一些参数param1包仅用于声明,不能包含任何进程,除了检查程序。由于类new是一个特殊的函数调用,它必须在流程上下文中使用,因此在包中是不允许的 您可以使用class1::parameter1直接引用类成员参数。包仅用于声明,不能包含任何进程(在检查程

我有一个包,其中声明了类
param0
param1
。 有人能解释一下为什么要实例化这些类吗

( ex:param0 = new() ) 
应该在顶部模块上完成,而不是直接在软件包内部完成


我希望在包内执行此操作的原因是在类内使用类
param0
的一些参数
param1

包仅用于声明,不能包含任何进程,除了检查程序。由于类new是一个特殊的函数调用,它必须在流程上下文中使用,因此在包中是不允许的


您可以使用class1::parameter1直接引用类成员参数。

包仅用于声明,不能包含任何进程(在检查程序之外)。由于类new是一个特殊的函数调用,它必须在流程上下文中使用,因此在包中是不允许的


您可以使用class1::parameter1直接引用类成员参数。

我使用的是
VCS
,我不明白为什么不能在包中分配类对象。以下代码在
VCS
ncverilog
中工作

package pkg;
    class Base;
        int x;
        function new();
            x=1;
        endfunction
        function int value();
            return x;
        endfunction
    endclass : Base
    class C;
      Base b;
      function new();
        b = new;
      endfunction
      function get();
        return b.value();
      endfunction
    endclass : C

    C d = new;
endpackage

pkg::C e = new;

module top;
    import pkg::*;
    C c;
    initial begin
        c = new;
        $display("c=%d", c.get());
        $display("d=%d", d.get());
        $display("e=%d", e.get());
    end
endmodule

但是,在包中声明全局变量或实例等不是一种好的编码方式。该包应仅用于编写声明。即使您没有在包中这样做,但在
模块
/
程序
/
之外声明它们,它也属于
$unit
包。当然,您可以使用类实例化的任何
new
操作编写类函数体定义、函数或任务。包的概念只是声明,因此任何类、函数、任务、网络/变量都将被导入模块或程序。

我使用的是
VCS
,我不明白为什么不能在包中分配类对象。以下代码在
VCS
ncverilog
中工作

package pkg;
    class Base;
        int x;
        function new();
            x=1;
        endfunction
        function int value();
            return x;
        endfunction
    endclass : Base
    class C;
      Base b;
      function new();
        b = new;
      endfunction
      function get();
        return b.value();
      endfunction
    endclass : C

    C d = new;
endpackage

pkg::C e = new;

module top;
    import pkg::*;
    C c;
    initial begin
        c = new;
        $display("c=%d", c.get());
        $display("d=%d", d.get());
        $display("e=%d", e.get());
    end
endmodule

但是,在包中声明全局变量或实例等不是一种好的编码方式。该包应仅用于编写声明。即使您没有在包中这样做,但在
模块
/
程序
/
之外声明它们,它也属于
$unit
包。当然,您可以使用类实例化的任何
new
操作编写类函数体定义、函数或任务。包的概念只是声明,因此任何类、函数、任务、网络/变量都将被导入到模块或程序中。

包中实例化对象的一个问题是,如果没有人使用(导入)包,对象是否仍然需要构造?SystemVerilog标准没有回答这个问题,而是由工具供应商决定。所以把它们放在你的包裹里会更安全

在包中实例化对象的一个问题是,如果没有人使用(导入)包,对象是否仍然需要构造?SystemVerilog标准没有回答这个问题,而是由工具供应商决定。所以把它们放在你的包裹里会更安全