xref: /XiangShan/src/main/scala/xiangshan/backend/rename/RenameTable.scala (revision 2225d46ebbe2fd16b9b29963c27a7d0385a42709)
1b034d3b9SLinJiaweipackage xiangshan.backend.rename
2b034d3b9SLinJiawei
3*2225d46eSJiawei Linimport chipsalliance.rocketchip.config.Parameters
4b034d3b9SLinJiaweiimport chisel3._
5b034d3b9SLinJiaweiimport chisel3.util._
6b034d3b9SLinJiaweiimport xiangshan._
7b034d3b9SLinJiawei
8*2225d46eSJiawei Linclass RatReadPort(implicit p: Parameters) extends XSBundle {
9b034d3b9SLinJiawei  val addr = Input(UInt(5.W))
10bed2b789SLinJiawei  val rdata = Output(UInt(PhyRegIdxWidth.W))
11b034d3b9SLinJiawei}
12b034d3b9SLinJiawei
13*2225d46eSJiawei Linclass RatWritePort(implicit p: Parameters) extends XSBundle {
14b034d3b9SLinJiawei  val wen = Input(Bool())
15b034d3b9SLinJiawei  val addr = Input(UInt(5.W))
16bed2b789SLinJiawei  val wdata = Input(UInt(PhyRegIdxWidth.W))
17b034d3b9SLinJiawei}
18b034d3b9SLinJiawei
19*2225d46eSJiawei Linclass RenameTable(float: Boolean)(implicit p: Parameters) extends XSModule {
20b034d3b9SLinJiawei  val io = IO(new Bundle() {
212d7c7105SYinan Xu    val redirect = Input(Bool())
222d7c7105SYinan Xu    val flush = Input(Bool())
23b424051cSYinan Xu    val walkWen = Input(Bool())
24b034d3b9SLinJiawei    val readPorts = Vec({if(float) 4 else 3} * RenameWidth, new RatReadPort)
2500ad41d0SYinan Xu    val specWritePorts = Vec(CommitWidth, new RatWritePort)
26b034d3b9SLinJiawei    val archWritePorts = Vec(CommitWidth, new RatWritePort)
27*2225d46eSJiawei Lin    val debug_rdata = Vec(32, Output(UInt(PhyRegIdxWidth.W)))
28b034d3b9SLinJiawei  })
29b034d3b9SLinJiawei
30b034d3b9SLinJiawei  // speculative rename table
31191cb795SLinJiawei  val spec_table = RegInit(VecInit(Seq.tabulate(32)(i => i.U(PhyRegIdxWidth.W))))
32b034d3b9SLinJiawei
33b034d3b9SLinJiawei  // arch state rename table
34191cb795SLinJiawei  val arch_table = RegInit(VecInit(Seq.tabulate(32)(i => i.U(PhyRegIdxWidth.W))))
35b034d3b9SLinJiawei
36b424051cSYinan Xu  // When redirect happens (mis-prediction), don't update the rename table
37b424051cSYinan Xu  // However, when mis-prediction and walk happens at the same time, rename table needs to be updated
38b034d3b9SLinJiawei  for (w <- io.specWritePorts){
392d7c7105SYinan Xu    when (w.wen && (!(io.redirect || io.flush) || io.walkWen)) {
40b424051cSYinan Xu      spec_table(w.addr) := w.wdata
41b424051cSYinan Xu    }
42b034d3b9SLinJiawei  }
43b034d3b9SLinJiawei
44b034d3b9SLinJiawei  for((r, i) <- io.readPorts.zipWithIndex){
45b034d3b9SLinJiawei    r.rdata := spec_table(r.addr)
46b034d3b9SLinJiawei  }
47b034d3b9SLinJiawei
48b034d3b9SLinJiawei  for(w <- io.archWritePorts){
49b034d3b9SLinJiawei    when(w.wen){ arch_table(w.addr) := w.wdata }
50b034d3b9SLinJiawei  }
51b034d3b9SLinJiawei
522d7c7105SYinan Xu  when (io.flush) {
53b034d3b9SLinJiawei    spec_table := arch_table
54b424051cSYinan Xu    // spec table needs to be updated when flushPipe
55ce4949a0SYinan Xu    for (w <- io.archWritePorts) {
56ce4949a0SYinan Xu      when(w.wen){ spec_table(w.addr) := w.wdata }
57ce4949a0SYinan Xu    }
58b034d3b9SLinJiawei  }
59b034d3b9SLinJiawei
60*2225d46eSJiawei Lin  io.debug_rdata := arch_table
6144dead2fSZhangZifei}
62