我有一个包,其中声明了类param0
和param1
。有人可以解释一下为什么这些类的实例化
( ex:param0 = new() )
应该在顶部模块上完成,而不是直接在包本身内完成?
我之所以想在包里面做是为了在类param0
里面使用类的一些参数param1
。
我有一个包,其中声明了类param0
和param1
。有人可以解释一下为什么这些类的实例化
( ex:param0 = new() )
应该在顶部模块上完成,而不是直接在包本身内完成?
我之所以想在包里面做是为了在类param0
里面使用类的一些参数param1
。
我正在使用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
用于类实例化的任何操作。包的概念只是声明,因此任何类、函数、任务、网络/变量都将被导入到模块或程序中。
包仅用于声明,不能包含检查器之外的任何进程。由于类 new 是一个特殊的函数调用,它必须在进程上下文中使用,因此不允许在包中使用。
您可以使用 class1::parameter1 直接引用类成员参数。
在包中实例化对象的一个问题是,如果没有人使用(导入)包,是否仍然需要构造对象?SystemVerilog 标准没有回答这个问题,而是由工具供应商决定。因此,将它们从包裹中取出会更安全。