chisel3 的 printf 在模拟发出的 verilog 时是否生成终端输出?

Does chisel3's printf generate terminal output when simulating the emitted verilog?

我正在研究 Chiffre 作为我设计中的错误注入选项,并注意到一些 when 语句中包含 printf

 when (enabled && RegNext(!enabled)) {
    printf(s"""|[info] $name enabled
               |[info]   - seed: 0x%x
               |[info]   - difficulty: 0x%x
               |""".stripMargin, seed, difficulty)
  }

  when (!enabled && RegNext(enabled)) {
    printf(s"[info] $name disabled\n")
  }

我发现这有点奇怪,所以开始调查。到目前为止,我知道 chisel3 有一个 printf 函数,文档说它“在模拟中打印一条消息”。这是否适用于 verilog 模拟、scalaland 模拟或两者?如果我使用 chisel3 的 printf,这会导致 verilog 中的 $display 语句吗?

(非常令人兴奋的)答案是肯定的。虽然不是 $display 语句,但生成的 verilog 包括 $fwrite.

此处 $fwrite 的 Scastie 示例 https://scastie.scala-lang.org/Hajn4b1sTDmcxk5sBHw7pQ

[在某些时候我会学习新的 firrtl 注释来禁用 rand]