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