Chisel: как смоделировать переменную, увеличивающуюся в развернутом цикле

Допустим, у меня есть Vec of Bool. Я хочу заполнить новый Vec того же размера значениями, равными количеству истинных значений, которые я видел до этого индекса в исходном Vec. Я хочу сделать это комбинированно.

Когда мой опыт HLS и стиль кодирования устоялись в моей голове, я хочу написать что-то вроде этого:

  def foo ( in : Vec[UInt] ) = {

    val out = Vec.fill(in.size) {UInt(in.size)}
    val nextInd = Wire(init = 0.U)

    in.zipWithIndex.foreach {case(val, ind) => 
      when(val === true.B) {
        out(ind) := nextInd
        nextInd := Wire(init = nextInd+1.U)
      }
    }
  }

Но я понимаю, что это создает комбинационную петлю, но я не могу найти хороший способ ее смоделировать. Каким-то образом мне нужно создать новую переменную итерации цикла и передать ее между итерациями.


person aayupov    schedule 20.07.2017    source источник


Ответы (2)


Нижеследующее кажется немного проще:

  // return is a Vec with each element equal to the sum of bits up to it's index
  def foo(inBits: Vec[Bool]): Vec[UInt] = {
    val counts = Vec(size, UInt(log2Ceil(size + 1).W))
    inBits.zipWithIndex.foldLeft(0.U) { case (lastValue, (bit, index)) =>
      counts(index) := bit + lastValue
      counts(index)
    }
    counts
  }
person Chick Markley    schedule 24.07.2017

Кажется, я понял, как это сделать в Chisel. Я могу использовать foldLeft и передавать новую переменную от одной итерации к другой:

  def foo ( in : Vec[UInt] ) = {
    val vecSize = in.size
    val out = Vec.fill(vecSize) {UInt(vecSize)}

    in.zipWithIndex.foldLeft (Wire(init = 0.U)) {case(prevInd,(val, ind)) => 
      // val nextInd = Wire(init = prevInd) // this will not work due to bitwidth be not enough to hold an incremented value, so i do the following instead
      val nextInd = Wire(init = UInt(vecSize)) // here i just make sure the width is enough
      nextInd := prevInd
      when(val === true.B) {
        out(ind) := prevInd
        nextInd := Wire(init = prevInd+1.U)
      }
      nextInd
    }
  }
person aayupov    schedule 20.07.2017