为什么戳值在 chiseltest 的最后一个时钟周期发生变化,从而导致断言失败?

Why do poked values change on last clock cycle in chiseltest, thus failing asserts?

我已经尝试在我的代码中添加一些断言,但是这些断言在测试我的模块时失败了, 即使我已经相应地戳了值。有趣的是,根据一些印刷品,该值在最后一个模拟周期中改变了值,如这个最小示例所示:

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("%d\n", 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)

谢谢!

我认为问题是 chiseltest harness 在你的测试块中使用了一个隐式范围,当范围完成时它会将输入值恢复到开始时的状态。这就是导致问题的原因。我认为这是一个错误,应该不难修复。您应该在 chiseltest repo 上打开并发布。我们会尝试修复此问题或提供解决方法