肯定很多人会问为什么有的地方使用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的主要区别。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !