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