Chisel中的位向量比较

时间:2016-10-31 01:46:42

标签: arrays scala vector hdl 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)
      }
  }

提前谢谢。

2 个答案:

答案 0 :(得分:1)

仅供参考,为了帮助我们为您提供最佳答案,您应该向我们展示您的变量实例(即,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-ism,它为硬件设计带来了很多强大的力量。

答案 1 :(得分:0)

所以你希望way_dout(i)在设置current_way(i)时从way.io.dout获取所选位的值,否则为0,对吧?你可以这样做:

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