class 和 struct 之间的区别很简单,但是 package 在整个方案中的位置。我看到的大多数包都从库文件中导入,并在目录中包含其他 sv 文件。更具体地说,什么时候包通常用于最佳编码方案,如果没有在该级别添加特定变量,使用头文件是否是更好的做法?谢谢
问问题
8025 次
2 回答
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
于 2013-01-15T20:11:35.100 回答
1
包,如 C++ 命名空间,可用于避免变量名冲突。
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
这里两个类引用它们自己包的全局变量,都命名为“值”。第三类选择使用前一个包中的全局变量,使用“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
s 视为有点像标量或数组变量。一个class
变量只包含一个引用,并且new
需要一个调用来创建一个class
对象。但是struct
像数组变量这样的变量直接保存值。这些也可用于可综合的 RTL 代码。
请注意,无法实例化包,并且包中声明的任何内容只有一个实例。它们可以看作是 RTL 中顶级模块的 TB 等价物,即未实例化的模块。
于 2013-05-11T13:09:24.583 回答