Chisel 中的位向量比较

Bit vector comparison in Chisel

我有一个 4 位的向量,我想检查向量中的一个位是否为 1。所以,基本上我想要有 4 次迭代的循环,第一次迭代将检查如果向量的第一位是 1,然后在下一次迭代中检查第二位是否是 1,依此类推。

我已经尝试使用如下所示的 switch 语句,但它并没有像我想要的那样工作。

  for(i <- 0 until ways) { //ways = 3
      switch(current_way(i)){
         is(UInt(1)){
         way_dout(i) := way.io.dout((i+1)*line_size-1,i*line_size)
      }
  }

提前致谢。

所以当设置 current_way(i) 时,您希望 way_dout(i) 具有来自 way.io.dout 的所选位的值,否则为零,对吗?你可以这样做:

for(i <- 0 until ways) { //ways = 3
    way_dout(i) := current_way(i) & way.io.dout((i+1)*line_size-1,i*line_size)
}

仅供参考,为了帮助我们为您提供最佳答案,您应该向我们展示您的变量实例化(即,current_way、way_dout 和方法是什么类型?)。


这里有很多方法。一个想法是:

val ways_vector = Wire(Vec(num_ways, Bool())
val way_dout = Wire(init=Vec.fill(num_ways){UInt(0, width = line_size)})
... 
// set values of ways_vector...
...
for (i <- 0 until num_ways) {
  when (ways_vector(i)) {
    ...
  }
}

但是 for 循环很难看。地图更清楚地显示您的意图:

val way_dout = 
  ways_vector.zipWithIndex.map{ case (w, i) => 
    Mux(w, 
      way.io.dout((i+1)*line_size-1, i*line_size),
      UInt(0))}

zipWithIndex 是一种 scala 主义,它为硬件设计带来了很多令人敬畏的力量。