我有一个包中声明了类param0
和param1
的包。
有人可以解释为什么这些类的实例化
( ex:param0 = new() )
应该在顶层模块上完成而不是直接在包本身内部进行?
我想在程序包中执行此操作的原因是在类param0
中使用类param1
的一些参数。
答案 0 :(得分:1)
我正在使用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
但是在包中声明像全局变量或实例这样的编码风格并不好。该包只应用于编写声明。即使你没有在包中这样做,但是在module
/ program
/ package
之外声明它们,它属于$unit
包。当然,您可以使用任何new
类实例化操作编写类函数体定义,函数或任务。包的概念只是声明,因此任何类,函数,任务,网络/变量都将被导入模块或程序。
答案 1 :(得分:0)
软件包仅用于声明,不能包含任何在checkers之外的进程。由于new new是一个特殊的函数调用,它必须在进程上下文中使用,因此不允许在包中。
您可以使用class1 :: parameter1直接引用类成员参数。
答案 2 :(得分:0)
在包中实例化对象的一个问题是,如果没有人使用(导入)包,该对象是否仍然需要构造? SystemVerilog标准没有回答这个问题,而是由工具供应商负责。因此,您可以更安全地将它们从包装中取出。