Я пытаюсь реализовать технику прогнозирования пути в ядре 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 Chisel, сгенерированный 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. Есть идеи, как это сделать правильно? Спасибо!