1*011d262cSZhaoyang Youpackage xiangshan.backend.fu.NewCSR 2*011d262cSZhaoyang You 3*011d262cSZhaoyang Youimport chisel3._ 4*011d262cSZhaoyang Youimport chisel3.util._ 5*011d262cSZhaoyang Youimport freechips.rocketchip.rocket.CSRs 6*011d262cSZhaoyang Youimport freechips.rocketchip.tile.XLen 7*011d262cSZhaoyang Youimport org.chipsalliance.cde.config.Parameters 8*011d262cSZhaoyang Youimport xiangshan.backend.fu.NewCSR.CSRDefines.{CSRWARLField => WARL} 9*011d262cSZhaoyang Youimport xiangshan.backend.fu.NewCSR.CSRFunc._ 10*011d262cSZhaoyang Youimport xiangshan.backend.fu.PMAConfigEntry 11*011d262cSZhaoyang Youimport xiangshan.backend.fu.util.CSRConst 12*011d262cSZhaoyang Youimport xiangshan.{HasPMParameters, PMParameKey} 13*011d262cSZhaoyang You 14*011d262cSZhaoyang Youimport scala.collection.immutable.SeqMap 15*011d262cSZhaoyang You 16*011d262cSZhaoyang Youtrait CSRPMA { self: NewCSR => 17*011d262cSZhaoyang You val pmacfg: Seq[CSRModule[_]] = Range(0, p(PMParameKey).NumPMA/8+1, 2).map(num => 18*011d262cSZhaoyang You Module(new CSRModule(s"Pmacfg$num") with HasPMACfgRSink { 19*011d262cSZhaoyang You // read condition 20*011d262cSZhaoyang You regOut := cfgRData(64*(num/2+1)-1, 64*num/2) 21*011d262cSZhaoyang You }) 22*011d262cSZhaoyang You .setAddr(CSRConst.PmacfgBase + num) 23*011d262cSZhaoyang You ) 24*011d262cSZhaoyang You 25*011d262cSZhaoyang You // every pmacfg has 8 cfgs 26*011d262cSZhaoyang You val pmacfgs: Seq[CSRModule[_]] = Range(0, p(PMParameKey).NumPMA).map(num => 27*011d262cSZhaoyang You Module(new CSRModule(s"Pma$num"+"cfg", new PMACfgInitBundle(num))) 28*011d262cSZhaoyang You ) 29*011d262cSZhaoyang You 30*011d262cSZhaoyang You val pmaaddr: Seq[CSRModule[_]] = Range(0, p(PMParameKey).NumPMA).map(num => 31*011d262cSZhaoyang You Module(new CSRModule(s"Pmaaddr$num") with HasPMAAddrSink { 32*011d262cSZhaoyang You // read condition 33*011d262cSZhaoyang You regOut := addrRData(num) 34*011d262cSZhaoyang You }) 35*011d262cSZhaoyang You .setAddr(CSRConst.PmaaddrBase + num) 36*011d262cSZhaoyang You ) 37*011d262cSZhaoyang You 38*011d262cSZhaoyang You val pmaCSRMods: Seq[CSRModule[_]] = pmacfg ++ pmaaddr 39*011d262cSZhaoyang You 40*011d262cSZhaoyang You val pmaCSRMap: SeqMap[Int, (CSRAddrWriteBundle[_], UInt)] = SeqMap.from( 41*011d262cSZhaoyang You pmaCSRMods.map(csr => csr.addr -> (csr.w -> csr.rdata)).iterator 42*011d262cSZhaoyang You ) 43*011d262cSZhaoyang You 44*011d262cSZhaoyang You val pmaCSROutMap: SeqMap[Int, UInt] = SeqMap.from( 45*011d262cSZhaoyang You pmpCSRMods.map(csr => csr.addr -> csr.regOut.asInstanceOf[CSRBundle].asUInt).iterator 46*011d262cSZhaoyang You ) 47*011d262cSZhaoyang You 48*011d262cSZhaoyang You private val pmaCfgRead = Cat(pmacfgs.map(_.rdata(7, 0)).reverse) 49*011d262cSZhaoyang You 50*011d262cSZhaoyang You pmaCSRMods.foreach { mod => 51*011d262cSZhaoyang You mod match { 52*011d262cSZhaoyang You case m: HasPMACfgRSink => 53*011d262cSZhaoyang You m.cfgRData := pmaCfgRead 54*011d262cSZhaoyang You case _ => 55*011d262cSZhaoyang You } 56*011d262cSZhaoyang You } 57*011d262cSZhaoyang You} 58*011d262cSZhaoyang You 59*011d262cSZhaoyang Youclass PMACfgInitBundle(num: Int)(implicit val p: Parameters) extends PMACfgBundle with PMAInit { 60*011d262cSZhaoyang You override val R = WARL(0, wNoFilter).withReset(pmaInit(num).r.B) 61*011d262cSZhaoyang You override val W = WARL(1, wNoFilter).withReset(pmaInit(num).w.B) 62*011d262cSZhaoyang You override val X = WARL(2, wNoFilter).withReset(pmaInit(num).x.B) 63*011d262cSZhaoyang You override val A = PMPCfgAField(4, 3, wNoFilter).withReset(if (pmaInit(num).a > 0) pmaInit(num).a.U else 0.U) 64*011d262cSZhaoyang You override val ATOMIC = WARL(5, wNoFilter).withReset(pmaInit(num).atomic.B) 65*011d262cSZhaoyang You override val C = WARL(6, wNoFilter).withReset(pmaInit(num).c.B) 66*011d262cSZhaoyang You override val L = PMPCfgLField(7, wNoFilter).withReset(pmaInit(num).l.B) 67*011d262cSZhaoyang You} 68*011d262cSZhaoyang You 69*011d262cSZhaoyang Youclass PMACfgBundle extends PMPCfgBundle { 70*011d262cSZhaoyang You override val ATOMIC = WARL(5, wNoFilter).withReset(false.B) 71*011d262cSZhaoyang You override val C = WARL(6, wNoFilter).withReset(false.B) 72*011d262cSZhaoyang You} 73*011d262cSZhaoyang You 74*011d262cSZhaoyang Youtrait HasPMACfgRSink { self: CSRModule[_] => 75*011d262cSZhaoyang You val cfgRData = IO(Input(UInt((p(PMParameKey).NumPMA/8 * p(XLen)).W))) 76*011d262cSZhaoyang You} 77*011d262cSZhaoyang You 78*011d262cSZhaoyang Youtrait HasPMAAddrSink { self: CSRModule[_] => 79*011d262cSZhaoyang You val addrRData = IO(Input(Vec(p(PMParameKey).NumPMA, UInt(64.W)))) 80*011d262cSZhaoyang You} 81*011d262cSZhaoyang You 82*011d262cSZhaoyang Youtrait PMAInit extends HasPMParameters with PMAReadWrite { 83*011d262cSZhaoyang You def pmaInit: Seq[PMAConfigEntry] = (PMAConfigs ++ Seq.fill(NumPMA-PMAConfigs.length)(PMAConfigEntry(0))).reverse 84*011d262cSZhaoyang You} 85