декларация и область видимости переменной в долоте и блоке When - PullRequest
1 голос
/ 02 июня 2019

поэтому я добавляю, когда блок вокруг строки в коде, но проблема заключается в добавлении этого, когда блок изменяет область видимости, делая объявленные внутри него переменные не видимыми из других частей программы

Проблема в том, чтов подобных случаях

  val (_, _, d_done, refill_cnt) = edge_out.count(tl_out.d)}

также есть способ добавить эту строку внутри блока when без изменения области действия

, точка объявляет его вне блока when и затем присваивает значениетребует, чтобы я знал, что это за тип, и с множеством переменных, которые могут стать сложными

что я хочу достичь, это что-то вроде этого

when (refill_addr <80000000.U){
 val (_, _, d_done, refill_cnt) = edge_out.count(tl_out.d)}

Без изменения области действия

1 Ответ

1 голос
/ 03 июня 2019

Здравствуйте и спасибо за ваш интерес к долоту и ракетному чипу!

То, что вы хотите сделать, в Scala невозможно.Это выходит за рамки (предназначено для каламбура) Chisel как встроенного DSL.

В принципе, неясно, будет ли это иметь смысл в любом случае.Блокировка когда означает, что соединение происходит при условии.Если бы вы могли написать что-то подобное, каким было бы связанное значение, когда условие ложно?Например:

when (value > 100.U) {
  val wire = 123.U
}
io.out := wire

Какое значение должно получить wire когда value <= 100.U?

Альтернативным подходом, когда вы получаете преимущества, не зная типа, может быть наличие условия когдас противоположным условием , дающим любое другое значение, которое вы хотите

val (_, _, _d_done, _refill_cnt) = edge_out.count(tl_out.d)

// Note the wires here, the references above might be read-only references
val d_done = WireInit(_d_done)
val refill_cnt = WireInit(_refill_cnt)

when (refill_addr >= 80000000.U) {
  d_done := something
  refill_cnt := something_else
}
...