xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSRPMA.scala (revision 011d262c490b7fd9c718724a21daceb78ad6689a)
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