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