1b034d3b9SLinJiaweipackage xiangshan.backend.rename 2b034d3b9SLinJiawei 3b034d3b9SLinJiaweiimport chisel3._ 4b034d3b9SLinJiaweiimport chisel3.util._ 5b034d3b9SLinJiaweiimport xiangshan._ 6b034d3b9SLinJiawei 7b034d3b9SLinJiaweiclass RatReadPort extends XSBundle { 8b034d3b9SLinJiawei val addr = Input(UInt(5.W)) 9*bed2b789SLinJiawei val rdata = Output(UInt(PhyRegIdxWidth.W)) 10b034d3b9SLinJiawei} 11b034d3b9SLinJiawei 12b034d3b9SLinJiaweiclass RatWritePort extends XSBundle { 13b034d3b9SLinJiawei val wen = Input(Bool()) 14b034d3b9SLinJiawei val addr = Input(UInt(5.W)) 15*bed2b789SLinJiawei val wdata = Input(UInt(PhyRegIdxWidth.W)) 16b034d3b9SLinJiawei} 17b034d3b9SLinJiawei 18b034d3b9SLinJiaweiclass RenameTable(float: Boolean) extends XSModule { 19b034d3b9SLinJiawei val io = IO(new Bundle() { 20b424051cSYinan Xu val redirect = Flipped(ValidIO(new Redirect)) 21b424051cSYinan Xu val walkWen = Input(Bool()) 22b034d3b9SLinJiawei val readPorts = Vec({if(float) 4 else 3} * RenameWidth, new RatReadPort) 2300ad41d0SYinan Xu val specWritePorts = Vec(CommitWidth, 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 33b424051cSYinan Xu // When redirect happens (mis-prediction), don't update the rename table 34b424051cSYinan Xu // However, when mis-prediction and walk happens at the same time, rename table needs to be updated 35b034d3b9SLinJiawei for(w <- io.specWritePorts){ 36b424051cSYinan Xu when(w.wen && (!io.redirect.valid || io.walkWen)) { 37b424051cSYinan Xu spec_table(w.addr) := w.wdata 38b424051cSYinan Xu } 39b034d3b9SLinJiawei } 40b034d3b9SLinJiawei 41b034d3b9SLinJiawei for((r, i) <- io.readPorts.zipWithIndex){ 42b034d3b9SLinJiawei r.rdata := spec_table(r.addr) 436f2c55e9SYinan Xu // for(w <- io.specWritePorts.take(i/{if(float) 4 else 3})){ // bypass 446f2c55e9SYinan Xu // when(w.wen && (w.addr === r.addr)){ r.rdata := w.wdata } 456f2c55e9SYinan Xu // } 46b034d3b9SLinJiawei } 47b034d3b9SLinJiawei 48b034d3b9SLinJiawei for(w <- io.archWritePorts){ 49b034d3b9SLinJiawei when(w.wen){ arch_table(w.addr) := w.wdata } 50b034d3b9SLinJiawei } 51b034d3b9SLinJiawei 52bfb958a3SYinan Xu val flush = io.redirect.valid && io.redirect.bits.isUnconditional() 53b424051cSYinan Xu when (flush) { 54b034d3b9SLinJiawei spec_table := arch_table 55b424051cSYinan Xu // spec table needs to be updated when flushPipe 56ce4949a0SYinan Xu for (w <- io.archWritePorts) { 57ce4949a0SYinan Xu when(w.wen){ spec_table(w.addr) := w.wdata } 58ce4949a0SYinan Xu } 59b034d3b9SLinJiawei } 60b034d3b9SLinJiawei 6144dead2fSZhangZifei if (!env.FPGAPlatform) { 6289722029SLinJiawei ExcitingUtils.addSource( 6389722029SLinJiawei arch_table, 6489722029SLinJiawei if(float) "DEBUG_FP_ARCH_RAT" else "DEBUG_INI_ARCH_RAT", 6589722029SLinJiawei ExcitingUtils.Debug 6689722029SLinJiawei ) 67b034d3b9SLinJiawei } 6844dead2fSZhangZifei} 69