chisel - 如何在 UInt Vec , Chisel 中获取 Max 元素的索引
问题描述
我正在尝试获取 UInt 向量中 Max 元素的索引。我的代码看起来像这样
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))
解决方案
ChiselVec
扩展了 Scala 的Seq
. 这意味着 aVec
既有动态访问硬件方法,允许您生成硬件来搜索 a 中的内容(例如 , , ) ,也有所有可用于普通 Scala 序列的方法(例如)。Vec
indexWhere
onlyIndexWhere
lastIndexWhere
indexOf
出于执行硬件操作的目的,您希望使用前者(正如您在上次编辑中发现的那样——看起来很棒!)而不是后者。
为了解决这个问题,下面的屏幕截图显示了 Chisel 3.3.0-RC1 API 文档VecLike
,过滤到排除的继承方法。这里值得注意的是indexWhere
, onlyIndexWhere
, lastIndexWhere
, exists
, forall
, 和contains
:
以及Vec
. 这里唯一有趣的方法是reduceTree
:
推荐阅读
- r - 如何根据 R 中的两个不同列删除或子集样本
- google-apps-script - Google Apps 脚本(看似)在循环中随机挂起(圆圈图标无限期运行)
- ruby-on-rails - 使用 rails 形式的输入计算值并仅将结果存储在 ddbb
- javascript - How do I stop my Discord bot from calling the wrong command?
- javascript - MongoDb 文档未创建 discordjs
- gnuplot - 在 gnuplot 哑终端中更改填充多边形的默认“X”字符?
- r - R - 使用列表计算 DataFrame 的平均值
- java - 如何在 Java 中使用 Swing JSpinner 的焦点事件?
- grpc - 本地与远程连接的 gRPC 序列化行为
- c++11 - 如何使用 PinTool 查找与存储在寄存器中的地址的偏移量?