在多个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的文件顺序,步骤如下:
- 提前维护公共package的编译顺序列表,按实际依赖关系从先到后排列
- 读取生成的.f文件,去重后先输出所有公共package,再输出剩余模块文件
- 用处理后的内容覆盖原.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
相关产品推荐
相关产品推荐

