Как создать случайный Scala Int в долоте? - PullRequest
2 голосов
/ 29 января 2020

Я пытаюсь реализовать метод прогнозирования пути в ядре RocketChip (по порядку) . Для этого мне нужно получить доступ к каждому способу отдельно. Вот как выглядит SRAM для тегов после модификации (отдельный SRAM для каждого способа)

val tag_arrays = Seq.fill(nWays) { SeqMem(nSets, UInt(width = tECC.width(1 + tagBits)))}
val tag_rdata = Reg(Vec(nWays, UInt(width = tECC.width(1 + tagBits))))
for ((tag_array, i) <- tag_arrays zipWithIndex) {
  tag_rdata(i) := tag_array.read(s0_vaddr(untagBits-1,blockOffBits), !refill_done && s0_valid)
}

И я хочу получить к нему доступ как

when (refill_done) {
  val enc_tag = tECC.encode(Cat(tl_out.d.bits.error, refill_tag))
  tag_arrays(repl_way).write(refill_idx, enc_tag)
  ccover(tl_out.d.bits.error, "D_ERROR", "I$ D-channel error")
}

Где repl_way является случайным долотом UInt, сгенерированным LFSR. Но элемент Seq может быть доступен только с помощью индекса Scala Int, что приводит к ошибке компиляции. Затем я попытался получить к нему доступ вот так

when (refill_done) {
  val enc_tag = tECC.encode(Cat(tl_out.d.bits.error, refill_tag))
  for (i <- 0 until nWays) {
    when (repl_way === i.U) {tag_arrays(i).write(refill_idx, enc_tag)}
  }
  ccover(tl_out.d.bits.error, "D_ERROR", "I$ D-channel error")
}

Но возникает утверждение -

assert(PopCount(s1_tag_hit zip s1_tag_disparity map { case (h, d) => h && !d }) <= 1)

Я пытаюсь изменить ICache. scala файл. Любые идеи о том, как сделать это правильно? Спасибо!

1 Ответ

1 голос
/ 29 января 2020

Я думаю, что вы можете просто использовать Vec здесь вместо Seq

val tag_arrays = Vec(nWays, SeqMem(nSets, UInt(width = tECC.width(1 + tagBits))))

Ve c позволяет индексировать с UInt

...