xref: /XiangShan/src/main/scala/system/SoC.scala (revision 2225d46ebbe2fd16b9b29963c27a7d0385a42709)
1006e1884SZihao Yupackage system
2006e1884SZihao Yu
3*2225d46eSJiawei Linimport chipsalliance.rocketchip.config.{Field, Parameters}
4006e1884SZihao Yuimport chisel3._
5096ea47eSzhanglinjuanimport chisel3.util._
6*2225d46eSJiawei Linimport xiangshan.{DebugOptionsKey, HasXSParameter, XSBundle, XSCore, XSCoreParameters}
70584d3a8SLinJiaweiimport freechips.rocketchip.tile.{BusErrorUnit, BusErrorUnitParams, BusErrors, L1BusErrors}
8a428082bSLinJiawei
9*2225d46eSJiawei Lincase object SoCParamsKey extends Field[SoCParameters]
10*2225d46eSJiawei Lin
11a428082bSLinJiaweicase class SoCParameters
12a428082bSLinJiawei(
13*2225d46eSJiawei Lin  cores: List[XSCoreParameters],
14a428082bSLinJiawei  EnableILA: Boolean = false,
15*2225d46eSJiawei Lin  extIntrs: Int = 150
16*2225d46eSJiawei Lin){
17*2225d46eSJiawei Lin  val PAddrBits = cores.map(_.PAddrBits).reduce((x, y) => if(x > y) x else y)
18*2225d46eSJiawei Lin  // L3 configurations
19*2225d46eSJiawei Lin  val L3InnerBusWidth = 256
20*2225d46eSJiawei Lin  val L3Size = 4 * 1024 * 1024 // 4MB
21*2225d46eSJiawei Lin  val L3BlockSize = 64
22*2225d46eSJiawei Lin  val L3NBanks = 4
23*2225d46eSJiawei Lin  val L3NWays = 8
24006e1884SZihao Yu
25*2225d46eSJiawei Lin  // on chip network configurations
26*2225d46eSJiawei Lin  val L3OuterBusWidth = 256
27*2225d46eSJiawei Lin
28*2225d46eSJiawei Lin}
29*2225d46eSJiawei Lin
30*2225d46eSJiawei Lintrait HasSoCParameter {
31*2225d46eSJiawei Lin  implicit val p: Parameters
32*2225d46eSJiawei Lin
33*2225d46eSJiawei Lin  val soc = p(SoCParamsKey)
34*2225d46eSJiawei Lin  val debugOpts = p(DebugOptionsKey)
35*2225d46eSJiawei Lin  val NumCores = soc.cores.size
36a428082bSLinJiawei  val EnableILA = soc.EnableILA
37*2225d46eSJiawei Lin
38*2225d46eSJiawei Lin  // L3 configurations
39*2225d46eSJiawei Lin  val L3InnerBusWidth = soc.L3InnerBusWidth
40*2225d46eSJiawei Lin  val L3Size = soc.L3Size
41*2225d46eSJiawei Lin  val L3BlockSize = soc.L3BlockSize
42*2225d46eSJiawei Lin  val L3NBanks = soc.L3NBanks
43*2225d46eSJiawei Lin  val L3NWays = soc.L3NWays
44*2225d46eSJiawei Lin  val L3NSets = L3Size / L3BlockSize / L3NBanks / L3NWays
45*2225d46eSJiawei Lin
46*2225d46eSJiawei Lin  // on chip network configurations
47*2225d46eSJiawei Lin  val L3OuterBusWidth = soc.L3OuterBusWidth
48*2225d46eSJiawei Lin
49*2225d46eSJiawei Lin  val NrExtIntr = soc.extIntrs
50303b861dSZihao Yu}
51303b861dSZihao Yu
521e3fad10SLinJiaweiclass ILABundle extends Bundle {}
53303b861dSZihao Yu
543e586e47Slinjiawei
55*2225d46eSJiawei Linclass L1CacheErrorInfo(implicit val p: Parameters) extends Bundle with HasSoCParameter {
56*2225d46eSJiawei Lin  val paddr = Valid(UInt(soc.PAddrBits.W))
570584d3a8SLinJiawei  // for now, we only detect ecc
580584d3a8SLinJiawei  val ecc_error = Valid(Bool())
593e586e47Slinjiawei}
603e586e47Slinjiawei
61*2225d46eSJiawei Linclass XSL1BusErrors(val nCores: Int)(implicit val p: Parameters) extends BusErrors {
629637c0c6SLinJiawei  val icache = Vec(nCores, new L1CacheErrorInfo)
634e3ce935Sljw  val l1plus = Vec(nCores, new L1CacheErrorInfo)
649637c0c6SLinJiawei  val dcache = Vec(nCores, new L1CacheErrorInfo)
659637c0c6SLinJiawei
669637c0c6SLinJiawei  override def toErrorList: List[Option[(ValidIO[UInt], String, String)]] =
679637c0c6SLinJiawei    List.tabulate(nCores){i =>
689637c0c6SLinJiawei      List(
699637c0c6SLinJiawei        Some(icache(i).paddr, s"IBUS_$i", s"Icache_$i bus error"),
709637c0c6SLinJiawei        Some(icache(i).ecc_error, s"I_ECC_$i", s"Icache_$i ecc error"),
714e3ce935Sljw        Some(l1plus(i).paddr, s"L1PLUS_$i", s"L1PLUS_$i bus error"),
724e3ce935Sljw        Some(l1plus(i).ecc_error, s"L1PLUS_ECC_$i", s"L1PLUS_$i ecc error"),
739637c0c6SLinJiawei        Some(dcache(i).paddr, s"DBUS_$i", s"Dcache_$i bus error"),
749637c0c6SLinJiawei        Some(dcache(i).ecc_error, s"D_ECC_$i", s"Dcache_$i ecc error")
750584d3a8SLinJiawei      )
769637c0c6SLinJiawei    }.flatten
770584d3a8SLinJiawei}
78