2012-11-13 31 views
1

我在那里类param0param1声明一个包。 有人能解释我为什么这些类系统的Verilog:一包的实例化对象

(ex:param0 = new()) 

的实例应该在顶层模块上进行,并包本身不直接里面?

我想在包内部做的原因是在类param1中使用param0类的一些参数。

回答

0

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

可以使用的Class1 ::参数1直接引用类成员的参数。

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操作编写类函数体定义,函数或任务。包的概念只是声明,所以任何类,函数,任务,网络/变量都将被导入到模块或程序中。

0

一个问题,在一个包实例化对象是个问题,如果没有人使用(进口)的软件包,并在对象仍然得到需要得到建设? SystemVerilog标准没有回答这个问题,而是留给工具供应商。所以你更安全,把它们从你的包里拿出来。