user2466860 user2466860 - 1 month ago 23
Scala Question

Bit vector comparison in Chisel

I have a vector of 4 bits, where I want to check if a single bit from the vector from the vector is a 1. So, basically I want to have loop with 4 iterations, where the first iteration will check if the first bit from the vector is a 1, and then in the next iteration check if the second bit is a 1 and so on.

I have tried with a switch statement shown below, but it doesn't work like I want it to.

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)
}
}


Thank you in advance.

Answer

FYI, to help us give you the best answers, you should show us your instantiations of your variables (i.e., what type is current_way, way_dout, and ways?).


There are a number of approaches here. One idea is this:

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)) {
    ...
  }
}

But for loops are ugly. Maps show your intent more clearly:

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 is a scala-ism, and it brings a lot of awesome power to hardware design.

Comments