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

在多个Chisel模块中调用addResource时如何保持编译顺序

Chipyard黑盒SystemVerilog依赖编译顺序异常解决方案

方案1:调整资源注册逻辑适配FIRRTL特性

  • 单个黑盒模块内部逆序调用addResource:先添加模块自身实现文件,再按依赖层级从高到低添加依赖的package文件,适配FIRRTL逆序遍历addResource列表的逻辑,保证单个模块的依赖文件在最终生成的.f文件中排在模块文件之前。
    示例调整后代码:
    class ModX extends BlackBox {
      addResource("ModX.sv")
      addResource("packageB.sv")
      addResource("packageA.sv")
    }
    class ModY extends BlackBox {
      addResource("ModY.sv")
      addResource("packageC.sv")
      addResource("packageB.sv")
    }
    
  • 顶层预注册公共依赖:在项目Top模块定义的最开头,逆序注册所有全局公共package,需要的编译顺序越靠前的package,注册顺序越靠后。利用FIRRTL去重时保留最后一次出现位置的逻辑,让所有公共package统一排在.f文件的最开头,不会被后续模块的重复注册挤到后方。

方案2:后处理.f文件(无侵入,适配性最强)

在FIRRTL生成.f文件后、Verilator编译前插入自定义脚本,重排firrtl_black_box_resource_files.top.f的文件顺序,步骤如下:

  1. 提前维护公共package的编译顺序列表,按实际依赖关系从先到后排列
  2. 读取生成的.f文件,去重后先输出所有公共package,再输出剩余模块文件
  3. 用处理后的内容覆盖原.f文件即可
    示例Shell处理脚本:
# 按实际需求调整公共包编译顺序
PUBLIC_PACKAGES=("packageA.sv" "packageB.sv" "packageC.sv")
TEMP_FILE=$(mktemp)

# 先写入公共包
for pkg in "${PUBLIC_PACKAGES[@]}"; do
    echo "$pkg" >> "$TEMP_FILE"
done

# 写入去重后的非公共包模块文件
grep -vxFf <(printf "%s\n" "${PUBLIC_PACKAGES[@]}") firrtl_black_box_resource_files.top.f | sort -u >> "$TEMP_FILE"

# 覆盖原文件
mv "$TEMP_FILE" firrtl_black_box_resource_files.top.f

方案3:修改编译顺序配置

直接在仿真/综合的编译脚本中调整文件加载顺序,将所有公共package文件路径添加到编译文件列表的最开头,优先级高于FIRRTL生成的firrtl_black_box_resource_files.top.f,Verilator会按输入顺序编译,提前加载的package不会出现未定义错误。

方案4:升级Chisel/FIRRTL版本

Chisel 3.6、FIRRTL 1.6及以上版本已优化黑盒资源顺序逻辑,新增资源优先级配置参数,可通过addResource的priority参数显式指定文件编译优先级,优先级越高的文件排列越靠前,无需再手动适配逆序逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:36:02