在 Chisel 中调试模块内部

Debugging module internals in Chisel

我有一个用 Chisel 编写的复杂模块。我正在使用 chiseltest 来验证其操作。测试失败。我希望能够检查模块的内部线路值以调试出了什么问题。由于 PeekPokeTester 只允许我检查 io 信号的值,我该如何检查内部线路?

这是一个例子:

import chisel3._

class MyModule extends Module {
  val io = IO(new Bundle {
    val a = Input(Bool())
    val b = Input(Bool())
    val c = Input(Bool())
    val d = Output(Bool())
  })

  val i = Wire(Bool())
  i := io.a ^ io.b

  io.d := i | io.c
}
import chisel3._
import chisel3.tester._
import org.scalatest.FreeSpec

class MyModuleTest extends FreeSpec with ChiselScalatestTester {
  "MyModule should work properly" in {
    test(new MyModule) { dut =>
      dut.io.a.poke(true.B)
      dut.io.b.poke(false.B)
      dut.io.c.poke(false.B)
      dut.i.expect(true.B)  // This line throws a java.util.NoSuchElementException
                            // : key not found: Bool(Wire in MyModule)
    }
  }
}

如何检查中间值“i”?

有几种方法可以做到这一点。

1 ) 通过向测试添加注释来打开 VCD 输出,如

import chiseltest.experimental.TestOptionBuilder._
import treadle._
...
test(new MyModule).withAnnotations(Seq(WriteVcdAnnotation)) { dut =>

.vcd文件会放在相关的test_run_dir/你可以用GtkWave或类似软件查看

2 ) 将 printf 语句添加到您的模块。

3 ) Treadle Repo that allows you to peek poke and step based on a firrtl file (the firrtl file should be in the same test_run_dir/ directory as above). There is A bit of documentation here

中有模拟shell

祝你好运!