我有一个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)
}
}
提前谢谢。
答案 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)
}