使用解耦 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
当我使用 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