2013-01-15 141 views
0

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

回答

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 
0

软件包,如C++ namepsaces可以用来避免变量名colisions。

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的处理有点像标量或数组变量。 A class变量仅包含一个参考,并且需要调用new才能创建一个class对象。但struct变量像数组变量直接保持值。这些也可以用于可合成的RTL代码。

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

相关问题