关于package的import 和文件include

http://www.eetop.cn/blog/html/28/1561828-2316833.html
师父在文章 《SV系统集成篇之一:包的意义》实际上讲解的很透彻了。

前几天,在安装sysnopsys Ethernet Vip时发现:
当我把软件部分按照uvm_getting_start安装, 但是elaboration的时候ethernet中的config文件无法正常使用,报告其中的一个枚举变量找不到。
这就涉及到include 和 import 的意义了。
根据include文件, 可以一层层组织文件的编译。
但是import package库,package库中的方法就只能作用于当前域(即当前文件及当前文件include的文件中)了。通常的做法,也就是使用package来分割方法的使用域。
最终的解决办法只是把定义枚举变量的库import进来。


——-以下来自Package的意义的讲解————–
如果在package a_pkg中import了package b_pkg::type_b,那么在module1中import a_pkg::*时,无法引用到type_b。因为a_pkg只是使得b_pkg::type_b在a_pkg域中可见并加以使用,并未定义在a_pkg中。所以,用户需要牢记一点的是,import操作使得类型可见的域只是调用该import时当前的域。例如下面的例子中,a_pkg中可见b_pkg::b_mon,但是module1则无法可见a_pkg::b_mon。

package b_pkg;
  class b_mon;
  endclass
endpackage

package a_pkg;
  import b_pkg::b_mon;
  class a_mon;
  endclass
endpackage

module module1;
import a_pkg::*;
a_mon mon1 = new(); // a_mon可见
b_mon mon2 = new(); // b_mon不可见
endmodule

要解决上面的问题,用户可以使用export来让b_mon在a_pkg中得到二次定义。从下面这个例子中可以发现,a_pkg中需要额外使用export来让b_pkg::b_mon在a_pkg得到定义。因此,在module1中import a_pkg::*,可以搜寻到a_pkg中的a_mon和b_mon两种类型。

package b_pkg;
  class b_mon;
  endclass
endpackage

package a_pkg;
  import b_pkg::b_mon;
  export b_pkg::b_mon;
  class a_mon;
  endclass
endpackage

module module1;
    import a_pkg::*;
    a_mon mon1 = new();
    b_mon mon2 = new();
endmodule

用户使用到的系统函数和任务,例如 stop() s t o p ( ) 、 randomize()等等凡是带有“$”符号的方法,另外一种调用的方式是std::method,例如std::randomize()。这隐含地是所有的系统方法都是预定义在一个称之为std包中的。用户只能使用这些包内的方法和类型,无法二次对std包做出修改和添加。

你可能感兴趣的:(SV语法)