1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| for (c <- 0 until nCols) { val rdata = Wire(Vec(bankWidth, UInt(2.W))) rdata := DontCare val (ren, ridx) = if (params.slow) (s1_col_mask(c), s1_col_idx) else (s0_col_mask(c), s0_col_idx) val wen = WireInit(doing_reset || (s1_update.valid && s1_update.bits.is_commit_update && s1_update_col_mask(c) && !ren)) if (params.slow) { s2_req_rdata_all(c) := rdata } else { s2_req_rdata_all(c) := RegNext(rdata) } if (params.useFlops) { val data = Reg(Vec(nSetsPerCol, Vec(bankWidth, UInt(2.W)))) when (wen && doing_reset) { data(reset_idx) := VecInit(Seq.fill(bankWidth) { 2.U }) } .elsewhen (wen) { for (i <- 0 until bankWidth) { when (s1_update_wmask(i)) { data(s1_update_col_idx)(i) := s1_update_wdata(i) } } } when (RegNext(ren) && !(wen && params.singlePorted.B)) { rdata := data(RegNext(ridx)) } } else { val data = SyncReadMem(nSetsPerCol, Vec(bankWidth, UInt(2.W))) data.suggestName(s"bim_col_${c}") val r = if (params.singlePorted) data.read(ridx, ren && !wen) else data.read(ridx, ren) rdata := r when (wen) { val widx = Mux(doing_reset, reset_idx, s1_update_col_idx) val wdata = Mux(doing_reset, VecInit(Seq.fill(bankWidth) { 2.U }), s1_update_wdata) val wmask = Mux(doing_reset, (~(0.U(bankWidth.W))), s1_update_wmask.asUInt) data.write(widx, wdata, wmask.asBools) } } }
|