1*c6d43980SLemover/*************************************************************************************** 2*c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3*c6d43980SLemover* 4*c6d43980SLemover* XiangShan is licensed under Mulan PSL v2. 5*c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2. 6*c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at: 7*c6d43980SLemover* http://license.coscl.org.cn/MulanPSL2 8*c6d43980SLemover* 9*c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 10*c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 11*c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 12*c6d43980SLemover* 13*c6d43980SLemover* See the Mulan PSL v2 for more details. 14*c6d43980SLemover***************************************************************************************/ 15*c6d43980SLemover 16b034d3b9SLinJiaweipackage xiangshan.backend.rename 17b034d3b9SLinJiawei 182225d46eSJiawei Linimport chipsalliance.rocketchip.config.Parameters 19b034d3b9SLinJiaweiimport chisel3._ 20b034d3b9SLinJiaweiimport chisel3.util._ 21b034d3b9SLinJiaweiimport xiangshan._ 22b034d3b9SLinJiawei 232225d46eSJiawei Linclass RatReadPort(implicit p: Parameters) extends XSBundle { 24b034d3b9SLinJiawei val addr = Input(UInt(5.W)) 25bed2b789SLinJiawei val rdata = Output(UInt(PhyRegIdxWidth.W)) 26b034d3b9SLinJiawei} 27b034d3b9SLinJiawei 282225d46eSJiawei Linclass RatWritePort(implicit p: Parameters) extends XSBundle { 29b034d3b9SLinJiawei val wen = Input(Bool()) 30b034d3b9SLinJiawei val addr = Input(UInt(5.W)) 31bed2b789SLinJiawei val wdata = Input(UInt(PhyRegIdxWidth.W)) 32b034d3b9SLinJiawei} 33b034d3b9SLinJiawei 342225d46eSJiawei Linclass RenameTable(float: Boolean)(implicit p: Parameters) extends XSModule { 35b034d3b9SLinJiawei val io = IO(new Bundle() { 362d7c7105SYinan Xu val redirect = Input(Bool()) 372d7c7105SYinan Xu val flush = Input(Bool()) 38b424051cSYinan Xu val walkWen = Input(Bool()) 39b034d3b9SLinJiawei val readPorts = Vec({if(float) 4 else 3} * RenameWidth, new RatReadPort) 4000ad41d0SYinan Xu val specWritePorts = Vec(CommitWidth, new RatWritePort) 41b034d3b9SLinJiawei val archWritePorts = Vec(CommitWidth, new RatWritePort) 422225d46eSJiawei Lin val debug_rdata = Vec(32, Output(UInt(PhyRegIdxWidth.W))) 43b034d3b9SLinJiawei }) 44b034d3b9SLinJiawei 45b034d3b9SLinJiawei // speculative rename table 46191cb795SLinJiawei val spec_table = RegInit(VecInit(Seq.tabulate(32)(i => i.U(PhyRegIdxWidth.W)))) 47b034d3b9SLinJiawei 48b034d3b9SLinJiawei // arch state rename table 49191cb795SLinJiawei val arch_table = RegInit(VecInit(Seq.tabulate(32)(i => i.U(PhyRegIdxWidth.W)))) 50b034d3b9SLinJiawei 51b424051cSYinan Xu // When redirect happens (mis-prediction), don't update the rename table 52b424051cSYinan Xu // However, when mis-prediction and walk happens at the same time, rename table needs to be updated 53b034d3b9SLinJiawei for (w <- io.specWritePorts){ 542d7c7105SYinan Xu when (w.wen && (!(io.redirect || io.flush) || io.walkWen)) { 55b424051cSYinan Xu spec_table(w.addr) := w.wdata 56b424051cSYinan Xu } 57b034d3b9SLinJiawei } 58b034d3b9SLinJiawei 59b034d3b9SLinJiawei for((r, i) <- io.readPorts.zipWithIndex){ 60b034d3b9SLinJiawei r.rdata := spec_table(r.addr) 61b034d3b9SLinJiawei } 62b034d3b9SLinJiawei 63b034d3b9SLinJiawei for(w <- io.archWritePorts){ 64b034d3b9SLinJiawei when(w.wen){ arch_table(w.addr) := w.wdata } 65b034d3b9SLinJiawei } 66b034d3b9SLinJiawei 672d7c7105SYinan Xu when (io.flush) { 68b034d3b9SLinJiawei spec_table := arch_table 69b424051cSYinan Xu // spec table needs to be updated when flushPipe 70ce4949a0SYinan Xu for (w <- io.archWritePorts) { 71ce4949a0SYinan Xu when(w.wen){ spec_table(w.addr) := w.wdata } 72ce4949a0SYinan Xu } 73b034d3b9SLinJiawei } 74b034d3b9SLinJiawei 752225d46eSJiawei Lin io.debug_rdata := arch_table 7644dead2fSZhangZifei} 77