xref: /XiangShan/src/main/scala/xiangshan/backend/rename/RenameTable.scala (revision bed2b789ab5f2dcee83f3f5f6c660c82c35b2046)
1b034d3b9SLinJiaweipackage xiangshan.backend.rename
2b034d3b9SLinJiawei
3b034d3b9SLinJiaweiimport chisel3._
4b034d3b9SLinJiaweiimport chisel3.util._
5b034d3b9SLinJiaweiimport xiangshan._
6b034d3b9SLinJiawei
7b034d3b9SLinJiaweiclass RatReadPort extends XSBundle {
8b034d3b9SLinJiawei  val addr = Input(UInt(5.W))
9*bed2b789SLinJiawei  val rdata = Output(UInt(PhyRegIdxWidth.W))
10b034d3b9SLinJiawei}
11b034d3b9SLinJiawei
12b034d3b9SLinJiaweiclass RatWritePort extends XSBundle {
13b034d3b9SLinJiawei  val wen = Input(Bool())
14b034d3b9SLinJiawei  val addr = Input(UInt(5.W))
15*bed2b789SLinJiawei  val wdata = Input(UInt(PhyRegIdxWidth.W))
16b034d3b9SLinJiawei}
17b034d3b9SLinJiawei
18b034d3b9SLinJiaweiclass RenameTable(float: Boolean) extends XSModule {
19b034d3b9SLinJiawei  val io = IO(new Bundle() {
20b424051cSYinan Xu    val redirect = Flipped(ValidIO(new Redirect))
21b424051cSYinan Xu    val walkWen = Input(Bool())
22b034d3b9SLinJiawei    val readPorts = Vec({if(float) 4 else 3} * RenameWidth, new RatReadPort)
2300ad41d0SYinan Xu    val specWritePorts = Vec(CommitWidth, new RatWritePort)
24b034d3b9SLinJiawei    val archWritePorts = Vec(CommitWidth, new RatWritePort)
25b034d3b9SLinJiawei  })
26b034d3b9SLinJiawei
27b034d3b9SLinJiawei  // speculative rename table
28191cb795SLinJiawei  val spec_table = RegInit(VecInit(Seq.tabulate(32)(i => i.U(PhyRegIdxWidth.W))))
29b034d3b9SLinJiawei
30b034d3b9SLinJiawei  // arch state rename table
31191cb795SLinJiawei  val arch_table = RegInit(VecInit(Seq.tabulate(32)(i => i.U(PhyRegIdxWidth.W))))
32b034d3b9SLinJiawei
33b424051cSYinan Xu  // When redirect happens (mis-prediction), don't update the rename table
34b424051cSYinan Xu  // However, when mis-prediction and walk happens at the same time, rename table needs to be updated
35b034d3b9SLinJiawei  for(w <- io.specWritePorts){
36b424051cSYinan Xu    when(w.wen && (!io.redirect.valid || io.walkWen)) {
37b424051cSYinan Xu      spec_table(w.addr) := w.wdata
38b424051cSYinan Xu    }
39b034d3b9SLinJiawei  }
40b034d3b9SLinJiawei
41b034d3b9SLinJiawei  for((r, i) <- io.readPorts.zipWithIndex){
42b034d3b9SLinJiawei    r.rdata := spec_table(r.addr)
436f2c55e9SYinan Xu    // for(w <- io.specWritePorts.take(i/{if(float) 4 else 3})){ // bypass
446f2c55e9SYinan Xu    //   when(w.wen && (w.addr === r.addr)){ r.rdata := w.wdata }
456f2c55e9SYinan Xu    // }
46b034d3b9SLinJiawei  }
47b034d3b9SLinJiawei
48b034d3b9SLinJiawei  for(w <- io.archWritePorts){
49b034d3b9SLinJiawei    when(w.wen){ arch_table(w.addr) := w.wdata }
50b034d3b9SLinJiawei  }
51b034d3b9SLinJiawei
52bfb958a3SYinan Xu  val flush = io.redirect.valid && io.redirect.bits.isUnconditional()
53b424051cSYinan Xu  when (flush) {
54b034d3b9SLinJiawei    spec_table := arch_table
55b424051cSYinan Xu    // spec table needs to be updated when flushPipe
56ce4949a0SYinan Xu    for (w <- io.archWritePorts) {
57ce4949a0SYinan Xu      when(w.wen){ spec_table(w.addr) := w.wdata }
58ce4949a0SYinan Xu    }
59b034d3b9SLinJiawei  }
60b034d3b9SLinJiawei
6144dead2fSZhangZifei  if (!env.FPGAPlatform) {
6289722029SLinJiawei    ExcitingUtils.addSource(
6389722029SLinJiawei      arch_table,
6489722029SLinJiawei      if(float) "DEBUG_FP_ARCH_RAT" else "DEBUG_INI_ARCH_RAT",
6589722029SLinJiawei      ExcitingUtils.Debug
6689722029SLinJiawei    )
67b034d3b9SLinJiawei  }
6844dead2fSZhangZifei}
69