1b034d3b9SLinJiaweipackage xiangshan.backend.rename 2b034d3b9SLinJiawei 3b034d3b9SLinJiaweiimport chisel3._ 4b034d3b9SLinJiaweiimport chisel3.util._ 5b034d3b9SLinJiaweiimport xiangshan._ 6*d479a3a8SYinan Xuimport utils._ 7b034d3b9SLinJiawei 88af95560SYinan Xuclass BusyTableReadIO extends XSBundle { 98af95560SYinan Xu val req = Input(UInt(PhyRegIdxWidth.W)) 108af95560SYinan Xu val resp = Output(Bool()) 118af95560SYinan Xu} 128af95560SYinan Xu 136624015fSLinJiaweiclass BusyTable(numReadPorts: Int, numWritePorts: Int) extends XSModule { 14b034d3b9SLinJiawei val io = IO(new Bundle() { 15b034d3b9SLinJiawei val flush = Input(Bool()) 16b034d3b9SLinJiawei // set preg state to busy 17b034d3b9SLinJiawei val allocPregs = Vec(RenameWidth, Flipped(ValidIO(UInt(PhyRegIdxWidth.W)))) 1875bc8863Slinjiawei // set preg state to ready (write back regfile + roq walk) 196624015fSLinJiawei val wbPregs = Vec(numWritePorts, Flipped(ValidIO(UInt(PhyRegIdxWidth.W)))) 20b034d3b9SLinJiawei // read preg state 218af95560SYinan Xu val read = Vec(numReadPorts, new BusyTableReadIO) 22b034d3b9SLinJiawei }) 23b034d3b9SLinJiawei 24767bd21fSLinJiawei val table = RegInit(0.U(NRPhyRegs.W)) 25767bd21fSLinJiawei 2660deaca2SLinJiawei def reqVecToMask(rVec: Vec[Valid[UInt]]): UInt = { 2760deaca2SLinJiawei ParallelOR(rVec.map(v => Mux(v.valid, UIntToOH(v.bits), 0.U))) 2860deaca2SLinJiawei } 2960deaca2SLinJiawei 3060deaca2SLinJiawei val wbMask = reqVecToMask(io.wbPregs) 3160deaca2SLinJiawei val allocMask = reqVecToMask(io.allocPregs) 32767bd21fSLinJiawei 3384a015b1Slinjiawei val tableAfterWb = table & (~wbMask).asUInt 3484a015b1Slinjiawei val tableAfterAlloc = tableAfterWb | allocMask 35b034d3b9SLinJiawei 3625b3207bSYinan Xu io.read.map(r => r.resp := !table(r.req)) 37b034d3b9SLinJiawei 3843913318SYinan Xu table := tableAfterAlloc 39b034d3b9SLinJiawei 40b034d3b9SLinJiawei when(io.flush){ 41767bd21fSLinJiawei table := 0.U(NRPhyRegs.W) 42b034d3b9SLinJiawei } 43a6ad6ca2SYinan Xu 44767bd21fSLinJiawei XSDebug(p"table : ${Binary(table)}\n") 4584a015b1Slinjiawei XSDebug(p"tableNext: ${Binary(tableAfterAlloc)}\n") 46767bd21fSLinJiawei XSDebug(p"allocMask: ${Binary(allocMask)}\n") 47767bd21fSLinJiawei XSDebug(p"wbMask : ${Binary(wbMask)}\n") 48a6ad6ca2SYinan Xu for (i <- 0 until NRPhyRegs) { 49a6ad6ca2SYinan Xu XSDebug(table(i), "%d is busy\n", i.U) 50a6ad6ca2SYinan Xu } 51*d479a3a8SYinan Xu 52*d479a3a8SYinan Xu XSPerf("busy_count", PopCount(table)) 53b034d3b9SLinJiawei} 54