如何在Chisel3中仅在仿真阶段暴露特定信号?
在Chisel3里只留仿真专用信号的几种办法
能不能直接用'ifndef SYNTHESIS宏?
可以,但不推荐。你能通过Chisel的内联Verilog功能手动加这个宏,比如把仿真专用的计数器逻辑或者dontTouch包裹在宏里:
val perfCounter = RegInit(UInt(32.W), 0.U) when(risingEdge(clock)) { perfCounter := perfCounter + 1.U } // 手动加宏控制综合阶段移除 verilog("`ifndef SYNTHESIS") dontTouch(perfCounter) verilog("`endif")
但这种写法不够“Chisel原生”,容易和FIRRTL的优化流程冲突,而且代码可读性和可维护性差,跨工具链的时候可能出问题。
更靠谱的原生方案:@SimOnly注解
Chisel3专门提供了SimOnly注解(在chisel3.experimental包里),完美解决你的需求——标记的信号只会在仿真阶段保留,综合时直接被剔除,还不用手动加dontTouch:
import chisel3.experimental.SimOnly class MyTopModule extends Module { val io = IO(new Bundle {}) // 加个注解,这个计数器就只在仿真里存在 @SimOnly val perfCounter = RegInit(UInt(32.W), 0.U) when(risingEdge(clock)) { perfCounter := perfCounter + 1.U } }
这个注解是官方支持的,会在FIRRTL转换阶段自动处理,比手动加宏稳定得多,也符合Chisel的代码风格。
什么时候需要自定义FIRRTL/CIRCT流程?
只有当@SimOnly满足不了你的特殊需求时,比如需要更精细的信号控制、和自定义FIRRTL pass交互,才需要自己写注解或流程。比如你可以自定义一个FIRRTL注解,然后写个pass在综合阶段移除标记的信号,或者用CIRCT的firtool参数做增强,但这种场景很少见,普通的性能监控、调试需求用@SimOnly完全足够。
总结一下:优先用@SimOnly注解,这是最省心的方案;手动加宏可行但不推荐;自定义流程只留给复杂特殊场景。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

