xref: /XiangShan/src/main/scala/xiangshan/backend/rename/RenameTable.scala (revision 4b3d9f67355a9945cd5eca46929b89c130c43c26)
1package xiangshan.backend.rename
2
3import chisel3._
4import chisel3.util._
5import xiangshan._
6
7class RatReadPort extends XSBundle {
8  val addr = Input(UInt(5.W))
9  val rdata = Output(UInt(XLEN.W))
10}
11
12class RatWritePort extends XSBundle {
13  val wen = Input(Bool())
14  val addr = Input(UInt(5.W))
15  val wdata = Input(UInt(XLEN.W))
16}
17
18class RenameTable(float: Boolean) extends XSModule {
19  val io = IO(new Bundle() {
20    val flush = Input(Bool())
21    val readPorts = Vec({if(float) 4 else 3} * RenameWidth, new RatReadPort)
22    val specWritePorts = Vec(RenameWidth, new RatWritePort)
23    val archWritePorts = Vec(CommitWidth, new RatWritePort)
24  })
25
26  // speculative rename table
27  val spec_table = RegInit(VecInit(Seq.tabulate(32)(i => i.U(PhyRegIdxWidth.W))))
28
29  // arch state rename table
30  val arch_table = RegInit(VecInit(Seq.tabulate(32)(i => i.U(PhyRegIdxWidth.W))))
31
32  for(w <- io.specWritePorts){
33    when(w.wen){ spec_table(w.addr) := w.wdata }
34  }
35
36  for((r, i) <- io.readPorts.zipWithIndex){
37    r.rdata := spec_table(r.addr)
38    for(w <- io.specWritePorts.take(i/{if(float) 4 else 3})){ // bypass
39      when(w.wen && (w.addr === r.addr)){ r.rdata := w.wdata }
40    }
41  }
42
43  for(w <- io.archWritePorts){
44    when(w.wen){ arch_table(w.addr) := w.wdata }
45  }
46
47  when(io.flush){
48    spec_table := arch_table
49    for(w <- io.archWritePorts) {
50      when(w.wen){ spec_table(w.addr) := w.wdata }
51    }
52  }
53
54  if (!env.FPGAPlatform) {
55    ExcitingUtils.addSource(
56      arch_table,
57      if(float) "DEBUG_FP_ARCH_RAT" else "DEBUG_INI_ARCH_RAT",
58      ExcitingUtils.Debug
59    )
60  }
61}