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标准没有回答这个问题,而是由工具供应商决定。所以把它们放在你的包裹里会更安全