解复用器:未连接的电线/第一个错误

Demuxer : Unconnected Wires / firrtl error

我正在尝试使用 Chisel 制作一个多路分解器,但代码无法编译并抛出 imgur link

中显示的错误

[1] https://i.stack.imgur.com/oW0Rv.png)

class Demuxer extends Module {
  val io = IO(new Bundle {
    val datain = Input(UInt(8.W))
    val dataout1 = Output(UInt(8.W))
    val dataout2 = Output(UInt(8.W))
    val dataout3 = Output(UInt(8.W))
    val dataout4 = Output(UInt(8.W))
    val dataout5 = Output(UInt(8.W))  
    val selector = Input((UInt(3.W)))  
  })
  when(io.selector === 1.U){
        io.dataout1 := io.datain
  }.elsewhen(io.selector === 2.U){
      io.dataout2 := io.datain
  }.elsewhen(io.selector === 3.U){
      io.dataout3 := io.datain
  }.elsewhen(io.selector === 4.U){
      io.dataout4 := io.datain
  }.elsewhen(io.selector === 5.U){
      io.dataout5 := io.datain
  }.otherwise{
       
  }
}

我阅读了有关未连接元素的 wiki https://www.chisel-lang.org/chisel3/docs/wiki-deprecated/unconnected-wires.html

如果我在我的 IO 上使用 io.outs <> DontCare,代码会编译,但生成的 verilog 会将我的输入短路到所有输出,这不是我希望从该模块获得的行为。有人可以建议我解决这个问题吗?

提前致谢

Chisel 和 Scala FIRRTL 编译器要求在所有情况下都驱动所有输出。这有助于避免设计人员忘记驱动某些 port/wire/reg 的错误。问题是代码需要为所有模块输出设置一些默认值(或使用 DontCare)。

当您将所有输出设置为 DontCare 时,通常会发生以下两种情况之一:

  1. 默认连接将是 0.U
  2. 默认连接将是其他合法值或连接。

(2) 是这里发生的事情。当您编写 io.dataout1 := DontCare 时,您是在向编译器表明它可以将其设置为任何值。然后编译器选择将其设置为 io.dataout1 := io.datain(将输入缩短为输出)。

您可以使用一些明确的东西而不是使用 DontCare,例如,0.U 将为每个输出创建一个多路复用器。用一行来做这个看起来像:

  Seq(io.dataout1, io.dataout2, io.dataout3, io.dataout4, io.dataout5).foreach(
    _ := 0.U
  )