Как мне написать в условный вывод - PullRequest
3 голосов
/ 15 февраля 2020

В моем коде я определил условный вывод:

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 () для получения текущего значения входных данных, есть ли соответствующий вызов примитива, оператора или функции, который я могу использовать для установки значения условного выходного сигнала?

Ответы [ 2 ]

3 голосов
/ 15 февраля 2020

Проблема в том, что вы не можете подключиться к 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 голосов
/ 15 февраля 2020

Вам необходимо проверить, является ли io.par Some или None, есть несколько способов сделать это:

  1. Обязательно
if (io.par.isDefined) {
  io.par.get := ...
}
Сопоставление с образцом
io.par match {
  case Some(port) => port := ...
  case None => // Do nothing
}
Функциональное программирование (i sh)
io.par.foreach(_ := ...)

Я обычно предпочитаю № 2 или № 3 в зависимости от того, что я делаю, но № 1 может быть более понятным людям меньше знакомы с Scala и функциональным программированием.

Для получения дополнительной информации ознакомьтесь с документами API для опции: https://www.scala-lang.org/api/2.12.10/scala/Option.html

...