Почему заданные значения изменяются на последнем такте в chiseltest, что приводит к сбою утверждений?

#chisel #chiseltest

Вопрос:

Я попытался добавить некоторые утверждения в свой код, но эти утверждения не работают при тестировании моего модуля, хотя я соответствующим образом ввел значения. Интересно, что, согласно некоторым отпечаткам, значение изменяет значение в последнем моделируемом цикле, как показано на этом минимальном примере:

 package stack_overflow_demo

import chisel3._
import chisel3.tester._
import org.scalatest.FreeSpec
import chisel3.experimental.BundleLiterals._

class AssertFail extends Module {
    val io = IO(new Bundle {
        val input = Input(UInt(2.W))
    })

    printf("%dn", io.input) // prints 3 and then 0

    assert(io.input === 3.U) // fails, apparently on the second cycle
}

class AssertTest extends FreeSpec with ChiselScalatestTester {
    "break" in {
        test(new AssertFail) { dut =>
            dut.io.input.poke(3.U)
            dut.clock.step()
        }
    }
}
 

Я в основном хочу понять, почему это происходит, а также могу ли я сохранить эти утверждения активными в своем коде или мне придется удалить их все вместе.

(Фактический код является частью декодера RISC-V, который не может управлять расширением сжатой инструкции «C», поэтому для моделирования я попытался утверждать, что два младших бита равны 11)

Спасибо!

Комментарии:

1. Это было исправлено в следующем выпуске chiseltest, см.: github.com/ucb-bar/chisel-testers2/pull/399

Ответ №1:

Я думаю, проблема в том, что жгут chiseltest использует неявную область в вашем блоке тестирования, когда область завершена, он восстанавливает входные значения в их состояние, когда он начался. Вот в чем причина проблемы. Я думаю, что это ошибка, и ее не должно быть слишком сложно исправить. Вы должны открыть и выпустить репо chiseltest. Мы постараемся исправить это или предложим обходной путь