SystemVerilog中的package和`include有什么不同?

描述

肯定很多人会问为什么有的地方使用package,有的地方使用`include,二者是不是等价的呢?

答案是NO,二者并不等价,原因就要涉及System Verilog的命名空间了。

假设你有2个class “A”和“B” ,如下:

 

class A;
 int i;
 endclass : A
 
 class B;
 int i;
endclass : B

 

SystemVerilog会认为这两个class是不同的类型,原因是它们的名称不同,即使这两个class的内容是一模一样的。

因为Systemverilog中名称还表示着各种定义声明的命名空间。

所以,当你在一个package 中声明一个class,那么这个package的名称就隐式地成为class名称的前缀。

package P:

 

 package P;
 class A;
 int i;
 endclass : A
 A a1;
 endpackage : P

 

package Q:

 

package Q;
 class A;
 int i;
 endclass : A
 A a1;
endpackage : Q

 

所以,此时会有2个class A定义(P::A和Q::A), 并且P::a1 和Q::a1的类型并不兼容。

如果将将上述代码使用`include改写成:

 

class A;
 int i;
 endclass : A

 package P;
 `include "A.sv"
 A a1;
 endpackage : P
 
 package Q;
 `include "A.sv"
 A a1;
 endpackage : Q

 

因为`include只是简单的复制粘贴,所以P::a1和Q::a1仍然是不兼容的数据类型。若修改成下述形式:

 

package P;
 class A;
 int i;
 endclass : A
 endpackage : P
 
 package R;
 import P::A;
 A a1;
 endpackage : R
 
 package S;
 import P::A;
 A a1;
 endpackage : S

 

此时只有一个地方存在class “A” 的定义(package “P”),然后我们在package R和package S中import package A,此时在package R和package S中看到的class A就是同一个数据类型了。

这也是`include和package的主要区别。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分