1*b034d3b9SLinJiaweipackage xiangshan.backend.rename 2*b034d3b9SLinJiawei 3*b034d3b9SLinJiaweiimport chisel3._ 4*b034d3b9SLinJiaweiimport chisel3.util._ 5*b034d3b9SLinJiaweiimport xiangshan._ 6*b034d3b9SLinJiawei 7*b034d3b9SLinJiaweiclass RatReadPort extends XSBundle { 8*b034d3b9SLinJiawei val addr = Input(UInt(5.W)) 9*b034d3b9SLinJiawei val rdata = Output(UInt(XLEN.W)) 10*b034d3b9SLinJiawei} 11*b034d3b9SLinJiawei 12*b034d3b9SLinJiaweiclass RatWritePort extends XSBundle { 13*b034d3b9SLinJiawei val wen = Input(Bool()) 14*b034d3b9SLinJiawei val addr = Input(UInt(5.W)) 15*b034d3b9SLinJiawei val wdata = Input(UInt(XLEN.W)) 16*b034d3b9SLinJiawei} 17*b034d3b9SLinJiawei 18*b034d3b9SLinJiaweiclass RenameTable(float: Boolean) extends XSModule { 19*b034d3b9SLinJiawei val io = IO(new Bundle() { 20*b034d3b9SLinJiawei val flush = Input(Bool()) 21*b034d3b9SLinJiawei val readPorts = Vec({if(float) 4 else 3} * RenameWidth, new RatReadPort) 22*b034d3b9SLinJiawei val specWritePorts = Vec(RenameWidth, new RatWritePort) 23*b034d3b9SLinJiawei val archWritePorts = Vec(CommitWidth, new RatWritePort) 24*b034d3b9SLinJiawei }) 25*b034d3b9SLinJiawei 26*b034d3b9SLinJiawei // speculative rename table 27*b034d3b9SLinJiawei val spec_table = RegInit(VecInit(Seq.fill(NRPhyRegs)(0.U(PhyRegIdxWidth.W)))) 28*b034d3b9SLinJiawei 29*b034d3b9SLinJiawei // arch state rename table 30*b034d3b9SLinJiawei val arch_table = RegInit(VecInit(Seq.fill(NRPhyRegs)(0.U(PhyRegIdxWidth.W)))) 31*b034d3b9SLinJiawei 32*b034d3b9SLinJiawei for(w <- io.specWritePorts){ 33*b034d3b9SLinJiawei when(w.wen){ spec_table(w.addr) := w.wdata } 34*b034d3b9SLinJiawei } 35*b034d3b9SLinJiawei 36*b034d3b9SLinJiawei for((r, i) <- io.readPorts.zipWithIndex){ 37*b034d3b9SLinJiawei r.rdata := spec_table(r.addr) 38*b034d3b9SLinJiawei for(w <- io.specWritePorts.take(i/{if(float) 4 else 3})){ // bypass 39*b034d3b9SLinJiawei when(w.wen && (w.addr === r.addr)){ r.rdata := w.wdata } 40*b034d3b9SLinJiawei } 41*b034d3b9SLinJiawei } 42*b034d3b9SLinJiawei 43*b034d3b9SLinJiawei for(w <- io.archWritePorts){ 44*b034d3b9SLinJiawei when(w.wen){ arch_table(w.addr) := w.wdata } 45*b034d3b9SLinJiawei } 46*b034d3b9SLinJiawei 47*b034d3b9SLinJiawei when(io.flush){ 48*b034d3b9SLinJiawei spec_table := arch_table 49*b034d3b9SLinJiawei } 50*b034d3b9SLinJiawei 51*b034d3b9SLinJiawei} 52*b034d3b9SLinJiawei 53*b034d3b9SLinJiaweiobject Gen extends App { 54*b034d3b9SLinJiawei// chisel3.Driver.execute(Array[String]("-td", "build"), () => new RenameTable(true)) 55*b034d3b9SLinJiawei// chisel3.Driver.execute(Array[String]("-td", "build"), () => new FreeList) 56*b034d3b9SLinJiawei //chisel3.Driver.execute(Array[String]("-td", "build"), () => new BusyTable) 57*b034d3b9SLinJiawei chisel3.Driver.execute(Array[String]("-td", "build"), () => new Rename) 58*b034d3b9SLinJiawei} 59