Как использовать uint для извлечения битов

Я определил несколько varabiales, включая post_addra, h_rdata и addra.

val post_addra=RegInit(0.U)
val addra=RegInit(0.U)
val h_rdata=RegInit(0.U)

Поскольку post_addra определяется h_rdata и addra. Итак, я пишу этот код.

post_addra := h_rdata(((addra+1.U) << 4.U)-1.U , (addra << 4.U) + 8.U)

Однако у меня возникла ошибка.

"[ошибка] (x: BigInt, y: BigInt) chisel3.core.UInt

[ошибка] (x: Int, y: Int) chisel3.core.UInt

[ошибка] не может быть применена к (chisel3.core.UInt, chisel3.core.UInt)

[error] post_addra: = h_rdata (((addra + 1.U) ‹закрыть 4.U) -1.U, (addra‹ закрыть 4.U) + 8.U) "

Chisel не поддерживает использование uint для извлечения. Что я должен делать.


person Self-Motivated Wu    schedule 21.05.2020    source источник


Ответы (1)


Если я правильно понимаю, похоже, вы пытаетесь выбрать динамический диапазон бит. Я не думаю, что вы можете делать такие динамические выборки (где даже ширина выбранного диапазона является динамической) с использованием обычного битового извлечения в Verilog, поэтому я подозреваю, что подход будет таким же (вы можете выразить это в VHDL?).

В любом случае извлечение битов изоморфно сдвигу вправо и маске, так что это один из способов решить эту проблему. Вы можете динамически сдвигать вправо по нижней границе, а затем построить маску правильной ширины на основе разницы между нижней и верхней границами:

val lower = (addra << 4.U) + 8.U
val upper = ((addra + 1.U) << 4.U) - 1.U
val mask = (1.U << (upper - lower)) - 1.U
post_addra := (h_rdata >> lower) & mask
person Jack Koenig    schedule 21.05.2020