Chisel3 REPL peek 值是正确的,但期望在测试中失败

Chisel3 REPL peek value is correct but expect fails in test

我正在使用 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.

我的问题很简单,为什么我在 Chisel 测试中失败,但在 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 在戳戳期间颠倒了元素的顺序,这就是为什么您看到 return 的错误值。当您使用 REPL 时,您可能会离散地执行 pokes,因此它们会到达预期的位置。

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

Chisel 开发团队正计划添加 Vec 文字,以防止将来出现这种情况。

我还建议尝试 ChiselTest,它是单元测试器的更现代版本。它没有用于 Vec 类型的 poke 来保护您免受此错误的影响。当 Vec 字面值实现后,它们将在 ChiselTest 中可用,可能在 iotesters 中不可用。