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