凿子3 REPL 窥视值是正确的,但预期在测试中失败



我正在使用Chisel3来构建我的电路,我有以下测试

reset()
private val inputData = IndexedSeq.fill(ProcedureSpaceSize)(0: BigInt)
.patch(0, Seq(63: BigInt), 1)
.patch(1, Seq(65: BigInt), 1)
.patch(2, Seq(98: BigInt), 1)
.patch(3, Seq(98: BigInt), 1)
poke(sff.io.inputDataVector, inputData)
step(1)
expect(sff.io.done, true)
expect(sff.io.ret, 65) // fails

现在我在第二个expect不断失败.但是,当我尝试在 REPL 中运行我的电路并使用peek在根据测试步进相同的过程后查看io_ret的值时,我得到了正确的值,即 65。

我的问题很简单,为什么我在凿子测试中失败,但在 REPL 模式下调试时可以查看正确的结果?这不是错误,还是我做错了什么?

编辑: 电路代码

class SFF extends Module {
private val dataType = Integer32Bit
// IO
val io = IO(new Bundle {
// INPUT
val inputDataVector: Vec[UInt] = Input(Vec(ProcedureSpaceSize, dataType))
// OUTPUT
val ret: UInt = Output(dataType)
val done: Bool = Output(Bool())
})
// WIRE
val data: Vec[UInt] = Wire(Vec(ProcedureSpaceSize, dataType))
data := io.inputDataVector
val paramB: UInt = Wire(dataType)
paramB := data(1)
io.ret := DontCare
// LOGIC
io.done := true.B
io.ret := paramB
}

这就是我认为的问题所在。由于历史原因,poke向量会在戳过程中颠倒元素的顺序,这就是为什么您看到错误的返回值的原因。当您使用 REPL 时,您可能离散地完成了poke,因此它们进入了预期的位置。

我使用"-tiv"踏板标志来查看模拟器在做什么。

Chisel开发团队正计划添加Vec文字,这将在未来防止这种情况发生。

我还建议尝试ChiselTest,它是单元测试仪的更现代版本。它没有Vec类型的poke,可以保护您免受此错误的影响。当实现Vec文字时,它们将在ChiselTest中可用,可能不会在iotester中可用。

最新更新