2016-09-08 11:08:57 +02:00
|
|
|
// See LICENSE for license details.
|
|
|
|
|
|
|
|
package rocketchip
|
|
|
|
|
|
|
|
import Chisel._
|
2016-09-11 08:39:29 +02:00
|
|
|
import cde.{Parameters, Field}
|
2016-09-08 11:08:57 +02:00
|
|
|
import junctions._
|
2016-10-04 00:17:36 +02:00
|
|
|
import diplomacy._
|
2016-09-08 11:08:57 +02:00
|
|
|
import uncore.tilelink._
|
2016-09-15 03:09:27 +02:00
|
|
|
import uncore.tilelink2._
|
2016-09-11 08:39:29 +02:00
|
|
|
import uncore.devices._
|
2016-09-28 06:27:07 +02:00
|
|
|
import util._
|
2016-09-11 08:39:29 +02:00
|
|
|
import rocket._
|
2016-09-08 11:08:57 +02:00
|
|
|
import coreplex._
|
|
|
|
|
2016-09-11 08:39:29 +02:00
|
|
|
// the following parameters will be refactored properly with TL2
|
2016-09-15 09:38:46 +02:00
|
|
|
case object GlobalAddrMap extends Field[AddrMap]
|
2016-10-09 21:34:10 +02:00
|
|
|
/** Enable or disable monitoring of Diplomatic buses */
|
2016-11-18 21:02:33 +01:00
|
|
|
case object TLEmitMonitors extends Field[Boolean]
|
2016-09-08 11:08:57 +02:00
|
|
|
|
2016-11-16 03:27:52 +01:00
|
|
|
abstract class BareTop[+C <: BaseCoreplex](_coreplex: Parameters => C)(implicit val p: 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
|
2016-11-16 03:27:52 +01:00
|
|
|
lazy val legacyAddrMap = GenerateGlobalAddrMap(p, coreplex.l1tol2.node.edgesIn(0).manager.managers)
|
|
|
|
val coreplex : C = LazyModule(_coreplex(p.alterPartial {
|
2016-10-29 06:56:11 +02:00
|
|
|
case GlobalAddrMap => legacyAddrMap
|
|
|
|
}))
|
|
|
|
|
|
|
|
TopModule.contents = Some(this)
|
|
|
|
}
|
2016-09-15 09:38:46 +02:00
|
|
|
|
2016-10-29 12:30:49 +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-11-16 03:27:52 +01:00
|
|
|
val module: TopNetworkModule
|
|
|
|
|
2016-10-29 06:56:11 +02:00
|
|
|
TLImp.emitMonitors = p(TLEmitMonitors)
|
2016-10-09 21:34:10 +02:00
|
|
|
|
2016-10-25 08:56:09 +02:00
|
|
|
// Add a SoC and peripheral bus
|
|
|
|
val socBus = LazyModule(new TLXbar)
|
2016-09-17 02:27:49 +02:00
|
|
|
val peripheryBus = LazyModule(new TLXbar)
|
2016-10-29 06:20:49 +02:00
|
|
|
val intBus = LazyModule(new IntXbar)
|
2016-09-17 02:27:49 +02:00
|
|
|
|
2016-09-24 00:25:58 +02:00
|
|
|
peripheryBus.node :=
|
2016-11-17 23:07:53 +01:00
|
|
|
TLWidthWidget(socBusConfig.beatBytes)(
|
|
|
|
TLAtomicAutomata(arithmetic = peripheryBusArithmetic)(
|
2016-10-29 00:05:49 +02:00
|
|
|
socBus.node))
|
2016-11-04 05:31:26 +01:00
|
|
|
|
|
|
|
var coreplexMem = Seq[TLOutwardNode]()
|
2016-09-11 08:39:29 +02:00
|
|
|
}
|
2016-09-08 11:08:57 +02:00
|
|
|
|
2016-10-29 07:30:13 +02:00
|
|
|
trait TopNetworkBundle extends HasPeripheryParameters {
|
2016-11-16 03:27:52 +01:00
|
|
|
val outer: TopNetwork
|
|
|
|
implicit val p = outer.p
|
2016-09-08 11:08:57 +02:00
|
|
|
}
|
|
|
|
|
2016-10-29 07:30:13 +02:00
|
|
|
trait TopNetworkModule extends HasPeripheryParameters {
|
2016-11-16 03:27:52 +01:00
|
|
|
val io: TopNetworkBundle
|
|
|
|
val outer: TopNetwork
|
2016-10-27 07:28:40 +02:00
|
|
|
implicit val p = outer.p
|
2016-09-08 11:08:57 +02:00
|
|
|
}
|
2016-09-27 20:55:32 +02:00
|
|
|
|
2016-10-29 06:56:11 +02:00
|
|
|
/** Base Top with no Periphery */
|
2016-10-29 12:30:49 +02:00
|
|
|
class BaseTop[+C <: BaseCoreplex](_coreplex: Parameters => C)(implicit p: Parameters) extends BareTop(_coreplex)
|
2016-10-29 06:56:11 +02:00
|
|
|
with TopNetwork {
|
2016-10-29 12:30:49 +02:00
|
|
|
override lazy val module = new BaseTopModule(this, () => new BaseTopBundle(this))
|
2016-10-29 06:56:11 +02:00
|
|
|
}
|
|
|
|
|
2016-10-29 12:30:49 +02:00
|
|
|
class BaseTopBundle[+L <: BaseTop[BaseCoreplex]](_outer: L) extends BareTopBundle(_outer)
|
2016-10-29 06:56:11 +02:00
|
|
|
with TopNetworkBundle
|
|
|
|
|
2016-10-29 12:30:49 +02:00
|
|
|
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
|
|
|
|
|
2016-11-16 03:27:52 +01:00
|
|
|
trait DirectConnection extends TopNetwork {
|
|
|
|
val coreplex: BaseCoreplex
|
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-11-04 05:31:26 +01:00
|
|
|
|
|
|
|
coreplexMem = coreplex.mem
|
2016-10-28 00:34:37 +02:00
|
|
|
}
|