1b034d3b9SLinJiaweipackage xiangshan.backend.rename 2b034d3b9SLinJiawei 3b034d3b9SLinJiaweiimport chisel3._ 4b034d3b9SLinJiaweiimport chisel3.util._ 580d24142SLinJiaweiimport chisel3.util.experimental.BoringUtils 6b034d3b9SLinJiaweiimport xiangshan._ 7b034d3b9SLinJiawei 8b034d3b9SLinJiaweiclass RatReadPort extends XSBundle { 9b034d3b9SLinJiawei val addr = Input(UInt(5.W)) 10b034d3b9SLinJiawei val rdata = Output(UInt(XLEN.W)) 11b034d3b9SLinJiawei} 12b034d3b9SLinJiawei 13b034d3b9SLinJiaweiclass RatWritePort extends XSBundle { 14b034d3b9SLinJiawei val wen = Input(Bool()) 15b034d3b9SLinJiawei val addr = Input(UInt(5.W)) 16b034d3b9SLinJiawei val wdata = Input(UInt(XLEN.W)) 17b034d3b9SLinJiawei} 18b034d3b9SLinJiawei 19b034d3b9SLinJiaweiclass RenameTable(float: Boolean) extends XSModule { 20b034d3b9SLinJiawei val io = IO(new Bundle() { 21b034d3b9SLinJiawei val flush = Input(Bool()) 22b034d3b9SLinJiawei val readPorts = Vec({if(float) 4 else 3} * RenameWidth, new RatReadPort) 23b034d3b9SLinJiawei val specWritePorts = Vec(RenameWidth, 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 33b034d3b9SLinJiawei for(w <- io.specWritePorts){ 34b034d3b9SLinJiawei when(w.wen){ spec_table(w.addr) := w.wdata } 35b034d3b9SLinJiawei } 36b034d3b9SLinJiawei 37b034d3b9SLinJiawei for((r, i) <- io.readPorts.zipWithIndex){ 38b034d3b9SLinJiawei r.rdata := spec_table(r.addr) 39b034d3b9SLinJiawei for(w <- io.specWritePorts.take(i/{if(float) 4 else 3})){ // bypass 40b034d3b9SLinJiawei when(w.wen && (w.addr === r.addr)){ r.rdata := w.wdata } 41b034d3b9SLinJiawei } 42b034d3b9SLinJiawei } 43b034d3b9SLinJiawei 44b034d3b9SLinJiawei for(w <- io.archWritePorts){ 45b034d3b9SLinJiawei when(w.wen){ arch_table(w.addr) := w.wdata } 46b034d3b9SLinJiawei } 47b034d3b9SLinJiawei 48b034d3b9SLinJiawei when(io.flush){ 49b034d3b9SLinJiawei spec_table := arch_table 50*ce4949a0SYinan Xu for(w <- io.archWritePorts) { 51*ce4949a0SYinan Xu when(w.wen){ spec_table(w.addr) := w.wdata } 52*ce4949a0SYinan Xu } 53b034d3b9SLinJiawei } 54b034d3b9SLinJiawei 5580d24142SLinJiawei BoringUtils.addSource(arch_table, if(float) "DEBUG_FP_ARCH_RAT" else "DEBUG_INI_ARCH_RAT") 56b034d3b9SLinJiawei}