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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 14:02:35