xref: /XiangShan/src/main/scala/xiangshan/XSTile.scala (revision 73be64b3fc882a759f70d0852ba42d09c2a44af6)
1*73be64b3SJiawei Linpackage xiangshan
2*73be64b3SJiawei Lin
3*73be64b3SJiawei Linimport chisel3._
4*73be64b3SJiawei Linimport chipsalliance.rocketchip.config.{Config, Parameters}
5*73be64b3SJiawei Linimport chisel3.util.{Valid, ValidIO}
6*73be64b3SJiawei Linimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp, LazyModuleImpLike}
7*73be64b3SJiawei Linimport freechips.rocketchip.diplomaticobjectmodel.logicaltree.GenericLogicalTreeNode
8*73be64b3SJiawei Linimport freechips.rocketchip.interrupts.{IntSinkNode, IntSinkPortParameters, IntSinkPortSimple}
9*73be64b3SJiawei Linimport freechips.rocketchip.tile.{BusErrorUnit, BusErrorUnitParams, BusErrors}
10*73be64b3SJiawei Linimport freechips.rocketchip.tilelink.{BankBinder, TLBuffer, TLIdentityNode, TLTempNode, TLXbar}
11*73be64b3SJiawei Linimport huancun.debug.TLLogger
12*73be64b3SJiawei Linimport huancun.{HCCacheParamsKey, HuanCun}
13*73be64b3SJiawei Linimport system.HasSoCParameter
14*73be64b3SJiawei Linimport top.BusPerfMonitor
15*73be64b3SJiawei Linimport utils.ResetGen
16*73be64b3SJiawei Lin
17*73be64b3SJiawei Linclass L1CacheErrorInfo(implicit val p: Parameters) extends Bundle with HasSoCParameter {
18*73be64b3SJiawei Lin  val paddr = Valid(UInt(soc.PAddrBits.W))
19*73be64b3SJiawei Lin  // for now, we only detect ecc
20*73be64b3SJiawei Lin  val ecc_error = Valid(Bool())
21*73be64b3SJiawei Lin}
22*73be64b3SJiawei Lin
23*73be64b3SJiawei Linclass XSL1BusErrors()(implicit val p: Parameters) extends BusErrors {
24*73be64b3SJiawei Lin  val icache = new L1CacheErrorInfo
25*73be64b3SJiawei Lin  val dcache = new L1CacheErrorInfo
26*73be64b3SJiawei Lin
27*73be64b3SJiawei Lin  override def toErrorList: List[Option[(ValidIO[UInt], String, String)]] =
28*73be64b3SJiawei Lin    List(
29*73be64b3SJiawei Lin      Some(icache.paddr, s"IBUS", s"Icache bus error"),
30*73be64b3SJiawei Lin      Some(icache.ecc_error, s"I_ECC", s"Icache ecc error"),
31*73be64b3SJiawei Lin      Some(dcache.paddr, s"DBUS", s"Dcache bus error"),
32*73be64b3SJiawei Lin      Some(dcache.ecc_error, s"D_ECC", s"Dcache ecc error")
33*73be64b3SJiawei Lin    )
34*73be64b3SJiawei Lin}
35*73be64b3SJiawei Lin
36*73be64b3SJiawei Lin/**
37*73be64b3SJiawei Lin  *   XSTileMisc contains every module except Core and L2 Cache
38*73be64b3SJiawei Lin  */
39*73be64b3SJiawei Linclass XSTileMisc()(implicit p: Parameters) extends LazyModule
40*73be64b3SJiawei Lin  with HasXSParameter
41*73be64b3SJiawei Lin  with HasSoCParameter
42*73be64b3SJiawei Lin{
43*73be64b3SJiawei Lin  val l1_xbar = TLXbar()
44*73be64b3SJiawei Lin  val mmio_xbar = TLXbar()
45*73be64b3SJiawei Lin  val memory_port = TLIdentityNode()
46*73be64b3SJiawei Lin  val beu = LazyModule(new BusErrorUnit(
47*73be64b3SJiawei Lin    new XSL1BusErrors(), BusErrorUnitParams(0x38010000), new GenericLogicalTreeNode
48*73be64b3SJiawei Lin  ))
49*73be64b3SJiawei Lin  val busPMU = BusPerfMonitor(enable = !debugOpts.FPGAPlatform)
50*73be64b3SJiawei Lin  val l1d_logger = TLLogger(s"L2_L1D_$hardId", !debugOpts.FPGAPlatform)
51*73be64b3SJiawei Lin  val l2_binder = coreParams.L2CacheParamsOpt.map(_ => BankBinder(coreParams.L2NBanks, 64))
52*73be64b3SJiawei Lin
53*73be64b3SJiawei Lin  val i_mmio_port = TLTempNode()
54*73be64b3SJiawei Lin  val d_mmio_port = TLTempNode()
55*73be64b3SJiawei Lin
56*73be64b3SJiawei Lin  busPMU := l1d_logger
57*73be64b3SJiawei Lin  l1_xbar :=* busPMU
58*73be64b3SJiawei Lin
59*73be64b3SJiawei Lin  l2_binder match {
60*73be64b3SJiawei Lin    case Some(binder) =>
61*73be64b3SJiawei Lin      memory_port :=* binder
62*73be64b3SJiawei Lin    case None =>
63*73be64b3SJiawei Lin      memory_port := l1_xbar
64*73be64b3SJiawei Lin  }
65*73be64b3SJiawei Lin
66*73be64b3SJiawei Lin  mmio_xbar := TLBuffer() := i_mmio_port
67*73be64b3SJiawei Lin  mmio_xbar := TLBuffer() := d_mmio_port
68*73be64b3SJiawei Lin  beu.node := TLBuffer() := mmio_xbar
69*73be64b3SJiawei Lin
70*73be64b3SJiawei Lin  lazy val module = new LazyModuleImp(this){
71*73be64b3SJiawei Lin    val beu_errors = IO(Input(chiselTypeOf(beu.module.io.errors)))
72*73be64b3SJiawei Lin    beu.module.io.errors <> beu_errors
73*73be64b3SJiawei Lin  }
74*73be64b3SJiawei Lin}
75*73be64b3SJiawei Lin
76*73be64b3SJiawei Linclass XSTile()(implicit p: Parameters) extends LazyModule
77*73be64b3SJiawei Lin  with HasXSParameter
78*73be64b3SJiawei Lin  with HasSoCParameter
79*73be64b3SJiawei Lin{
80*73be64b3SJiawei Lin  private val core = LazyModule(new XSCore())
81*73be64b3SJiawei Lin  private val misc = LazyModule(new XSTileMisc())
82*73be64b3SJiawei Lin  private val l2cache = coreParams.L2CacheParamsOpt.map(l2param =>
83*73be64b3SJiawei Lin    LazyModule(new HuanCun()(new Config((_, _, _) => {
84*73be64b3SJiawei Lin      case HCCacheParamsKey => l2param
85*73be64b3SJiawei Lin    })))
86*73be64b3SJiawei Lin  )
87*73be64b3SJiawei Lin
88*73be64b3SJiawei Lin  // public ports
89*73be64b3SJiawei Lin  val memory_port = misc.memory_port
90*73be64b3SJiawei Lin  val uncache = misc.mmio_xbar
91*73be64b3SJiawei Lin  val clint_int_sink = core.clint_int_sink
92*73be64b3SJiawei Lin  val plic_int_sink = core.plic_int_sink
93*73be64b3SJiawei Lin  val debug_int_sink = core.debug_int_sink
94*73be64b3SJiawei Lin  val beu_int_source = misc.beu.intNode
95*73be64b3SJiawei Lin
96*73be64b3SJiawei Lin  if (coreParams.dcacheParametersOpt.nonEmpty) {
97*73be64b3SJiawei Lin    misc.l1d_logger := core.memBlock.dcache.clientNode
98*73be64b3SJiawei Lin  }
99*73be64b3SJiawei Lin  misc.busPMU := core.frontend.icache.clientNode
100*73be64b3SJiawei Lin  if (!coreParams.softPTW) {
101*73be64b3SJiawei Lin    misc.busPMU := core.ptw.node
102*73be64b3SJiawei Lin  }
103*73be64b3SJiawei Lin  l2cache match {
104*73be64b3SJiawei Lin    case Some(l2) =>
105*73be64b3SJiawei Lin      misc.l2_binder.get :*= l2.node :*= misc.l1_xbar
106*73be64b3SJiawei Lin    case None =>
107*73be64b3SJiawei Lin  }
108*73be64b3SJiawei Lin
109*73be64b3SJiawei Lin  misc.i_mmio_port := core.frontend.instrUncache.clientNode
110*73be64b3SJiawei Lin  misc.d_mmio_port := core.memBlock.uncache.clientNode
111*73be64b3SJiawei Lin
112*73be64b3SJiawei Lin  lazy val module = new LazyModuleImp(this){
113*73be64b3SJiawei Lin    val io = IO(new Bundle {
114*73be64b3SJiawei Lin      val hartId = Input(UInt(64.W))
115*73be64b3SJiawei Lin    })
116*73be64b3SJiawei Lin
117*73be64b3SJiawei Lin    core.module.io.hartId := io.hartId
118*73be64b3SJiawei Lin
119*73be64b3SJiawei Lin    misc.module.beu_errors <> core.module.io.beu_errors
120*73be64b3SJiawei Lin
121*73be64b3SJiawei Lin    val core_reset_gen = Module(new ResetGen(1, !debugOpts.FPGAPlatform))
122*73be64b3SJiawei Lin    core.module.reset := core_reset_gen.io.out
123*73be64b3SJiawei Lin
124*73be64b3SJiawei Lin    val l2_reset_gen = Module(new ResetGen(1, !debugOpts.FPGAPlatform))
125*73be64b3SJiawei Lin    l2cache.foreach( _.module.reset := l2_reset_gen.io.out)
126*73be64b3SJiawei Lin  }
127*73be64b3SJiawei Lin}
128