15844fcf0SLinJiaweipackage xiangshan.backend.regfile 25844fcf0SLinJiawei 35844fcf0SLinJiaweiimport chisel3._ 45844fcf0SLinJiaweiimport chisel3.util._ 580d24142SLinJiaweiimport chisel3.util.experimental.BoringUtils 65844fcf0SLinJiaweiimport xiangshan._ 75844fcf0SLinJiawei 85844fcf0SLinJiaweiclass RfReadPort extends XSBundle { 95844fcf0SLinJiawei val addr = Input(UInt(PhyRegIdxWidth.W)) 105844fcf0SLinJiawei val data = Output(UInt(XLEN.W)) 115844fcf0SLinJiawei} 125844fcf0SLinJiawei 135844fcf0SLinJiaweiclass RfWritePort extends XSBundle { 145844fcf0SLinJiawei val wen = Input(Bool()) 155844fcf0SLinJiawei val addr = Input(UInt(PhyRegIdxWidth.W)) 165844fcf0SLinJiawei val data = Input(UInt(XLEN.W)) 175844fcf0SLinJiawei} 185844fcf0SLinJiawei 195844fcf0SLinJiaweiclass Regfile 205844fcf0SLinJiawei( 215844fcf0SLinJiawei numReadPorts: Int, 225844fcf0SLinJiawei numWirtePorts: Int, 23*6624015fSLinJiawei hasZero: Boolean, 24*6624015fSLinJiawei isMemRf: Boolean = false 250c701001SLinJiawei) extends XSModule { 265844fcf0SLinJiawei val io = IO(new Bundle() { 275844fcf0SLinJiawei val readPorts = Vec(numReadPorts, new RfReadPort) 285844fcf0SLinJiawei val writePorts = Vec(numWirtePorts, new RfWritePort) 295844fcf0SLinJiawei }) 300c701001SLinJiawei 310c701001SLinJiawei val mem = Mem(NRPhyRegs, UInt(XLEN.W)) 320c701001SLinJiawei 330c701001SLinJiawei for(r <- io.readPorts){ 340c701001SLinJiawei val addr_reg = RegNext(r.addr) 350c701001SLinJiawei r.data := {if(hasZero) Mux(addr_reg===0.U, 0.U, mem(addr_reg)) else mem(addr_reg)} 360c701001SLinJiawei } 370c701001SLinJiawei 380c701001SLinJiawei for(w <- io.writePorts){ 390c701001SLinJiawei when(w.wen){ 400c701001SLinJiawei mem(w.addr) := w.data 410c701001SLinJiawei } 420c701001SLinJiawei } 43*6624015fSLinJiawei 44*6624015fSLinJiawei if(!isMemRf){ 4580d24142SLinJiawei val debugArchRat = WireInit(VecInit(Seq.fill(32)(0.U(PhyRegIdxWidth.W)))) 4680d24142SLinJiawei BoringUtils.addSink(debugArchRat, if(hasZero) "DEBUG_INI_ARCH_RAT" else "DEBUG_FP_ARCH_RAT") 4780d24142SLinJiawei 4880d24142SLinJiawei val debugArchReg = WireInit(VecInit(debugArchRat.zipWithIndex.map(x => if(hasZero && x._2==0) 0.U else mem(x._1)))) 4980d24142SLinJiawei BoringUtils.addSource(debugArchReg, if(hasZero) "DEBUG_INT_ARCH_REG" else "DEBUG_FP_ARCH_REG") 505844fcf0SLinJiawei } 51*6624015fSLinJiawei} 52