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