如何在 chisel 中实现 4:1 Mux,而不使用 2:1 Mux?有没有一种方法可以让我们通过像 Mux(sel, A,B,C,D.......N) 这样的东西来选择 N 个输入中的一个输入,其中 N 可以作为参数?我知道 chisel 中的 MuxCase,但我还没有找到使用 MuxCase 的示例,非常感谢任何与此相关的文档或示例。谢谢你。
火箭芯片在 MultiWidthFifo.scala
中有一些用法这非常简单。如果所提供的条件都不为真,则它采用默认值,否则它会查找元组序列,其中(布尔条件,结果)形式的每个元组通常写为条件 -> 结果。返回值是第一个为 true 的布尔条件的结果。
这里是一个 toy 模块示例,它将输入布尔值的数量传递到模块中,然后使用该值构建一系列 mux 案例。
class UsesMuxCase(numCases: Int) extends Module {
val io = IO(new Bundle {
val output = Output(UInt(10.W))
val inputs = Input(Vec(numCases, Bool()))
})
val cases = io.inputs.zipWithIndex.map { case (bool, index) =>
bool -> index.U(10.W)
}
io.output := MuxCase(0.U(10.W), cases)
}
Chick Markley 提供了一个很好的例子,但有些代码是多余的。事实上,这个例子可以简化为:
class UsesMuxCase(numCases: Int) extends Module {
val io = IO(new Bundle {
val output = Output(UInt(10.W))
val inputs = Input(Vec(numCases, Bool()))
})
io.output := MuxCase(0.U(10.W), io.inputs.zipWithIndex)
}
在
map { case (a, b) => a -> b }
操作之后我们不需要另一个 zip
,因为 (a, b)
和 a -> b
都定义了元组并且是等价的。这是一个 scala 功能,请参阅 What do -> 和 ! Scala 中的意思