systemverilog中struct,package和class之间的区别

时间:2013-01-15 18:25:58

标签: verification system-verilog

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

2 个答案:

答案 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等价物,即未实例化的模块。