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