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