Chisel 中使用 MuxCase 的示例

问题描述 投票:0回答:2

如何在 chisel 中实现 4:1 Mux,而不使用 2:1 Mux?有没有一种方法可以让我们通过像 Mux(sel, A,B,C,D.......N) 这样的东西来选择 N 个输入中的一个输入,其中 N 可以作为参数?我知道 chisel 中的 MuxCase,但我还没有找到使用 MuxCase 的示例,非常感谢任何与此相关的文档或示例。谢谢你。

chisel
2个回答
1
投票

火箭芯片在 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)
}

0
投票

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 中的意思

© www.soinside.com 2019 - 2024. All rights reserved.