xref: /XiangShan/src/main/scala/top/Top.scala (revision 8b037849dc635d46a4c9394f73da0e20c233b4d3)
1*8b037849SYinan Xupackage top
2*8b037849SYinan Xu
3*8b037849SYinan Xuimport chisel3._
4*8b037849SYinan Xuimport chisel3.util._
5*8b037849SYinan Xuimport xiangshan._
6*8b037849SYinan Xuimport system._
7*8b037849SYinan Xuimport chisel3.stage.ChiselGeneratorAnnotation
8*8b037849SYinan Xuimport chipsalliance.rocketchip.config
9*8b037849SYinan Xuimport device.{TLTimer, AXI4Plic}
10*8b037849SYinan Xuimport freechips.rocketchip.diplomacy._
11*8b037849SYinan Xuimport freechips.rocketchip.tilelink._
12*8b037849SYinan Xuimport freechips.rocketchip.amba.axi4._
13*8b037849SYinan Xuimport freechips.rocketchip.devices.tilelink.{DevNullParams, TLError}
14*8b037849SYinan Xuimport sifive.blocks.inclusivecache._
15*8b037849SYinan Xuimport xiangshan.cache.prefetch.L2Prefetcher
16*8b037849SYinan Xu
17*8b037849SYinan Xu
18*8b037849SYinan Xuabstract class BaseXSSoc()(implicit p: config.Parameters) extends LazyModule with HasSoCParameter {
19*8b037849SYinan Xu  val bankedNode = BankBinder(L3NBanks, L3BlockSize)
20*8b037849SYinan Xu  val peripheralXbar = TLXbar()
21*8b037849SYinan Xu  val l3_xbar = TLXbar()
22*8b037849SYinan Xu}
23*8b037849SYinan Xu
24*8b037849SYinan Xu// We adapt the following three traits from rocket-chip.
25*8b037849SYinan Xu// Source: rocket-chip/src/main/scala/subsystem/Ports.scala
26*8b037849SYinan Xutrait HaveSlaveAXI4Port {
27*8b037849SYinan Xu  this: BaseXSSoc =>
28*8b037849SYinan Xu
29*8b037849SYinan Xu  val idBits = 16
30*8b037849SYinan Xu
31*8b037849SYinan Xu  val l3FrontendAXI4Node = AXI4MasterNode(Seq(AXI4MasterPortParameters(
32*8b037849SYinan Xu    Seq(AXI4MasterParameters(
33*8b037849SYinan Xu      name = "dma",
34*8b037849SYinan Xu      id = IdRange(0, 1 << idBits)
35*8b037849SYinan Xu    ))
36*8b037849SYinan Xu  )))
37*8b037849SYinan Xu  private val errorDevice = LazyModule(new TLError(
38*8b037849SYinan Xu    params = DevNullParams(
39*8b037849SYinan Xu      address = Seq(AddressSet(0x0, 0x7fffffffL)),
40*8b037849SYinan Xu      maxAtomic = 8,
41*8b037849SYinan Xu      maxTransfer = 64),
42*8b037849SYinan Xu    beatBytes = L2BusWidth / 8
43*8b037849SYinan Xu  ))
44*8b037849SYinan Xu  private val error_xbar = TLXbar()
45*8b037849SYinan Xu
46*8b037849SYinan Xu  error_xbar :=
47*8b037849SYinan Xu    AXI4ToTL() :=
48*8b037849SYinan Xu    AXI4UserYanker(Some(1)) :=
49*8b037849SYinan Xu    AXI4Fragmenter() :=
50*8b037849SYinan Xu    AXI4IdIndexer(1) :=
51*8b037849SYinan Xu    l3FrontendAXI4Node
52*8b037849SYinan Xu  errorDevice.node := error_xbar
53*8b037849SYinan Xu  l3_xbar :=
54*8b037849SYinan Xu    TLBuffer() :=
55*8b037849SYinan Xu    error_xbar
56*8b037849SYinan Xu
57*8b037849SYinan Xu  val dma = InModuleBody {
58*8b037849SYinan Xu    l3FrontendAXI4Node.makeIOs()
59*8b037849SYinan Xu  }
60*8b037849SYinan Xu}
61*8b037849SYinan Xu
62*8b037849SYinan Xutrait HaveAXI4MemPort {
63*8b037849SYinan Xu  this: BaseXSSoc =>
64*8b037849SYinan Xu  // 40-bit physical address
65*8b037849SYinan Xu  val memRange = AddressSet(0x00000000L, 0xffffffffffL).subtract(AddressSet(0x0L, 0x7fffffffL))
66*8b037849SYinan Xu  val memAXI4SlaveNode = AXI4SlaveNode(Seq.tabulate(L3NBanks) { i =>
67*8b037849SYinan Xu    AXI4SlavePortParameters(
68*8b037849SYinan Xu      slaves = Seq(
69*8b037849SYinan Xu        AXI4SlaveParameters(
70*8b037849SYinan Xu          address = memRange,
71*8b037849SYinan Xu          regionType = RegionType.UNCACHED,
72*8b037849SYinan Xu          executable = true,
73*8b037849SYinan Xu          supportsRead = TransferSizes(1, L3BlockSize),
74*8b037849SYinan Xu          supportsWrite = TransferSizes(1, L3BlockSize),
75*8b037849SYinan Xu          interleavedId = Some(0)
76*8b037849SYinan Xu        )
77*8b037849SYinan Xu      ),
78*8b037849SYinan Xu      beatBytes = L3BusWidth / 8
79*8b037849SYinan Xu    )
80*8b037849SYinan Xu  })
81*8b037849SYinan Xu
82*8b037849SYinan Xu  memAXI4SlaveNode :=*
83*8b037849SYinan Xu    AXI4UserYanker() :=*
84*8b037849SYinan Xu    AXI4IdIndexer(12) :=*
85*8b037849SYinan Xu    TLToAXI4() :=*
86*8b037849SYinan Xu    TLWidthWidget(L3BusWidth / 8) :=*
87*8b037849SYinan Xu    TLCacheCork() :=*
88*8b037849SYinan Xu    bankedNode
89*8b037849SYinan Xu
90*8b037849SYinan Xu  val memory = InModuleBody {
91*8b037849SYinan Xu    memAXI4SlaveNode.makeIOs()
92*8b037849SYinan Xu  }
93*8b037849SYinan Xu}
94*8b037849SYinan Xu
95*8b037849SYinan Xu
96*8b037849SYinan Xutrait HaveAXI4PeripheralPort { this: BaseXSSoc =>
97*8b037849SYinan Xu  // on-chip devices: 0x3800_000 - 0x3fff_ffff
98*8b037849SYinan Xu  val onChipPeripheralRange = AddressSet(0x38000000L, 0x07ffffffL)
99*8b037849SYinan Xu  val peripheralRange = AddressSet(0x0, 0x7fffffff).subtract(onChipPeripheralRange)
100*8b037849SYinan Xu  val peripheralNode = AXI4SlaveNode(Seq(AXI4SlavePortParameters(
101*8b037849SYinan Xu    Seq(AXI4SlaveParameters(
102*8b037849SYinan Xu      address = peripheralRange,
103*8b037849SYinan Xu      regionType = RegionType.UNCACHED,
104*8b037849SYinan Xu      supportsRead = TransferSizes(1, 8),
105*8b037849SYinan Xu      supportsWrite = TransferSizes(1, 8),
106*8b037849SYinan Xu      interleavedId = Some(0)
107*8b037849SYinan Xu    )),
108*8b037849SYinan Xu    beatBytes = 8
109*8b037849SYinan Xu  )))
110*8b037849SYinan Xu
111*8b037849SYinan Xu  peripheralNode :=
112*8b037849SYinan Xu    AXI4UserYanker() :=
113*8b037849SYinan Xu    AXI4IdIndexer(14) :=*
114*8b037849SYinan Xu    TLToAXI4() :=
115*8b037849SYinan Xu    peripheralXbar
116*8b037849SYinan Xu
117*8b037849SYinan Xu  val peripheral = InModuleBody {
118*8b037849SYinan Xu    peripheralNode.makeIOs()
119*8b037849SYinan Xu  }
120*8b037849SYinan Xu
121*8b037849SYinan Xu}
122*8b037849SYinan Xu
123*8b037849SYinan Xu
124*8b037849SYinan Xuclass XSTop()(implicit p: config.Parameters) extends BaseXSSoc()
125*8b037849SYinan Xu  with HaveAXI4MemPort
126*8b037849SYinan Xu  with HaveAXI4PeripheralPort
127*8b037849SYinan Xu  with HaveSlaveAXI4Port
128*8b037849SYinan Xu  {
129*8b037849SYinan Xu
130*8b037849SYinan Xu  println(s"FPGASoC cores: $NumCores banks: $L3NBanks block size: $L3BlockSize bus size: $L3BusWidth")
131*8b037849SYinan Xu
132*8b037849SYinan Xu  val core = Seq.fill(NumCores)(LazyModule(new XSCore()))
133*8b037849SYinan Xu  val l2prefetcher = Seq.fill(NumCores)(LazyModule(new L2Prefetcher()))
134*8b037849SYinan Xu  val l2cache = Seq.fill(NumCores)(LazyModule(new InclusiveCache(
135*8b037849SYinan Xu    CacheParameters(
136*8b037849SYinan Xu      level = 2,
137*8b037849SYinan Xu      ways = L2NWays,
138*8b037849SYinan Xu      sets = L2NSets,
139*8b037849SYinan Xu      blockBytes = L2BlockSize,
140*8b037849SYinan Xu      beatBytes = L1BusWidth / 8, // beatBytes = l1BusDataWidth / 8
141*8b037849SYinan Xu      cacheName = s"L2"
142*8b037849SYinan Xu    ),
143*8b037849SYinan Xu    InclusiveCacheMicroParameters(
144*8b037849SYinan Xu      writeBytes = 32
145*8b037849SYinan Xu    )
146*8b037849SYinan Xu  )))
147*8b037849SYinan Xu  val l2xbar = Seq.fill(NumCores)(TLXbar())
148*8b037849SYinan Xu
149*8b037849SYinan Xu  for (i <- 0 until NumCores) {
150*8b037849SYinan Xu    peripheralXbar := TLBuffer() := core(i).frontend.instrUncache.clientNode
151*8b037849SYinan Xu    peripheralXbar := TLBuffer() := core(i).memBlock.uncache.clientNode
152*8b037849SYinan Xu    l2xbar(i) := TLBuffer() := core(i).memBlock.dcache.clientNode
153*8b037849SYinan Xu    l2xbar(i) := TLBuffer() := core(i).l1pluscache.clientNode
154*8b037849SYinan Xu    l2xbar(i) := TLBuffer() := core(i).ptw.node
155*8b037849SYinan Xu    l2xbar(i) := TLBuffer() := l2prefetcher(i).clientNode
156*8b037849SYinan Xu    l2cache(i).node := TLBuffer() := l2xbar(i)
157*8b037849SYinan Xu    l3_xbar := TLBuffer() := l2cache(i).node
158*8b037849SYinan Xu  }
159*8b037849SYinan Xu
160*8b037849SYinan Xu  private val clint = LazyModule(new TLTimer(
161*8b037849SYinan Xu    Seq(AddressSet(0x38000000L, 0x0000ffffL)),
162*8b037849SYinan Xu    sim = !env.FPGAPlatform
163*8b037849SYinan Xu  ))
164*8b037849SYinan Xu  clint.node := peripheralXbar
165*8b037849SYinan Xu
166*8b037849SYinan Xu  val plic = LazyModule(new AXI4Plic(
167*8b037849SYinan Xu    Seq(AddressSet(0x3c000000L, 0x03ffffffL)),
168*8b037849SYinan Xu    sim = !env.FPGAPlatform
169*8b037849SYinan Xu  ))
170*8b037849SYinan Xu  plic.node := AXI4IdentityNode() := AXI4UserYanker() := TLToAXI4() := peripheralXbar
171*8b037849SYinan Xu
172*8b037849SYinan Xu  val l3cache = LazyModule(new InclusiveCache(
173*8b037849SYinan Xu    CacheParameters(
174*8b037849SYinan Xu      level = 3,
175*8b037849SYinan Xu      ways = L3NWays,
176*8b037849SYinan Xu      sets = L3NSets,
177*8b037849SYinan Xu      blockBytes = L3BlockSize,
178*8b037849SYinan Xu      beatBytes = L2BusWidth / 8,
179*8b037849SYinan Xu      cacheName = "L3"
180*8b037849SYinan Xu    ),
181*8b037849SYinan Xu    InclusiveCacheMicroParameters(
182*8b037849SYinan Xu      writeBytes = 32
183*8b037849SYinan Xu    )
184*8b037849SYinan Xu  )).node
185*8b037849SYinan Xu
186*8b037849SYinan Xu  bankedNode :*= l3cache :*= TLBuffer() :*= l3_xbar
187*8b037849SYinan Xu
188*8b037849SYinan Xu  lazy val module = new LazyModuleImp(this) {
189*8b037849SYinan Xu    val io = IO(new Bundle {
190*8b037849SYinan Xu      val extIntrs = Input(UInt(NrExtIntr.W))
191*8b037849SYinan Xu      // val meip = Input(Vec(NumCores, Bool()))
192*8b037849SYinan Xu      val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None
193*8b037849SYinan Xu    })
194*8b037849SYinan Xu
195*8b037849SYinan Xu    plic.module.io.extra.get.intrVec <> RegNext(RegNext(io.extIntrs))
196*8b037849SYinan Xu
197*8b037849SYinan Xu    for (i <- 0 until NumCores) {
198*8b037849SYinan Xu      core(i).module.io.hartId := i.U
199*8b037849SYinan Xu      core(i).module.io.externalInterrupt.mtip := clint.module.io.mtip(i)
200*8b037849SYinan Xu      core(i).module.io.externalInterrupt.msip := clint.module.io.msip(i)
201*8b037849SYinan Xu      core(i).module.io.externalInterrupt.meip := plic.module.io.extra.get.meip(i)
202*8b037849SYinan Xu      l2prefetcher(i).module.io.enable := RegNext(core(i).module.io.l2_pf_enable)
203*8b037849SYinan Xu      l2prefetcher(i).module.io.in <> l2cache(i).module.io
204*8b037849SYinan Xu    }
205*8b037849SYinan Xu
206*8b037849SYinan Xu    dontTouch(io.extIntrs)
207*8b037849SYinan Xu  }
208*8b037849SYinan Xu}
209*8b037849SYinan Xu
210*8b037849SYinan Xuobject TopMain extends App {
211*8b037849SYinan Xu  override def main(args: Array[String]): Unit = {
212*8b037849SYinan Xu    Parameters.set(
213*8b037849SYinan Xu      args.contains("--dual-core") match {
214*8b037849SYinan Xu        case false => Parameters()
215*8b037849SYinan Xu        case true  => Parameters.dualCoreParameters
216*8b037849SYinan Xu      }
217*8b037849SYinan Xu    )
218*8b037849SYinan Xu    val otherArgs = args.filterNot(_ == "--dual-core")
219*8b037849SYinan Xu    implicit val p = config.Parameters.empty
220*8b037849SYinan Xu    XiangShanStage.execute(otherArgs, Seq(
221*8b037849SYinan Xu      ChiselGeneratorAnnotation(() => {
222*8b037849SYinan Xu        val soc = LazyModule(new XSTop())
223*8b037849SYinan Xu        soc.module
224*8b037849SYinan Xu      })
225*8b037849SYinan Xu    ))
226*8b037849SYinan Xu  }
227*8b037849SYinan Xu}
228