Как получить элемент Index of Max в UInt Ve c, Chisel - PullRequest
2 голосов
/ 06 апреля 2020

Я пытаюсь получить индекс элемента Max в векторе UInt. Мой код выглядит так:

val pwr = Vec.tabulate(N) {i => energyMeters(i).io.pwr}
val maxPwr = pwr.indexOf(pwr.max)

Однако этот код генерирует ошибку компиляции:

No implicit Ordering Defined for Chisel.UInt.
val maxPwr = pwr.indexOf(pwr.max)
                             ^     

Я понимаю, что мне, вероятно, нужно реализовать функцию max, может кто-нибудь привести пример, как это должно быть готовым?

Редактировать: Я также пробовал это:

val pwr = Vec.tabulate(N) {i => energyMeters(i).io.pwr}
val maxPwr = pwr reduceLeft {(x,y) => Mux(x > y,x,y)}
val maxPwridx = pwr.indexOf(maxPwr)

Но это не удается при разработке, когда я пытался привести maxPwridx к UInt. Я закончил с этим обходным путем:

val pwr = Vec.tabulate(N) {i => energyMeters(i).io.pwr}
val maxPwr = pwr reduceLeft {(x,y) => Mux(x > y,x,y)}
val maxPwridx = pwr.indexWhere((x : UInt => x === maxPwr))

1 Ответ

2 голосов
/ 06 апреля 2020

Зубило Vec расширяется Scala Seq. Это означает, что Vec имеет оба dynamici c доступа к аппаратным методам, которые позволят вам генерировать оборудование для поиска чего-либо в Vec (например, indexWhere, onlyIndexWhere, lastIndexWhere), а также все методы, доступные для обычных последовательностей Scala (например, indexOf).

Для выполнения аппаратных операций вы хотите использовать первый (как вы нашли в Последнее редактирование --- выглядит великолепно!), в отличие от последнего.

Чтобы разобраться с этим, на снимке экрана ниже показана документация API Chisel 3.3.0-RC1 для VecLike, отфильтрованная для исключения унаследованные методы. Здесь можно отметить indexWhere, onlyIndexWhere, lastIndexWhere, exists, forall и contains:

Output of VecLike documentation filtered to only methods added in VecLike

И документация для Vec. Единственный интересный метод здесь будет reduceTree:

enter image description here

...