Принимая log2Ceil of UInt - PullRequest
       32

Принимая log2Ceil of UInt

4 голосов
/ 25 февраля 2020

Я беру log2 следующего расчета:

tl_out.a.bits.size := log2Ceil(s1_row * s2_column * 4.U)

, где s1_row и s2_column - UInt. Я получаю следующую ошибку:

[info] Compiling 1 Scala source to ...rocket-chip/target/scala-2.12/classes ...
[error] ...scala:199:25: overloaded method value apply with alternatives:
[error]   (in: Int)Int <and>
[error]   (in: BigInt)Int
[error]  cannot be applied to (chisel3.core.UInt)
[error]         tl_out.a.bits.size := log2Ceil(s1_row * s2_column * 4.U)
[error]                               ^
[error] one error found
[error] (Compile / compileIncremental) Compilation failed

Кажется, что log2Ceil не может быть выполнен на UInt / SInt. Есть ли способ типизировать UINT / SInt или альтернативный метод для log2Ceil, который можно выполнить через UInt? Пожалуйста, помогите ...

Спасибо и С уважением,

1 Ответ

4 голосов
/ 25 февраля 2020

log2Ceil() - это хорошая функция для определения размера слова. Но имейте в виду, что он не «синтезируемый» для UInt() Wire или Reg. log2Ceil() вычисление выполняется один раз во время синтеза, это не аппаратная функция. Тогда ваш выходной сигнал tl_out.a.bits.size будет постоянным.

Если вы хотите найти самый старший установленный бит, вам следует использовать аппаратные функции с именем PriorityEncoder(Reverse(s1_row * s2_column * 4.U)).

PriorityEncoder () возвращает позицию наименее значимого «1» в сигнале. И Reverse () изменяет порядок битов в сигнале.

...