凿子测试 - 内部信号
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 可以以图形方式查看这些变量;)
好问题。这个答案有几个部分
Chisel 提供的单元测试框架较旧 chisel-testers and the newer chiseltest。不要提供直接查看电线的机制。
目前凿子团队正在研究这样做的方法。
两者都提供了间接的方法。写入 VCD 输出并使用 printf 查看内部值
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文件以供进一步调试。
我想测试我的代码,所以我正在做一个测试平台。我想知道是否可以检查内部信号——比如本例中 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 可以以图形方式查看这些变量;)
好问题。这个答案有几个部分
Chisel 提供的单元测试框架较旧 chisel-testers and the newer chiseltest。不要提供直接查看电线的机制。 目前凿子团队正在研究这样做的方法。
两者都提供了间接的方法。写入 VCD 输出并使用 printf 查看内部值
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文件以供进一步调试。