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

时间:2018-01-06 13:52:01

标签: chisel

当我使用DecoupledIO时,它似乎会产生由引用io未完全初始化引起的错误。

这是因为我必须初始化输出,在这种情况下是位,有效或就绪(取决于是否翻转)

假设位和有效是输出。

当我使用以下声明时:

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

它会产生错误。

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

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

我是否总是必须在when语句之外初始化这些值,虽然我想将它放在当(reset.toBool)语句时?

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

1 个答案:

答案 0 :(得分:2)

这是一个很好的问题,但有点难以解释。当您在when(io.reset)中包装输出初始化时,它会创建一个边缘情况,如果未设置复位,则可能无法初始化导线。最简单的解决方法是同时执行这两项操作

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

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