1

我有一个 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)
      }
  }

先感谢您。

4

2 回答 2

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,它为硬件设计带来了很多令人敬畏的力量。

于 2016-11-01T22:30:30.477 回答
0

因此,当设置 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)
}
于 2016-10-31T09:49:40.823 回答