Сравнение битовых векторов в 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)
      }
  }

Заранее спасибо.


person user2466860    schedule 31.10.2016    source источник


Ответы (2)


К вашему сведению, чтобы помочь нам дать вам наилучшие ответы, вы должны показать нам свои экземпляры ваших переменных (т. е. какого типа есть current_way, way_dout иways?).


Здесь есть несколько подходов. Одна идея такова:

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 — это скала-изм, и он привносит огромную мощь в разработку аппаратного обеспечения.

person Chris    schedule 01.11.2016

Итак, вы хотите, чтобы way_dout(i) имел значение из выбранного бита из way.io.dout, когда current_way(i) установлен, и ноль в противном случае, верно? Вы можете сделать что-то вроде этого:

for(i <- 0 until ways) { //ways = 3
    way_dout(i) := current_way(i) & way.io.dout((i+1)*line_size-1,i*line_size)
}
person ɹɐʎɯɐʞ    schedule 31.10.2016
comment
Спасибо за ответ. Я, кажется, тоже не работаю по-твоему. Итак, current_way — это 4-битный вектор, и для каждой итерации я хочу проверять каждый бит за раз, начиная с LSB. Если бит равен 1, то я хочу, чтобы way_dout(i) получал данные от way.io.dout(...), в противном случае я хочу, чтобы way_dout(i) сохранял нули. - person user2466860; 31.10.2016
comment
@user2466860 user2466860 Я не тестировал код, но он должен делать то, что ты только что сказал. Вы получаете какие-либо ошибки при компиляции/разработке? Не могли бы вы описать, почему это не работает? - person ɹɐʎɯɐʞ; 31.10.2016