使用解耦 IO 时会产生与输出初始化相关的错误

Errors related to output initialization is produced when using decoupled IO

当我使用 DecoupledIO 时,它似乎会产生错误,原因是 Reference io is not fully initialized.

这是因为我必须初始化输出,在本例中为位,以及有效或就绪(取决于翻转与否)

我们假设 bits 和 valid 是输出。

当我使用以下语句时:

when(reset.toBool) {
  bits := 0.U
  valid := true.B
}

它产生错误。

但是当初始化语句存在于when语句之外时,它不会产生错误。

那么,如何解决这样的初始化问题呢?

尽管我想将它们放在 when(reset.toBool) 语句中,但我是否总是必须在 when 语句之外初始化这些值?

即使我按照未连接的电线部分描述的指南,wiki 页面中的路由器示例也会产生错误(这是因为所有 init 语句都存在于 when 语句中)

这是一个很好的问题,但有点难以解释。当您将输出初始化包装在 when(io.reset) 中时,它会创建一个边缘情况,如果未断言重置,则可能不会初始化连线。最简单的解决方法是两者都做

bits := 0.U
valid := true.B
when(reset.toBool) {
  bits := 0.U
  valid := true.B
}

最后连接语义将确保重置和解耦行为优先,但您将涵盖边缘情况。凿子团队意识到了这个问题,正在寻找更优雅的情况。参见 Chisel Issue 703