Chisel3 REPL peek значение правильное, но ожидайте неудачи в тесте

Я использую 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

}

person apen    schedule 27.06.2020    source источник
comment
Какой REPL вы имеете в виду? Можете ли вы поделиться схемой или соответствующей частью схемы?   -  person Chick Markley    schedule 27.06.2020
comment
@ChickMarkley Я прикрепил свой код. Спасибо!   -  person apen    schedule 27.06.2020


Ответы (1)


Вот в чем, я думаю, проблема. По историческим причинам poke вектора меняет порядок элементов во время тыка, и именно поэтому вы видите неправильное значение для своего возврата. Когда вы использовали REPL, вы, вероятно, делали свои poke дискретно, чтобы они попадали в ожидаемые места.

Я использовал флаг -tiv treadle, чтобы увидеть, что делает симулятор.

Команда разработчиков Chisel планирует добавить литералы Vec, которые должны предотвратить это в будущем.

Я также рекомендую попробовать ChiselTest, это более современная версия тестера модулей. У него нет poke для Vec типов, которые защитили бы вас от этой ошибки. Когда Vec литералы будут реализованы, они будут доступны в ChiselTest, возможно, не в iotesters.

person Chick Markley    schedule 28.06.2020
comment
Интересный. Я перевернул входной вектор, и это действительно сработало! Я попробовал новейший литерал тестового вектора Chisel, но по какой-то причине не смог заставить его работать; а именно, я не мог использовать .Lit() для моих собственных типов данных, несмотря на то, что он отлично работает на официальных примерах. Думаю, я пока просто буду жить с уловкой с обратной секвенировкой. - person apen; 30.06.2020