包的通配符导出未能使变量可用

编程语言 2026-07-11

我试图创建一个可以导出其他包的 package。为此,我只是简单地按下列方式实现,但遇到了编译错误。似乎 export 并不像在LRM中所描述的那样正常工作。我尝试了多种不同的实现方式,针对两者得到的行为也不同。

代码1 报错:

//---------(1)--------------
package P1;
  int a = 1;
  int b = 4;
endpackage : P1

package P2;
  import P1::*;
  export P1::*;
  int c = 2;
endpackage : P2

module TRY1( );
  import P2 :: *;
  initial begin
    $display("top : P1::a = %0d", a);
    $display("top : P1::b = %0d", b);
    $display("top : P2::c = %0d", c);
  end
endmodule : TRY1

但代码2 没有任何错误:

//---------(2)--------------
package P1;
  int a = 1;
  int b = 4;
endpackage : P1

package P2;
  import P1::*;
  export P1::a;
  export P1::b;
  int c = 2;
endpackage : P2

module TRY1( );
  import P2 :: *;
  initial begin
    $display("top : P1::a = %0d", a);
    $display("top : P1::b = %0d", b);
    $display("top : P2::c = %0d", c);
  end
endmodule : TRY1

解决方案

代码1 确实会产生错误。由于 P2 没有引用 ab,它们没有被导出,因此在模块中不可用。

请参阅IEEE Std 1800-2023,第26.6节 从包中导出导入的名称。示例代码展示了以下解释:

// p1::x and q are made available from p3. Although p1::y
// is a candidate for import, it is not actually imported
// since it is not referenced. Since p1::y is not imported,
// it is not made available by the export.

在代码2 中,你显式地导出了 ab,从而使它们可用。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章