0

class 和 struct 之间的区别很简单,但是 package 在整个方案中的位置。我看到的大多数包都从库文件中导入,并在目录中包含其他 sv 文件。更具体地说,什么时候包通常用于最佳编码方案,如果没有在该级别添加特定变量,使用头文件是否是更好的做法?谢谢

4

2 回答 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

另请注意,将structs 视为有点像标量或数组变量。一个class变量只包含一个引用,并且new需要一个调用来创建一个class对象。但是struct像数组变量这样的变量直接保存值。这些也可用于可综合的 RTL 代码。

请注意,无法实例化包,并且包中声明的任何内容只有一个实例。它们可以看作是 RTL 中顶级模块的 TB 等价物,即未实例化的模块。

于 2013-05-11T13:09:24.583 回答