我如何写条件输出

问题描述 投票:1回答:1

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

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个回答
3
投票

问题是您无法连接到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
}

3
投票

您基本上需要检查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

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