xref: /XiangShan/src/main/scala/system/SoC.scala (revision d709d2f8660479a8cb609b737da5fabd88fd05ff)
1006e1884SZihao Yupackage system
2006e1884SZihao Yu
33e586e47Slinjiaweiimport chipsalliance.rocketchip.config.Parameters
43e586e47Slinjiaweiimport device.{AXI4Timer, TLTimer}
5006e1884SZihao Yuimport chisel3._
6096ea47eSzhanglinjuanimport chisel3.util._
73e586e47Slinjiaweiimport freechips.rocketchip.diplomacy.{AddressSet, LazyModule, LazyModuleImp}
81865a66fSlinjiaweiimport freechips.rocketchip.tilelink.{TLBuffer, TLFuzzer, TLIdentityNode, TLXbar}
91865a66fSlinjiaweiimport utils.DebugIdentityNode
107d5ddbe6SLinJiaweiimport xiangshan.{HasXSParameter, XSCore}
11a428082bSLinJiawei
12a428082bSLinJiawei
13a428082bSLinJiaweicase class SoCParameters
14a428082bSLinJiawei(
15a428082bSLinJiawei  EnableILA: Boolean = false,
16a428082bSLinJiawei  HasL2Cache: Boolean = false,
17a428082bSLinJiawei  HasPrefetch: Boolean = false
18a428082bSLinJiawei)
19006e1884SZihao Yu
207d5ddbe6SLinJiaweitrait HasSoCParameter extends HasXSParameter{
213e586e47Slinjiawei  val soc = top.Parameters.get.socParameters
22a428082bSLinJiawei  val EnableILA = soc.EnableILA
23a428082bSLinJiawei  val HasL2cache = soc.HasL2Cache
24a428082bSLinJiawei  val HasPrefetch = soc.HasPrefetch
25303b861dSZihao Yu}
26303b861dSZihao Yu
271e3fad10SLinJiaweiclass ILABundle extends Bundle {}
28303b861dSZihao Yu
293e586e47Slinjiawei
303e586e47Slinjiaweiclass DummyCore()(implicit p: Parameters) extends LazyModule {
313e586e47Slinjiawei  val mem = TLFuzzer(nOperations = 10)
323e586e47Slinjiawei  val mmio = TLFuzzer(nOperations = 10)
333e586e47Slinjiawei
343e586e47Slinjiawei  lazy val module = new LazyModuleImp(this){
353e586e47Slinjiawei
363e586e47Slinjiawei  }
373e586e47Slinjiawei}
383e586e47Slinjiawei
393e586e47Slinjiawei
403e586e47Slinjiaweiclass XSSoc()(implicit p: Parameters) extends LazyModule with HasSoCParameter {
413e586e47Slinjiawei
42222e17e5Slinjiawei  private val xsCore = LazyModule(new XSCore())
433e586e47Slinjiawei
443e586e47Slinjiawei  // only mem and extDev visible externally
453e586e47Slinjiawei  val mem = xsCore.mem
46*d709d2f8SAllen  val dma = xsCore.dma
473e586e47Slinjiawei  val extDev = TLIdentityNode()
483e586e47Slinjiawei
493e586e47Slinjiawei  private val mmioXbar = TLXbar()
503e586e47Slinjiawei  private val clint = LazyModule(new TLTimer(
513e586e47Slinjiawei    Seq(AddressSet(0x38000000L, 0x0000ffffL)),
523e586e47Slinjiawei    sim = !env.FPGAPlatform
533e586e47Slinjiawei  ))
543e586e47Slinjiawei
551865a66fSlinjiawei  mmioXbar :=
561865a66fSlinjiawei    TLBuffer() :=
571865a66fSlinjiawei    DebugIdentityNode() :=
581865a66fSlinjiawei    xsCore.mmio
591865a66fSlinjiawei
601865a66fSlinjiawei  clint.node :=
611865a66fSlinjiawei    mmioXbar
621865a66fSlinjiawei
631865a66fSlinjiawei  extDev :=
641865a66fSlinjiawei    mmioXbar
653e586e47Slinjiawei
663e586e47Slinjiawei  lazy val module = new LazyModuleImp(this){
67006e1884SZihao Yu    val io = IO(new Bundle{
68466eb0a8SZihao Yu      val meip = Input(Bool())
69a428082bSLinJiawei      val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None
70006e1884SZihao Yu    })
7135bfeecbSYinan Xu    xsCore.module.io.externalInterrupt.mtip := clint.module.io.mtip
7235bfeecbSYinan Xu    xsCore.module.io.externalInterrupt.msip := clint.module.io.msip
7335bfeecbSYinan Xu    xsCore.module.io.externalInterrupt.meip := RegNext(RegNext(io.meip))
74006e1884SZihao Yu  }
753e586e47Slinjiawei
763e586e47Slinjiawei}
773e586e47Slinjiawei
783e586e47Slinjiawei
793e586e47Slinjiawei//class XSSoc extends Module with HasSoCParameter {
803e586e47Slinjiawei//  val io = IO(new Bundle{
813e586e47Slinjiawei//    val mem = new TLCached(l1BusParams)
823e586e47Slinjiawei//    val mmio = new TLCached(l1BusParams)
833e586e47Slinjiawei//    val frontend = Flipped(new AXI4) //TODO: do we need it ?
843e586e47Slinjiawei//    val meip = Input(Bool())
853e586e47Slinjiawei//    val ila = if (env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None
863e586e47Slinjiawei//  })
873e586e47Slinjiawei//
883e586e47Slinjiawei//  val xsCore = Module(new XSCore)
893e586e47Slinjiawei//
903e586e47Slinjiawei//  io.frontend <> DontCare
913e586e47Slinjiawei//
923e586e47Slinjiawei//  io.mem <> xsCore.io.mem
933e586e47Slinjiawei//
943e586e47Slinjiawei//  val addrSpace = List(
953e586e47Slinjiawei//    (0x40000000L, 0x40000000L), // external devices
963e586e47Slinjiawei//    (0x38000000L, 0x00010000L)  // CLINT
973e586e47Slinjiawei//  )
983e586e47Slinjiawei//  val mmioXbar = Module(new NaiveTL1toN(addrSpace, xsCore.io.mem.params))
993e586e47Slinjiawei//  mmioXbar.io.in <> xsCore.io.mmio
1003e586e47Slinjiawei//
1013e586e47Slinjiawei//  val extDev = mmioXbar.io.out(0)
1023e586e47Slinjiawei//  val clint = Module(new AXI4Timer(sim = !env.FPGAPlatform))
1033e586e47Slinjiawei//  clint.io.in <> AXI4ToAXI4Lite(MMIOTLToAXI4(mmioXbar.io.out(1)))
1043e586e47Slinjiawei//
1053e586e47Slinjiawei//  io.mmio <> extDev
1063e586e47Slinjiawei//
1073e586e47Slinjiawei//  val mtipSync = clint.io.extra.get.mtip
1083e586e47Slinjiawei//  val meipSync = RegNext(RegNext(io.meip))
1093e586e47Slinjiawei//  ExcitingUtils.addSource(mtipSync, "mtip")
1103e586e47Slinjiawei//  ExcitingUtils.addSource(meipSync, "meip")
1113e586e47Slinjiawei//}
112