1b034d3b9SLinJiaweipackage xiangshan.backend.rename 2b034d3b9SLinJiawei 3b034d3b9SLinJiaweiimport chisel3._ 4b034d3b9SLinJiaweiimport chisel3.util._ 5b034d3b9SLinJiaweiimport xiangshan._ 6b034d3b9SLinJiawei 7b034d3b9SLinJiaweiclass RatReadPort extends XSBundle { 8b034d3b9SLinJiawei val addr = Input(UInt(5.W)) 9bed2b789SLinJiawei val rdata = Output(UInt(PhyRegIdxWidth.W)) 10b034d3b9SLinJiawei} 11b034d3b9SLinJiawei 12b034d3b9SLinJiaweiclass RatWritePort extends XSBundle { 13b034d3b9SLinJiawei val wen = Input(Bool()) 14b034d3b9SLinJiawei val addr = Input(UInt(5.W)) 15bed2b789SLinJiawei val wdata = Input(UInt(PhyRegIdxWidth.W)) 16b034d3b9SLinJiawei} 17b034d3b9SLinJiawei 18b034d3b9SLinJiaweiclass RenameTable(float: Boolean) extends XSModule { 19b034d3b9SLinJiawei val io = IO(new Bundle() { 20*2d7c7105SYinan Xu val redirect = Input(Bool()) 21*2d7c7105SYinan Xu val flush = Input(Bool()) 22b424051cSYinan Xu val walkWen = Input(Bool()) 23b034d3b9SLinJiawei val readPorts = Vec({if(float) 4 else 3} * RenameWidth, new RatReadPort) 2400ad41d0SYinan Xu val specWritePorts = Vec(CommitWidth, new RatWritePort) 25b034d3b9SLinJiawei val archWritePorts = Vec(CommitWidth, new RatWritePort) 26b034d3b9SLinJiawei }) 27b034d3b9SLinJiawei 28b034d3b9SLinJiawei // speculative rename table 29191cb795SLinJiawei val spec_table = RegInit(VecInit(Seq.tabulate(32)(i => i.U(PhyRegIdxWidth.W)))) 30b034d3b9SLinJiawei 31b034d3b9SLinJiawei // arch state rename table 32191cb795SLinJiawei val arch_table = RegInit(VecInit(Seq.tabulate(32)(i => i.U(PhyRegIdxWidth.W)))) 33b034d3b9SLinJiawei 34b424051cSYinan Xu // When redirect happens (mis-prediction), don't update the rename table 35b424051cSYinan Xu // However, when mis-prediction and walk happens at the same time, rename table needs to be updated 36b034d3b9SLinJiawei for (w <- io.specWritePorts){ 37*2d7c7105SYinan Xu when (w.wen && (!(io.redirect || io.flush) || io.walkWen)) { 38b424051cSYinan Xu spec_table(w.addr) := w.wdata 39b424051cSYinan Xu } 40b034d3b9SLinJiawei } 41b034d3b9SLinJiawei 42b034d3b9SLinJiawei for((r, i) <- io.readPorts.zipWithIndex){ 43b034d3b9SLinJiawei r.rdata := spec_table(r.addr) 446f2c55e9SYinan Xu // for(w <- io.specWritePorts.take(i/{if(float) 4 else 3})){ // bypass 456f2c55e9SYinan Xu // when(w.wen && (w.addr === r.addr)){ r.rdata := w.wdata } 466f2c55e9SYinan Xu // } 47b034d3b9SLinJiawei } 48b034d3b9SLinJiawei 49b034d3b9SLinJiawei for(w <- io.archWritePorts){ 50b034d3b9SLinJiawei when(w.wen){ arch_table(w.addr) := w.wdata } 51b034d3b9SLinJiawei } 52b034d3b9SLinJiawei 53*2d7c7105SYinan Xu when (io.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