解复用器:未连接的电线/第一个错误
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
时,通常会发生以下两种情况之一:
- 默认连接将是
0.U
。
- 默认连接将是其他合法值或连接。
(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
)
我正在尝试使用 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
时,通常会发生以下两种情况之一:
- 默认连接将是
0.U
。 - 默认连接将是其他合法值或连接。
(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
)