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