xref: /XiangShan/src/main/scala/xiangshan/backend/rename/RenameTable.scala (revision f320e0f01bd645f0a3045a8a740e60dd770734a9)
1c6d43980SLemover/***************************************************************************************
2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3*f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover*
5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover*          http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover*
10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover*
14c6d43980SLemover* See the Mulan PSL v2 for more details.
15c6d43980SLemover***************************************************************************************/
16c6d43980SLemover
17b034d3b9SLinJiaweipackage xiangshan.backend.rename
18b034d3b9SLinJiawei
192225d46eSJiawei Linimport chipsalliance.rocketchip.config.Parameters
20b034d3b9SLinJiaweiimport chisel3._
21b034d3b9SLinJiaweiimport chisel3.util._
22b034d3b9SLinJiaweiimport xiangshan._
23b034d3b9SLinJiawei
242225d46eSJiawei Linclass RatReadPort(implicit p: Parameters) extends XSBundle {
25b034d3b9SLinJiawei  val addr = Input(UInt(5.W))
26bed2b789SLinJiawei  val rdata = Output(UInt(PhyRegIdxWidth.W))
27b034d3b9SLinJiawei}
28b034d3b9SLinJiawei
292225d46eSJiawei Linclass RatWritePort(implicit p: Parameters) extends XSBundle {
30b034d3b9SLinJiawei  val wen = Input(Bool())
31b034d3b9SLinJiawei  val addr = Input(UInt(5.W))
32bed2b789SLinJiawei  val wdata = Input(UInt(PhyRegIdxWidth.W))
33b034d3b9SLinJiawei}
34b034d3b9SLinJiawei
352225d46eSJiawei Linclass RenameTable(float: Boolean)(implicit p: Parameters) extends XSModule {
36b034d3b9SLinJiawei  val io = IO(new Bundle() {
372d7c7105SYinan Xu    val redirect = Input(Bool())
382d7c7105SYinan Xu    val flush = Input(Bool())
39b424051cSYinan Xu    val walkWen = Input(Bool())
40b034d3b9SLinJiawei    val readPorts = Vec({if(float) 4 else 3} * RenameWidth, new RatReadPort)
4100ad41d0SYinan Xu    val specWritePorts = Vec(CommitWidth, new RatWritePort)
42b034d3b9SLinJiawei    val archWritePorts = Vec(CommitWidth, new RatWritePort)
432225d46eSJiawei Lin    val debug_rdata = Vec(32, Output(UInt(PhyRegIdxWidth.W)))
44b034d3b9SLinJiawei  })
45b034d3b9SLinJiawei
46b034d3b9SLinJiawei  // speculative rename table
47191cb795SLinJiawei  val spec_table = RegInit(VecInit(Seq.tabulate(32)(i => i.U(PhyRegIdxWidth.W))))
48b034d3b9SLinJiawei
49b034d3b9SLinJiawei  // arch state rename table
50191cb795SLinJiawei  val arch_table = RegInit(VecInit(Seq.tabulate(32)(i => i.U(PhyRegIdxWidth.W))))
51b034d3b9SLinJiawei
52b424051cSYinan Xu  // When redirect happens (mis-prediction), don't update the rename table
53b424051cSYinan Xu  // However, when mis-prediction and walk happens at the same time, rename table needs to be updated
54b034d3b9SLinJiawei  for (w <- io.specWritePorts){
552d7c7105SYinan Xu    when (w.wen && (!(io.redirect || io.flush) || io.walkWen)) {
56b424051cSYinan Xu      spec_table(w.addr) := w.wdata
57b424051cSYinan Xu    }
58b034d3b9SLinJiawei  }
59b034d3b9SLinJiawei
60b034d3b9SLinJiawei  for((r, i) <- io.readPorts.zipWithIndex){
61b034d3b9SLinJiawei    r.rdata := spec_table(r.addr)
62b034d3b9SLinJiawei  }
63b034d3b9SLinJiawei
64b034d3b9SLinJiawei  for(w <- io.archWritePorts){
65b034d3b9SLinJiawei    when(w.wen){ arch_table(w.addr) := w.wdata }
66b034d3b9SLinJiawei  }
67b034d3b9SLinJiawei
682d7c7105SYinan Xu  when (io.flush) {
69b034d3b9SLinJiawei    spec_table := arch_table
70b424051cSYinan Xu    // spec table needs to be updated when flushPipe
71ce4949a0SYinan Xu    for (w <- io.archWritePorts) {
72ce4949a0SYinan Xu      when(w.wen){ spec_table(w.addr) := w.wdata }
73ce4949a0SYinan Xu    }
74b034d3b9SLinJiawei  }
75b034d3b9SLinJiawei
762225d46eSJiawei Lin  io.debug_rdata := arch_table
7744dead2fSZhangZifei}
78