You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将第一个Package导入第二个后再导入测试台,无法访问第一个Package内容

SystemVerilog包导入问题:导入子包后无法访问父包内容

问题场景

将第一个包导入第二个包,再把第二个包导入测试台,原本期望测试台中能访问两个包的所有内容,但模拟器无法找到第一个包的内容并报错。已知可以通过同时将两个包导入测试台解决,现明确问题原因及其他解决方案。

测试代码

// --------------------------------------------------------------------------------
// 1st package
// --------------------------------------------------------------------------------

package my_pk_1;

  localparam TEMP1 = 1;

endpackage

// --------------------------------------------------------------------------------
// 2nd package
// --------------------------------------------------------------------------------

package my_pk_2;

  import my_pk_1::*;

  localparam TEMP2 = 1;

endpackage

// --------------------------------------------------------------------------------
// module
// --------------------------------------------------------------------------------

module tb () ;
  
  // 仅导入第二个包,以为第一个包已被导入到第二个包中
  import my_pk_2::*;

  initial 
    $display("TEMP1 = %0d",TEMP1);
  
endmodule      

错误信息

xmelab: *E,CUVUNF (./testbench.sv,33|31): Hierarchical name component lookup failed for 'TEMP1' at 'tb'    

原因分析

SystemVerilog的包导入是作用域局部生效的:

  • 在my_pk_2中导入my_pk_1::*,仅让my_pk_2内部的代码能访问my_pk_1的成员,并不会把my_pk_1的内容合并到my_pk_2的对外可见接口中。
  • my_pk_2本身并未包含TEMP1,只是它自己内部可以使用这个参数。当测试台仅导入my_pk_2::*时,只能访问my_pk_2自身定义的成员(比如TEMP2),无法直接获取my_pk_1的内容。

解决方案

方案1:测试台中同时导入两个包

直接在测试台作用域内导入两个包,就能访问所有成员:

module tb () ;
  import my_pk_1::*;
  import my_pk_2::*;

  initial 
    $display("TEMP1 = %0d",TEMP1);
  
endmodule      

方案2:在第二个包中显式导出第一个包的成员

如果希望通过my_pk_2间接访问my_pk_1的内容,可以在my_pk_2中使用export语句暴露目标成员:

package my_pk_2;
  import my_pk_1::*;
  // 显式将my_pk_1的TEMP1导出到当前包的对外接口
  export my_pk_1::TEMP1;
  localparam TEMP2 = 1;
endpackage

此时测试台仅导入my_pk_2::*即可访问TEMP1。

内容的提问来源于stack exchange,提问作者Mikef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:33:12