xref: /XiangShan/src/main/scala/xiangshan/backend/rename/BusyTable.scala (revision d479a3a838f93713e8d569af098b6da7fc3c5905)
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