系统verilog:包对象的实例化

时间:2012-11-13 06:20:07

标签: verilog system-verilog

我有一个包中声明了类param0param1的包。 有人可以解释为什么这些类的实例化

( ex:param0 = new() ) 

应该在顶层模块上完成而不是直接在包本身内部进行?

我想在程序包中执行此操作的原因是在类param0中使用类param1的一些参数。

3 个答案:

答案 0 :(得分:1)

我正在使用VCS,我不明白为什么无法在包中分配类对象。以下代码适用于VCSncverilog

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

在包中实例化对象的一个​​问题是,如果没有人使用(导入)包,该对象是否仍然需要构造? SystemVerilog标准没有回答这个问题,而是由工具供应商负责。因此,您可以更安全地将它们从包装中取出。