xref: /XiangShan/src/main/scala/xiangshan/backend/rename/RenameTable.scala (revision ce4949a0249cf0c25df0235a64d226ec6fd42b31)
1b034d3b9SLinJiaweipackage xiangshan.backend.rename
2b034d3b9SLinJiawei
3b034d3b9SLinJiaweiimport chisel3._
4b034d3b9SLinJiaweiimport chisel3.util._
580d24142SLinJiaweiimport chisel3.util.experimental.BoringUtils
6b034d3b9SLinJiaweiimport xiangshan._
7b034d3b9SLinJiawei
8b034d3b9SLinJiaweiclass RatReadPort extends XSBundle {
9b034d3b9SLinJiawei  val addr = Input(UInt(5.W))
10b034d3b9SLinJiawei  val rdata = Output(UInt(XLEN.W))
11b034d3b9SLinJiawei}
12b034d3b9SLinJiawei
13b034d3b9SLinJiaweiclass RatWritePort extends XSBundle {
14b034d3b9SLinJiawei  val wen = Input(Bool())
15b034d3b9SLinJiawei  val addr = Input(UInt(5.W))
16b034d3b9SLinJiawei  val wdata = Input(UInt(XLEN.W))
17b034d3b9SLinJiawei}
18b034d3b9SLinJiawei
19b034d3b9SLinJiaweiclass RenameTable(float: Boolean) extends XSModule {
20b034d3b9SLinJiawei  val io = IO(new Bundle() {
21b034d3b9SLinJiawei    val flush = Input(Bool())
22b034d3b9SLinJiawei    val readPorts = Vec({if(float) 4 else 3} * RenameWidth, new RatReadPort)
23b034d3b9SLinJiawei    val specWritePorts = Vec(RenameWidth, 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
33b034d3b9SLinJiawei  for(w <- io.specWritePorts){
34b034d3b9SLinJiawei    when(w.wen){ spec_table(w.addr) := w.wdata }
35b034d3b9SLinJiawei  }
36b034d3b9SLinJiawei
37b034d3b9SLinJiawei  for((r, i) <- io.readPorts.zipWithIndex){
38b034d3b9SLinJiawei    r.rdata := spec_table(r.addr)
39b034d3b9SLinJiawei    for(w <- io.specWritePorts.take(i/{if(float) 4 else 3})){ // bypass
40b034d3b9SLinJiawei      when(w.wen && (w.addr === r.addr)){ r.rdata := w.wdata }
41b034d3b9SLinJiawei    }
42b034d3b9SLinJiawei  }
43b034d3b9SLinJiawei
44b034d3b9SLinJiawei  for(w <- io.archWritePorts){
45b034d3b9SLinJiawei    when(w.wen){ arch_table(w.addr) := w.wdata }
46b034d3b9SLinJiawei  }
47b034d3b9SLinJiawei
48b034d3b9SLinJiawei  when(io.flush){
49b034d3b9SLinJiawei    spec_table := arch_table
50*ce4949a0SYinan Xu    for(w <- io.archWritePorts) {
51*ce4949a0SYinan Xu      when(w.wen){ spec_table(w.addr) := w.wdata }
52*ce4949a0SYinan Xu    }
53b034d3b9SLinJiawei  }
54b034d3b9SLinJiawei
5580d24142SLinJiawei  BoringUtils.addSource(arch_table, if(float) "DEBUG_FP_ARCH_RAT" else "DEBUG_INI_ARCH_RAT")
56b034d3b9SLinJiawei}