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 val debugArchRat = WireInit(VecInit(Seq.fill(32)(0.U(PhyRegIdxWidth.W)))) 44 ExcitingUtils.addSink( 45 debugArchRat, 46 if(hasZero) "DEBUG_INI_ARCH_RAT" else "DEBUG_FP_ARCH_RAT", 47 ExcitingUtils.Debug 48 ) 49 50 val debugArchReg = WireInit(VecInit(debugArchRat.zipWithIndex.map( 51 x => if(hasZero && x._2==0) 0.U else mem(x._1) 52 ))) 53 ExcitingUtils.addSource( 54 debugArchReg, 55 if(hasZero) "DEBUG_INT_ARCH_REG" else "DEBUG_FP_ARCH_REG", 56 ExcitingUtils.Debug 57 ) 58} 59