1package xiangshan.backend.rename 2 3import chisel3._ 4import chisel3.util._ 5import xiangshan._ 6import utils.{ParallelOR, XSDebug} 7 8class BusyTable extends XSModule { 9 val io = IO(new Bundle() { 10 val flush = Input(Bool()) 11 // set preg state to busy 12 val allocPregs = Vec(RenameWidth, Flipped(ValidIO(UInt(PhyRegIdxWidth.W)))) 13 // set preg state to ready (write back regfile + roq walk) 14 val wbPregs = Vec(NRWritePorts + CommitWidth, Flipped(ValidIO(UInt(PhyRegIdxWidth.W)))) 15 // read preg state 16 val rfReadAddr = Vec(NRReadPorts, Input(UInt(PhyRegIdxWidth.W))) 17 val pregRdy = Vec(NRReadPorts, Output(Bool())) 18 }) 19 20 val table = RegInit(0.U(NRPhyRegs.W)) 21 22 val wbMask = ParallelOR(io.wbPregs.take(NRWritePorts).map(w => Mux(w.valid, UIntToOH(w.bits), 0.U))) 23 val allocMask = ParallelOR(io.allocPregs.map(a => Mux(a.valid, UIntToOH(a.bits), 0.U))) 24 25 val tableNext = table & (~wbMask).asUInt() | allocMask 26 27 for((raddr, rdy) <- io.rfReadAddr.zip(io.pregRdy)){ 28 rdy := !tableNext(raddr) 29 } 30 31 table := tableNext 32 33// for((alloc, i) <- io.allocPregs.zipWithIndex){ 34// when(alloc.valid){ 35// table(alloc.bits) := true.B 36// } 37// XSDebug(alloc.valid, "Allocate %d\n", alloc.bits) 38// } 39 40 41// for((wb, i) <- io.wbPregs.zipWithIndex){ 42// when(wb.valid){ 43// table(wb.bits) := false.B 44// } 45// XSDebug(wb.valid, "writeback %d\n", wb.bits) 46// } 47 48 when(io.flush){ 49 table := 0.U(NRPhyRegs.W) 50 } 51 52 XSDebug(p"table : ${Binary(table)}\n") 53 XSDebug(p"tableNext: ${Binary(tableNext)}\n") 54 XSDebug(p"allocMask: ${Binary(allocMask)}\n") 55 XSDebug(p"wbMask : ${Binary(wbMask)}\n") 56 for (i <- 0 until NRPhyRegs) { 57 XSDebug(table(i), "%d is busy\n", i.U) 58 } 59} 60