1b034d3b9SLinJiaweipackage xiangshan.backend.rename 2b034d3b9SLinJiawei 3b034d3b9SLinJiaweiimport chisel3._ 4b034d3b9SLinJiaweiimport chisel3.util._ 5b034d3b9SLinJiaweiimport xiangshan._ 6b034d3b9SLinJiawei 7b034d3b9SLinJiaweiclass RatReadPort extends XSBundle { 8b034d3b9SLinJiawei val addr = Input(UInt(5.W)) 9b034d3b9SLinJiawei val rdata = Output(UInt(XLEN.W)) 10b034d3b9SLinJiawei} 11b034d3b9SLinJiawei 12b034d3b9SLinJiaweiclass RatWritePort extends XSBundle { 13b034d3b9SLinJiawei val wen = Input(Bool()) 14b034d3b9SLinJiawei val addr = Input(UInt(5.W)) 15b034d3b9SLinJiawei val wdata = Input(UInt(XLEN.W)) 16b034d3b9SLinJiawei} 17b034d3b9SLinJiawei 18b034d3b9SLinJiaweiclass RenameTable(float: Boolean) extends XSModule { 19b034d3b9SLinJiawei val io = IO(new Bundle() { 20b034d3b9SLinJiawei val flush = Input(Bool()) 21b034d3b9SLinJiawei val readPorts = Vec({if(float) 4 else 3} * RenameWidth, new RatReadPort) 22b034d3b9SLinJiawei val specWritePorts = Vec(RenameWidth, new RatWritePort) 23b034d3b9SLinJiawei val archWritePorts = Vec(CommitWidth, new RatWritePort) 24b034d3b9SLinJiawei }) 25b034d3b9SLinJiawei 26b034d3b9SLinJiawei // speculative rename table 27191cb795SLinJiawei val spec_table = RegInit(VecInit(Seq.tabulate(32)(i => i.U(PhyRegIdxWidth.W)))) 28b034d3b9SLinJiawei 29b034d3b9SLinJiawei // arch state rename table 30191cb795SLinJiawei val arch_table = RegInit(VecInit(Seq.tabulate(32)(i => i.U(PhyRegIdxWidth.W)))) 31b034d3b9SLinJiawei 32b034d3b9SLinJiawei for(w <- io.specWritePorts){ 33b034d3b9SLinJiawei when(w.wen){ spec_table(w.addr) := w.wdata } 34b034d3b9SLinJiawei } 35b034d3b9SLinJiawei 36b034d3b9SLinJiawei for((r, i) <- io.readPorts.zipWithIndex){ 37b034d3b9SLinJiawei r.rdata := spec_table(r.addr) 38*6f2c55e9SYinan Xu // for(w <- io.specWritePorts.take(i/{if(float) 4 else 3})){ // bypass 39*6f2c55e9SYinan Xu // when(w.wen && (w.addr === r.addr)){ r.rdata := w.wdata } 40*6f2c55e9SYinan Xu // } 41b034d3b9SLinJiawei } 42b034d3b9SLinJiawei 43b034d3b9SLinJiawei for(w <- io.archWritePorts){ 44b034d3b9SLinJiawei when(w.wen){ arch_table(w.addr) := w.wdata } 45b034d3b9SLinJiawei } 46b034d3b9SLinJiawei 47b034d3b9SLinJiawei when(io.flush){ 48b034d3b9SLinJiawei spec_table := arch_table 49ce4949a0SYinan Xu for(w <- io.archWritePorts) { 50ce4949a0SYinan Xu when(w.wen){ spec_table(w.addr) := w.wdata } 51ce4949a0SYinan Xu } 52b034d3b9SLinJiawei } 53b034d3b9SLinJiawei 5444dead2fSZhangZifei if (!env.FPGAPlatform) { 5589722029SLinJiawei ExcitingUtils.addSource( 5689722029SLinJiawei arch_table, 5789722029SLinJiawei if(float) "DEBUG_FP_ARCH_RAT" else "DEBUG_INI_ARCH_RAT", 5889722029SLinJiawei ExcitingUtils.Debug 5989722029SLinJiawei ) 60b034d3b9SLinJiawei } 6144dead2fSZhangZifei} 62