类和结构之间的区别很简单,但是包在哪里适合整个方案。我看到的大多数软件包都从库文件导入,并在目录中包含其他sv文件。更具体地说,何时通常在最佳编码方案中使用包,如果在该级别没有添加特定变量,是否更好的做法是使用头文件?谢谢
答案 0 :(得分:3)
包提供了一个编译范围,可以在其中创建类型,类,函数,任务和其他声明。然后可以将包导入其他范围(其他包或顶级编译单元范围)。
我认为包很像C ++中的命名空间。它们提供了一个以“打包”方式编译代码的区域,然后可以导入并在其他地方使用。
包是否包含在包文件中的声明,或来自包含在包声明中的头文件只是一个优先选择。
以下两个是等效的:
// File my_pkg.sv
package my_pkg;
class my_class;
endclass
endpackage
-
// File my_class.sv
class my_class;
endclass
// File my_pkg.sv
package my_pkg;
`include "my_class.sv"
endpackage
答案 1 :(得分:0)
像C ++ namepsaces这样的包可用于避免变量名称分类。
package a_pkg;
int value = 100;
class a_class;
task print;
$display ("value is %d", value);
endtask
endclass
endpackage
package b_pkg;
int value = 200;
class b_class;
task print;
$display ("value is %d", value);
endtask
endclass
endpackage
package c_pkg;
import a_pkg::value;
class c_class;
task print;
$display ("value is %d", value);
endtask
endclass
endpackage
这里有两个类引用自己包的全局变量,两个类都命名为'value'。第三类选择使用'import'来使用先前包中的全局变量。
没有包,情况就是这样:
int value = 100;
class a_class;
task print;
$display ("value is %d", value);
endtask
endclass
// int value = 100; // can't do... compilation error
class b_class;
task print; // prints 100
$display ("value is %d", value);
endtask
endclass
class c_class;
task print;
$display ("value is %d", value);
endtask
endclass
endpackage
另请注意,struct
的处理方式有点像标量或数组变量。 class
变量仅包含引用,并且需要new
调用才能创建class
对象。但struct
变量如数组变量直接保存值。这些也可用于可合成的RTL代码。
请注意,无法实例化包,并且只有一个包中声明的实例。它们可以被视为RTL中顶级模块的TB等价物,即未实例化的模块。