1b034d3b9SLinJiaweipackage xiangshan.backend.rename 2b034d3b9SLinJiawei 3b034d3b9SLinJiaweiimport chisel3._ 4b034d3b9SLinJiaweiimport chisel3.util._ 5b034d3b9SLinJiaweiimport xiangshan._ 6*a6ad6ca2SYinan Xuimport xiangshan.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)))) 13b034d3b9SLinJiawei // set preg state to ready 14b034d3b9SLinJiawei val wbPregs = Vec(NRWritePorts, 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 20b034d3b9SLinJiawei val table = RegInit(VecInit(Seq.fill(NRPhyRegs)(false.B))) 21b034d3b9SLinJiawei 22b034d3b9SLinJiawei for((raddr, rdy) <- io.rfReadAddr.zip(io.pregRdy)){ 2356894e6cSLinJiawei rdy := !table(raddr) || ParallelOR(io.wbPregs.map(wb => wb.valid && (wb.bits===raddr))).asBool() 24b034d3b9SLinJiawei } 25b034d3b9SLinJiawei 26b034d3b9SLinJiawei for((alloc, i) <- io.allocPregs.zipWithIndex){ 27b034d3b9SLinJiawei when(alloc.valid){ 28b034d3b9SLinJiawei table(alloc.bits) := true.B 29b034d3b9SLinJiawei } 30*a6ad6ca2SYinan Xu XSDebug(alloc.valid, "Allocate %d\n", alloc.bits) 31b034d3b9SLinJiawei } 32b034d3b9SLinJiawei 33b034d3b9SLinJiawei for((wb, i) <- io.wbPregs.zipWithIndex){ 34b034d3b9SLinJiawei when(wb.valid){ 35b034d3b9SLinJiawei table(wb.bits) := false.B 36b034d3b9SLinJiawei } 37*a6ad6ca2SYinan Xu XSDebug(wb.valid, "writeback %d\n", wb.bits) 38b034d3b9SLinJiawei } 39b034d3b9SLinJiawei 40b034d3b9SLinJiawei when(io.flush){ 41b034d3b9SLinJiawei table.foreach(_ := false.B) 42b034d3b9SLinJiawei } 43*a6ad6ca2SYinan Xu 44*a6ad6ca2SYinan Xu for (i <- 0 until NRPhyRegs) { 45*a6ad6ca2SYinan Xu XSDebug(table(i), "%d is busy\n", i.U) 46*a6ad6ca2SYinan Xu } 47b034d3b9SLinJiawei} 48