如何写入条件输出
How do I write to a conditional output
在我的代码中,我定义了一个条件输出:
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() 来检索输入的当前值,是否有相应的原语、运算符或函数调用可用于设置条件输出的值?
你基本上需要检查 io.par
是 Some
还是 None
,有几种方法可以做到这一点:
- 势在必行
if (io.par.isDefined) {
io.par.get := ...
}
- 模式匹配
io.par match {
case Some(port) => port := ...
case None => // Do nothing
}
- 函数式编程(大概)
io.par.foreach(_ := ...)
根据我正在做的事情,我倾向于选择 #2 或 #3,但对于不太熟悉 Scala 和函数式编程的人来说,#1 可能更清楚。
有关详细信息,请查看选项的 API 文档:https://www.scala-lang.org/api/2.12.10/scala/Option.html
问题是您无法连接到 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
}
在我的代码中,我定义了一个条件输出:
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() 来检索输入的当前值,是否有相应的原语、运算符或函数调用可用于设置条件输出的值?
你基本上需要检查 io.par
是 Some
还是 None
,有几种方法可以做到这一点:
- 势在必行
if (io.par.isDefined) {
io.par.get := ...
}
- 模式匹配
io.par match {
case Some(port) => port := ...
case None => // Do nothing
}
- 函数式编程(大概)
io.par.foreach(_ := ...)
根据我正在做的事情,我倾向于选择 #2 或 #3,但对于不太熟悉 Scala 和函数式编程的人来说,#1 可能更清楚。
有关详细信息,请查看选项的 API 文档:https://www.scala-lang.org/api/2.12.10/scala/Option.html
问题是您无法连接到 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
}