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