Verification systemverilog中结构、包和类之间的差异

Verification systemverilog中结构、包和类之间的差异,verification,system-verilog,Verification,System Verilog,类和结构之间的区别很简单,但是包在整个方案中适合于哪里呢。我看到的大多数包都从库文件导入,并在目录中包含其他sv文件。更具体地说,当包通常用于最佳编码方案时,如果没有在该级别添加特定变量,那么使用头文件是否是更好的做法?感谢软件包提供了一个编译范围,可以在其中进行类型、类、函数、任务和其他声明。然后可以将包导入其他范围(其他包或顶级编译单元范围) 我认为包非常类似于C++中的命名空间。它们提供了一个以“打包”方式编译代码的区域,然后可以导入并在其他地方使用 包是直接包含在包文件中的声明,还是来自

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

软件包提供了一个编译范围,可以在其中进行类型、类、函数、任务和其他声明。然后可以将包导入其他范围(其他包或顶级编译单元范围)

我认为包非常类似于C++中的命名空间。它们提供了一个以“打包”方式编译代码的区域,然后可以导入并在其他地方使用

包是直接包含在包文件中的声明,还是来自包含在包声明中的头文件,这只是一个偏好问题

以下两项是等效的:

// File my_pkg.sv
package my_pkg;
    class my_class;
    endclass
endpackage
--


包提供了一个编译范围,可以在其中进行类型、类、函数、任务和其他声明。然后可以将包导入其他范围(其他包或顶级编译单元范围)

我认为包非常类似于C++中的命名空间。它们提供了一个以“打包”方式编译代码的区域,然后可以导入并在其他地方使用

包是直接包含在包文件中的声明,还是来自包含在包声明中的头文件,这只是一个偏好问题

以下两项是等效的:

// File my_pkg.sv
package my_pkg;
    class my_class;
    endclass
endpackage
--


包,可以使用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
这里有两个类引用它们自己包的全局变量,都命名为“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
s在某种程度上被视为标量或数组变量。
class
变量只包含一个引用,创建
class
对象需要调用
new
。但是像数组变量这样的
struct
变量直接保存值。这些也可以用于可合成的RTL代码


请注意,包不能实例化,并且包中声明的内容只有一个实例。在RTL中,它们可以被看作是顶级模块的TB等价物,即没有实例化的模块。

包,可以使用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
这里有两个类引用它们自己包的全局变量,都命名为“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
s在某种程度上被视为标量或数组变量。
class
变量只包含一个引用,创建
class
对象需要调用
new
。但是像数组变量这样的
struct
变量直接保存值。这些也可以用于可合成的RTL代码

请注意,包不能实例化,并且包中声明的内容只有一个实例。它们可以被视为RTL中顶级模块的TB等价物,即未实例化的模块