1package xiangshan.backend.regfile 2 3import chisel3._ 4import chisel3.util._ 5import chisel3.util.experimental.BoringUtils 6import xiangshan._ 7 8class RfReadPort extends XSBundle { 9 val addr = Input(UInt(PhyRegIdxWidth.W)) 10 val data = Output(UInt(XLEN.W)) 11} 12 13class RfWritePort extends XSBundle { 14 val wen = Input(Bool()) 15 val addr = Input(UInt(PhyRegIdxWidth.W)) 16 val data = Input(UInt(XLEN.W)) 17} 18 19class Regfile 20( 21 numReadPorts: Int, 22 numWirtePorts: Int, 23 hasZero: Boolean, 24 isMemRf: Boolean = false 25) extends XSModule { 26 val io = IO(new Bundle() { 27 val readPorts = Vec(numReadPorts, new RfReadPort) 28 val writePorts = Vec(numWirtePorts, new RfWritePort) 29 }) 30 31 val mem = Mem(NRPhyRegs, UInt(XLEN.W)) 32 33 for(r <- io.readPorts){ 34 val addr_reg = RegNext(r.addr) 35 r.data := {if(hasZero) Mux(addr_reg===0.U, 0.U, mem(addr_reg)) else mem(addr_reg)} 36 } 37 38 for(w <- io.writePorts){ 39 when(w.wen){ 40 mem(w.addr) := w.data 41 } 42 } 43 44 if(!isMemRf){ 45 val debugArchRat = WireInit(VecInit(Seq.fill(32)(0.U(PhyRegIdxWidth.W)))) 46 BoringUtils.addSink(debugArchRat, if(hasZero) "DEBUG_INI_ARCH_RAT" else "DEBUG_FP_ARCH_RAT") 47 48 val debugArchReg = WireInit(VecInit(debugArchRat.zipWithIndex.map(x => if(hasZero && x._2==0) 0.U else mem(x._1)))) 49 BoringUtils.addSource(debugArchReg, if(hasZero) "DEBUG_INT_ARCH_REG" else "DEBUG_FP_ARCH_REG") 50 } 51} 52