1
0
rocket-chip/src/main/scala/rocketchip/BaseTop.scala

112 lines
3.6 KiB
Scala
Raw Normal View History

// See LICENSE for license details.
package rocketchip
import Chisel._
import cde.{Parameters, Field}
import junctions._
import diplomacy._
import uncore.tilelink._
import uncore.tilelink2._
import uncore.devices._
import util._
import rocket._
import coreplex._
// the following parameters will be refactored properly with TL2
2016-09-15 09:38:46 +02:00
case object GlobalAddrMap extends Field[AddrMap]
case object NCoreplexExtClients extends Field[Int]
/** Enable or disable monitoring of Diplomatic buses */
case object TLEmitMonitors extends Field[Bool]
abstract class BareTop[+C <: BaseCoreplex](_coreplex: Parameters => C)(implicit val q: Parameters) extends LazyModule {
2016-10-29 06:56:11 +02:00
// Fill in the TL1 legacy parameters; remove these once rocket/groundtest/unittest are TL2
val pBusMasters = new RangeManager
2016-10-29 06:56:11 +02:00
lazy val legacyAddrMap = GenerateGlobalAddrMap(q, coreplex.l1tol2.node.edgesIn(0).manager.managers)
val coreplex : C = LazyModule(_coreplex(q.alterPartial {
2016-10-29 06:56:11 +02:00
case NCoreplexExtClients => pBusMasters.sum
case GlobalAddrMap => legacyAddrMap
}))
TopModule.contents = Some(this)
}
2016-09-15 09:38:46 +02:00
abstract class BareTopBundle[+L <: BareTop[BaseCoreplex]](_outer: L) extends Bundle {
val outer = _outer
}
abstract class BareTopModule[+L <: BareTop[BaseCoreplex], +B <: BareTopBundle[L]](_outer: L, _io: () => B) extends LazyModuleImp(_outer) {
val outer = _outer
val io = _io ()
2016-10-29 06:56:11 +02:00
}
/** Base Top with no Periphery */
2016-10-29 07:30:13 +02:00
trait TopNetwork extends HasPeripheryParameters {
2016-10-29 06:56:11 +02:00
this: BareTop[BaseCoreplex] =>
implicit val p = q
TLImp.emitMonitors = p(TLEmitMonitors)
// Add a SoC and peripheral bus
val socBus = LazyModule(new TLXbar)
val peripheryBus = LazyModule(new TLXbar)
2016-10-29 06:20:49 +02:00
val intBus = LazyModule(new IntXbar)
peripheryBus.node :=
TLWidthWidget(p(SOCBusKey).beatBytes)(
TLAtomicAutomata(arithmetic = p(PeripheryBusKey).arithAMO)(
socBus.node))
}
2016-10-29 07:30:13 +02:00
trait TopNetworkBundle extends HasPeripheryParameters {
2016-10-29 06:56:11 +02:00
this: BareTopBundle[BareTop[BaseCoreplex]] =>
implicit val p = outer.q
val success = Bool(OUTPUT)
}
2016-10-29 07:30:13 +02:00
trait TopNetworkModule extends HasPeripheryParameters {
2016-10-29 06:56:11 +02:00
this: {
val outer: BareTop[BaseCoreplex] with TopNetwork
val io: TopNetworkBundle
} =>
implicit val p = outer.p
2016-10-28 00:34:37 +02:00
2016-10-29 06:56:11 +02:00
val coreplexMem : Vec[ClientUncachedTileLinkIO] = Wire(outer.coreplex.module.io.mem)
val coreplexSlave: Vec[ClientUncachedTileLinkIO] = Wire(outer.coreplex.module.io.slave)
val coreplexDebug: DebugBusIO = Wire(outer.coreplex.module.io.debug)
val coreplexRtc : Bool = Wire(outer.coreplex.module.io.rtcTick)
2016-10-28 00:34:37 +02:00
io.success := outer.coreplex.module.io.success
outer.coreplex.module.io.rtcTick := coreplexRtc
coreplexRtc := Counter(p(rocketchip.RTCPeriod)).inc()
}
2016-10-29 06:56:11 +02:00
/** Base Top with no Periphery */
class BaseTop[+C <: BaseCoreplex](_coreplex: Parameters => C)(implicit p: Parameters) extends BareTop(_coreplex)
2016-10-29 06:56:11 +02:00
with TopNetwork {
override lazy val module = new BaseTopModule(this, () => new BaseTopBundle(this))
2016-10-29 06:56:11 +02:00
}
class BaseTopBundle[+L <: BaseTop[BaseCoreplex]](_outer: L) extends BareTopBundle(_outer)
2016-10-29 06:56:11 +02:00
with TopNetworkBundle
class BaseTopModule[+L <: BaseTop[BaseCoreplex], +B <: BaseTopBundle[L]](_outer: L, _io: () => B) extends BareTopModule(_outer, _io)
2016-10-29 06:56:11 +02:00
with TopNetworkModule
trait DirectConnection {
2016-10-29 06:56:11 +02:00
this: BareTop[BaseCoreplex] with TopNetwork =>
2016-10-28 00:34:37 +02:00
socBus.node := coreplex.mmio
2016-10-29 06:20:49 +02:00
coreplex.mmioInt := intBus.intnode
2016-10-28 00:34:37 +02:00
}
trait DirectConnectionModule {
2016-10-29 06:56:11 +02:00
this: TopNetworkModule {
val outer: BaseTop[BaseCoreplex]
} =>
2016-10-28 00:34:37 +02:00
2016-10-29 06:20:49 +02:00
coreplexMem <> outer.coreplex.module.io.mem
2016-10-28 00:34:37 +02:00
outer.coreplex.module.io.slave <> coreplexSlave
outer.coreplex.module.io.debug <> coreplexDebug
}