сравнение значения в регистре с int

Я пытаюсь получить значение reg и сравнить его с числом внутри и оператором if

  val refill_addr    = Reg(UInt(width = paddrBits))
if ( refill_addr >  20000.U) 
   cacheable := true
   else 
       cacheable := false

но я получаю эту ошибку

[error] /home/a/i-rocket-chip/src/main/scala/rocket/ICache.scala:365:18: type mismatch;
[error]  found   : chisel3.core.Bool
[error]  required: Boolean
[error] if ( refill_addr >  20000.U) 
[error]                  ^
[error] one error found
[error] (Compile / compileIncremental) Compilation failed


person A_S    schedule 27.05.2019    source источник


Ответы (2)


Вы должны использовать здесь _1 _ / _ 2_ вместо _3 _ / _ 4_.

when - это конструкция Chisel (аппаратная), которая в конечном итоге будет отображаться на один или несколько мультиплексоров. if - это конструкция Scala, которая может использоваться для создания оборудования во время компиляции.

when (refill_addr >  20000.U) {
  cacheable := true
} .otherwise {
  cacheable := false
}

Для получения дополнительной информации там был похожий вопрос здесь.

person seldridge    schedule 27.05.2019
comment
когда я это сделаю, я получаю эту ошибку вместо Exception in thread "main" firrtl.passes.PassExceptions: firrtl.passes.CheckChirrtl$InvalidLOCException: @[ICache.scala 367:14:[email protected]]: [module ICache] Invalid connect to an expression that is not a reference or a WritePort. firrtl.passes.CheckChirrtl$InvalidLOCException: @[ICache.scala 370:18:[email protected]]: [module ICache] Invalid connect to an expression that is not a reference or a WritePort. firrtl.passes.PassException: 2 errors detected! - person A_S; 27.05.2019
comment
Это означает, что вы пытаетесь подключиться к чему-то (что-то в левой части оператора), к чему вы не можете подключиться. Похоже, это ошибка пользователя из-за внесенной вами модификации. Вероятно, это связано с тем, как вы заявили cacheable. Это должен быть регистр, провод или порт памяти, но компилятор FIRRTL указывает, что это не так. Вы можете начать отладку, просмотрев строку 370 ICache.scala или строку 212154 сгенерированного FIRRTL. - person seldridge; 28.05.2019

Еще одно удобное и оптимизированное для FIRRTL решение - использовать Mux:

val cacheable = Mux(refill_addr > 20000.U, true.B, false.B)

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

person ncppd    schedule 04.02.2020