xref: /XiangShan/src/main/scala/system/SoC.scala (revision 3e586e471ba130333d8cd14c632e2b5bba5ba24d)
1006e1884SZihao Yupackage system
2006e1884SZihao Yu
3*3e586e47Slinjiaweiimport chipsalliance.rocketchip.config.Parameters
4*3e586e47Slinjiaweiimport device.{AXI4Timer, TLTimer}
5006e1884SZihao Yuimport chisel3._
6096ea47eSzhanglinjuanimport chisel3.util._
7*3e586e47Slinjiaweiimport freechips.rocketchip.diplomacy.{AddressSet, LazyModule, LazyModuleImp}
8*3e586e47Slinjiaweiimport freechips.rocketchip.tilelink.{TLFuzzer, TLIdentityNode, TLXbar}
97d5ddbe6SLinJiaweiimport xiangshan.{HasXSParameter, XSCore}
10a428082bSLinJiawei
11a428082bSLinJiawei
12a428082bSLinJiaweicase class SoCParameters
13a428082bSLinJiawei(
14a428082bSLinJiawei  EnableILA: Boolean = false,
15a428082bSLinJiawei  HasL2Cache: Boolean = false,
16a428082bSLinJiawei  HasPrefetch: Boolean = false
17a428082bSLinJiawei)
18006e1884SZihao Yu
197d5ddbe6SLinJiaweitrait HasSoCParameter extends HasXSParameter{
20*3e586e47Slinjiawei  val soc = top.Parameters.get.socParameters
21a428082bSLinJiawei  val EnableILA = soc.EnableILA
22a428082bSLinJiawei  val HasL2cache = soc.HasL2Cache
23a428082bSLinJiawei  val HasPrefetch = soc.HasPrefetch
24303b861dSZihao Yu}
25303b861dSZihao Yu
261e3fad10SLinJiaweiclass ILABundle extends Bundle {}
27303b861dSZihao Yu
28*3e586e47Slinjiawei
29*3e586e47Slinjiaweiclass DummyCore()(implicit p: Parameters) extends LazyModule {
30*3e586e47Slinjiawei  val mem = TLFuzzer(nOperations = 10)
31*3e586e47Slinjiawei  val mmio = TLFuzzer(nOperations = 10)
32*3e586e47Slinjiawei
33*3e586e47Slinjiawei  lazy val module = new LazyModuleImp(this){
34*3e586e47Slinjiawei
35*3e586e47Slinjiawei  }
36*3e586e47Slinjiawei}
37*3e586e47Slinjiawei
38*3e586e47Slinjiawei
39*3e586e47Slinjiaweiclass XSSoc()(implicit p: Parameters) extends LazyModule with HasSoCParameter {
40*3e586e47Slinjiawei
41*3e586e47Slinjiawei  private val xsCore = LazyModule(new DummyCore())
42*3e586e47Slinjiawei
43*3e586e47Slinjiawei  // only mem and extDev visible externally
44*3e586e47Slinjiawei  val mem = xsCore.mem
45*3e586e47Slinjiawei  val extDev = TLIdentityNode()
46*3e586e47Slinjiawei
47*3e586e47Slinjiawei  private val mmioXbar = TLXbar()
48*3e586e47Slinjiawei  private val clint = LazyModule(new TLTimer(
49*3e586e47Slinjiawei    Seq(AddressSet(0x38000000L, 0x0000ffffL)),
50*3e586e47Slinjiawei    sim = !env.FPGAPlatform
51*3e586e47Slinjiawei  ))
52*3e586e47Slinjiawei
53*3e586e47Slinjiawei  mmioXbar := xsCore.mmio
54*3e586e47Slinjiawei  clint.node := mmioXbar
55*3e586e47Slinjiawei  extDev := mmioXbar
56*3e586e47Slinjiawei
57*3e586e47Slinjiawei  lazy val module = new LazyModuleImp(this){
58006e1884SZihao Yu    val io = IO(new Bundle{
59466eb0a8SZihao Yu      val meip = Input(Bool())
60a428082bSLinJiawei      val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None
61006e1884SZihao Yu    })
62*3e586e47Slinjiawei    val mtipSync = WireInit(0.U(1.W)) //clint.module.mtip
63466eb0a8SZihao Yu    val meipSync = RegNext(RegNext(io.meip))
647d5ddbe6SLinJiawei    ExcitingUtils.addSource(mtipSync, "mtip")
657d5ddbe6SLinJiawei    ExcitingUtils.addSource(meipSync, "meip")
66006e1884SZihao Yu  }
67*3e586e47Slinjiawei
68*3e586e47Slinjiawei}
69*3e586e47Slinjiawei
70*3e586e47Slinjiawei
71*3e586e47Slinjiawei//class XSSoc extends Module with HasSoCParameter {
72*3e586e47Slinjiawei//  val io = IO(new Bundle{
73*3e586e47Slinjiawei//    val mem = new TLCached(l1BusParams)
74*3e586e47Slinjiawei//    val mmio = new TLCached(l1BusParams)
75*3e586e47Slinjiawei//    val frontend = Flipped(new AXI4) //TODO: do we need it ?
76*3e586e47Slinjiawei//    val meip = Input(Bool())
77*3e586e47Slinjiawei//    val ila = if (env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None
78*3e586e47Slinjiawei//  })
79*3e586e47Slinjiawei//
80*3e586e47Slinjiawei//  val xsCore = Module(new XSCore)
81*3e586e47Slinjiawei//
82*3e586e47Slinjiawei//  io.frontend <> DontCare
83*3e586e47Slinjiawei//
84*3e586e47Slinjiawei//  io.mem <> xsCore.io.mem
85*3e586e47Slinjiawei//
86*3e586e47Slinjiawei//  val addrSpace = List(
87*3e586e47Slinjiawei//    (0x40000000L, 0x40000000L), // external devices
88*3e586e47Slinjiawei//    (0x38000000L, 0x00010000L)  // CLINT
89*3e586e47Slinjiawei//  )
90*3e586e47Slinjiawei//  val mmioXbar = Module(new NaiveTL1toN(addrSpace, xsCore.io.mem.params))
91*3e586e47Slinjiawei//  mmioXbar.io.in <> xsCore.io.mmio
92*3e586e47Slinjiawei//
93*3e586e47Slinjiawei//  val extDev = mmioXbar.io.out(0)
94*3e586e47Slinjiawei//  val clint = Module(new AXI4Timer(sim = !env.FPGAPlatform))
95*3e586e47Slinjiawei//  clint.io.in <> AXI4ToAXI4Lite(MMIOTLToAXI4(mmioXbar.io.out(1)))
96*3e586e47Slinjiawei//
97*3e586e47Slinjiawei//  io.mmio <> extDev
98*3e586e47Slinjiawei//
99*3e586e47Slinjiawei//  val mtipSync = clint.io.extra.get.mtip
100*3e586e47Slinjiawei//  val meipSync = RegNext(RegNext(io.meip))
101*3e586e47Slinjiawei//  ExcitingUtils.addSource(mtipSync, "mtip")
102*3e586e47Slinjiawei//  ExcitingUtils.addSource(meipSync, "meip")
103*3e586e47Slinjiawei//}
104