【问题标题】:How do I write to a conditional output如何写入条件输出
【发布时间】:2020-02-14 22:07:08
【问题描述】:

在我的代码中,我定义了一个条件输出:

class EccGenerate[D <: Data](data: D, doubleBit : Boolean = true) extends Module {
  val eccBits = calcCodeBits(data.getWidth)

  val io = IO(new Bundle {
    val in = Input(data.cloneType)
    val out = Output(UInt(eccBits.W))
    val par = if (doubleBit) Some(Output(Bool())) else None
  })

尝试在 par 输出上使用 := 运算符失败,因为它并不总是输出。使用条件输入时,我会使用 io.par.get() 来检索输入的当前值,是否有相应的原语、运算符或函数调用可以用来设置条件输出的值?

【问题讨论】:

    标签: chisel


    【解决方案1】:

    问题是您无法连接到par,因为它的类型是Option[Bool],并且:= 没有为Option 定义。如果选项包含某些内容,则需要将其解包并分配给里面的Bool

    执行此操作的函数式编程方式是:

    io.par.foreach(_ := foo)
    

    如果你愿意,你也可以更详细:

    io.par match {
      case Some(a) => a := foo
      case None    =>
    }
    

    if 语句也可以使用:

    if (par.nonEmpty) {
      io.par.get := foo
    }
    

    【讨论】:

    • jinx,你欠我一杯可乐
    • 成交。有关更多上下文:杰克和我写的答案基本完全相同。我碰巧写在我的手机上。我的答案在 3 分钟后发出,但盖伊给了我接受的答案。 ¯_(ツ)_/¯ 对于后代:有独立的协议认为这是与可选的 Chisel 组件进行连接的正确方法。
    【解决方案2】:

    你基本上需要检查io.parSome还是None,有几种方法可以做到这一点:

    1. 当务之急
    if (io.par.isDefined) {
      io.par.get := ...
    }
    
    1. 模式匹配
    io.par match {
      case Some(port) => port := ...
      case None => // Do nothing
    }
    
    1. 函数式编程(ish)
    io.par.foreach(_ := ...)
    

    根据我的工作,我倾向于选择 #2 或 #3,但对于不太熟悉 Scala 和函数式编程的人来说,#1 可能更清楚。

    有关更多信息,请查看选项的 API 文档:https://www.scala-lang.org/api/2.12.10/scala/Option.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-16
      • 2016-03-18
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多