凿子测试 - 内部信号

Chisel test - internal signals

我想测试我的代码,所以我正在做一个测试平台。我想知道是否可以检查内部信号——比如本例中 state 寄存器的值——或者窥视是否仅适用于 I/O

class MatrixMultiplier(matrixSize : UInt, cellSize : Int) extends Module {
  val io = IO(new Bundle {
    val writeEnable = Input(Bool())
    val bufferSel = Input(Bool())
    val writeAddress = Input(UInt(14.W)) //(matrixSize * matrixSize)
    val writeData = Input(SInt(cellSize.W))
    val readEnable = Input(Bool())
    val readAddress = Input(UInt(14.W)) //(matrixSize * matrixSize)
    val readReady = Output(Bool())
    val readData = Output(SInt((2 * cellSize).W))
  })

  val s_idle :: s_writeMemA :: s_writeMemB :: s_multiplier :: s_ready :: s_readResult :: Nil = Enum(6)
  val state = RegInit(s_idle)
...

对于测试平台:

class MatrixUnitTester(matrixMultiplier: MatrixMultiplier) extends PeekPokeTester(matrixMultiplier) { //(5.asUInt(), 32.asSInt())

    println("State is: " + peek(matrixMultiplier.state).toString) // is it possible to have access to state ?
    poke(matrixMultiplier.io.writeEnable, true.B)
    poke(matrixMultiplier.io.bufferSel, false.B)
    step(1)
...

编辑:好的,使用 VCD + GTKWave 可以以图形方式查看这些变量;)

好问题。这个答案有几个部分

  1. Chisel 提供的单元测试框架较旧 chisel-testers and the newer chiseltest。不要提供直接查看电线的机制。 目前凿子团队正在研究这样做的方法。

  2. 两者都提供了间接的方法。写入 VCD 输出并使用 printf 查看内部值

  3. Treadle firrtl 模拟器,它可以直接模拟 firrtl(Chisel 编译器的直接输出),允许直接查看和戳任何信号。在 Treadle 的单元测试中有很多关于它如何使用的例子。 Treadle 还提供了一个 REPL shell,这对于通过手动查看和戳戳来探索电路很有用

较旧的 chiseltester (io-testers) 和当前的 chiseltest 框架允许使用适用于接口信号的 .peek() 函数调试信号值。

我还没有找到在调试测试用例时 peek() 内部信号的方法。但是,Treadle 模拟器在详细模式下为 运行 时可以转储内部信号的值:

在测试中添加注解treadle.VerboseAnnotation

  `test(new DecoupledGcd(16)).withAnnotations(Seq(WriteVcdAnnotation, treadle.VerboseAnnotation))`

在IDEA中调试时,在断点处停止测试时,所有内部信号值的变化都会dump到Console。

本例还会生成VCD wave文件以供进一步调试。