diplomacy: change API to auto-create node bundles => cross-module refs
This commit is contained in:
@ -66,21 +66,20 @@ abstract class BareTileBundle[+L <: BareTile](_outer: L) extends GenericParamete
|
||||
|
||||
abstract class BareTileModule[+L <: BareTile, +B <: BareTileBundle[L]](_outer: L, _io: () => B) extends LazyModuleImp(_outer) {
|
||||
val outer = _outer
|
||||
val io = _io ()
|
||||
val io = IO(_io ())
|
||||
}
|
||||
|
||||
/** Uses TileLink master port to connect caches and accelerators to the coreplex */
|
||||
trait HasTileLinkMasterPort {
|
||||
implicit val p: Parameters
|
||||
val module: HasTileLinkMasterPortModule
|
||||
val masterNode = TLOutputNode()
|
||||
val masterNode = TLIdentityNode()
|
||||
val tileBus = LazyModule(new TLXbar) // TileBus xbar for cache backends to connect to
|
||||
masterNode := tileBus.node
|
||||
}
|
||||
|
||||
trait HasTileLinkMasterPortBundle {
|
||||
val outer: HasTileLinkMasterPort
|
||||
val master = outer.masterNode.bundleOut
|
||||
}
|
||||
|
||||
trait HasTileLinkMasterPortModule {
|
||||
|
@ -38,7 +38,6 @@ trait HasExternalInterrupts extends HasTileParameters {
|
||||
|
||||
trait HasExternalInterruptsBundle {
|
||||
val outer: HasExternalInterrupts
|
||||
val interrupts = outer.intNode.bundleIn
|
||||
}
|
||||
|
||||
trait HasExternalInterruptsModule {
|
||||
@ -57,6 +56,6 @@ trait HasExternalInterruptsModule {
|
||||
|
||||
val core_ips = core.lip
|
||||
|
||||
(async_ips ++ periph_ips ++ seip ++ core_ips).zip(io.interrupts(0)).foreach { case(c, i) => c := i }
|
||||
(async_ips ++ periph_ips ++ seip ++ core_ips).zip(outer.intNode.in(0)._1).foreach { case(c, i) => c := i }
|
||||
}
|
||||
}
|
||||
|
@ -60,13 +60,11 @@ class RoCCCoreIO(implicit p: Parameters) extends CoreBundle()(p) {
|
||||
abstract class LazyRoCC(implicit p: Parameters) extends LazyModule {
|
||||
val module: LazyRoCCModule
|
||||
|
||||
val atlNode: TLMixedNode = TLOutputNode()
|
||||
val tlNode: TLMixedNode = TLOutputNode()
|
||||
val atlNode: TLMixedNode = TLIdentityNode()
|
||||
val tlNode: TLMixedNode = TLIdentityNode()
|
||||
}
|
||||
|
||||
class RoCCIO(outer: LazyRoCC)(implicit p: Parameters) extends RoCCCoreIO()(p) {
|
||||
val atl = outer.atlNode.bundleOut
|
||||
val tl = outer.tlNode.bundleOut
|
||||
// Should be handled differently, eventually
|
||||
val ptw = Vec(p(RoccNPTWPorts), new TLBPTWIO)
|
||||
val fpu_req = Decoupled(new FPInput)
|
||||
@ -74,7 +72,7 @@ class RoCCIO(outer: LazyRoCC)(implicit p: Parameters) extends RoCCCoreIO()(p) {
|
||||
}
|
||||
|
||||
class LazyRoCCModule(outer: LazyRoCC) extends LazyModuleImp(outer) {
|
||||
val io = new RoCCIO(outer)
|
||||
val io = IO(new RoCCIO(outer))
|
||||
}
|
||||
|
||||
/** Mixins for including RoCC **/
|
||||
@ -263,7 +261,7 @@ class TranslatorExampleModule(outer: TranslatorExample)(implicit p: Parameters)
|
||||
|
||||
class CharacterCountExample(implicit p: Parameters) extends LazyRoCC {
|
||||
override lazy val module = new CharacterCountExampleModule(this)
|
||||
override val atlNode = TLClientNode(TLClientParameters("CharacterCountRoCC"))
|
||||
override val atlNode = TLClientNode(Seq(TLClientPortParameters(Seq(TLClientParameters("CharacterCountRoCC")))))
|
||||
}
|
||||
|
||||
class CharacterCountExampleModule(outer: CharacterCountExample)(implicit p: Parameters) extends LazyRoCCModule(outer)
|
||||
@ -286,7 +284,7 @@ class CharacterCountExampleModule(outer: CharacterCountExample)(implicit p: Para
|
||||
val s_idle :: s_acq :: s_gnt :: s_check :: s_resp :: Nil = Enum(Bits(), 5)
|
||||
val state = Reg(init = s_idle)
|
||||
|
||||
val tl_out = io.atl.head
|
||||
val (tl_out, edgesOut) = outer.atlNode.out(0)
|
||||
val gnt = tl_out.d.bits
|
||||
val recv_data = Reg(UInt(width = cacheDataBits))
|
||||
val recv_beat = Reg(UInt(width = log2Up(cacheDataBeats+1)), init = UInt(0))
|
||||
@ -309,7 +307,7 @@ class CharacterCountExampleModule(outer: CharacterCountExample)(implicit p: Para
|
||||
io.resp.bits.rd := resp_rd
|
||||
io.resp.bits.data := count
|
||||
tl_out.a.valid := (state === s_acq)
|
||||
tl_out.a.bits := outer.atlNode.edgesOut(0).Get(
|
||||
tl_out.a.bits := edgesOut.Get(
|
||||
fromSource = UInt(0),
|
||||
toAddress = addr_block << blockOffset,
|
||||
lgSize = UInt(lgCacheBlockBytes))._2
|
||||
|
@ -82,7 +82,7 @@ class RocketTile(val rocketParams: RocketTileParams, val hartid: Int)(implicit p
|
||||
}))
|
||||
|
||||
// Find all the caches
|
||||
val outer = masterNode.edgesOut
|
||||
val outer = masterNode.out.map(_._2)
|
||||
.flatMap(_.manager.managers)
|
||||
.filter(_.supportsAcquireB)
|
||||
.flatMap(_.resources.headOption)
|
||||
@ -115,7 +115,7 @@ class RocketTile(val rocketParams: RocketTileParams, val hartid: Int)(implicit p
|
||||
Resource(cpuDevice, "reg").bind(ResourceInt(BigInt(hartid)))
|
||||
Resource(intcDevice, "reg").bind(ResourceInt(BigInt(hartid)))
|
||||
|
||||
intNode.edgesIn.flatMap(_.source.sources).map { case s =>
|
||||
intNode.in.flatMap(_._2.source.sources).map { case s =>
|
||||
for (i <- s.range.start until s.range.end) {
|
||||
csrIntMap.lift(i).foreach { j =>
|
||||
s.resources.foreach { r =>
|
||||
@ -181,12 +181,12 @@ class RocketTileModule(outer: RocketTile) extends BaseTileModule(outer, () => ne
|
||||
|
||||
abstract class RocketTileWrapper(rtp: RocketTileParams, hartid: Int)(implicit p: Parameters) extends LazyModule {
|
||||
val rocket = LazyModule(new RocketTile(rtp, hartid))
|
||||
val masterNode: OutputNode[_,_,_,_,_]
|
||||
val slaveNode: InputNode[_,_,_,_,_]
|
||||
val intOutputNode = rocket.intOutputNode.map(dummy => IntOutputNode())
|
||||
val asyncIntNode = IntInputNode()
|
||||
val periphIntNode = IntInputNode()
|
||||
val coreIntNode = IntInputNode()
|
||||
val masterNode: IdentityNode[_,_,_,_,_]
|
||||
val slaveNode: IdentityNode[_,_,_,_,_]
|
||||
val asyncIntNode = IntIdentityNode()
|
||||
val periphIntNode = IntIdentityNode()
|
||||
val coreIntNode = IntIdentityNode()
|
||||
val intOutputNode = rocket.intOutputNode.map(dummy => IntIdentityNode())
|
||||
val intXbar = LazyModule(new IntXbar)
|
||||
|
||||
rocket.intNode := intXbar.intnode
|
||||
@ -220,18 +220,12 @@ abstract class RocketTileWrapper(rtp: RocketTileParams, hartid: Int)(implicit p:
|
||||
}
|
||||
|
||||
lazy val module = new LazyModuleImp(this) {
|
||||
val io = new CoreBundle
|
||||
val io = IO(new CoreBundle
|
||||
with HasExternallyDrivenTileConstants
|
||||
with CanHaveInstructionTracePort
|
||||
with CanHaltAndCatchFire {
|
||||
val master = masterNode.bundleOut
|
||||
val slave = slaveNode.bundleIn
|
||||
val outputInterrupts = intOutputNode.map(_.bundleOut)
|
||||
val asyncInterrupts = asyncIntNode.bundleIn
|
||||
val periphInterrupts = periphIntNode.bundleIn
|
||||
val coreInterrupts = coreIntNode.bundleIn
|
||||
val halt_and_catch_fire = rocket.module.io.halt_and_catch_fire.map(_.cloneType)
|
||||
}
|
||||
})
|
||||
// signals that do not change based on crossing type:
|
||||
rocket.module.io.hartid := io.hartid
|
||||
rocket.module.io.reset_vector := io.reset_vector
|
||||
@ -241,10 +235,10 @@ abstract class RocketTileWrapper(rtp: RocketTileParams, hartid: Int)(implicit p:
|
||||
}
|
||||
|
||||
class SyncRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Parameters) extends RocketTileWrapper(rtp, hartid) {
|
||||
val masterNode = TLOutputNode()
|
||||
val masterNode = TLIdentityNode()
|
||||
masterNode :=* optionalMasterBuffer(rocket.masterNode)
|
||||
|
||||
val slaveNode = new TLInputNode()(ValName("slave")) { override def reverse = true }
|
||||
val slaveNode = new TLIdentityNode() { override def reverse = true }
|
||||
DisableMonitors { implicit p => rocket.slaveNode :*= optionalSlaveBuffer(slaveNode) }
|
||||
|
||||
// Fully async interrupts need synchronizers.
|
||||
@ -260,12 +254,12 @@ class SyncRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Parameters)
|
||||
}
|
||||
|
||||
class AsyncRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Parameters) extends RocketTileWrapper(rtp, hartid) {
|
||||
val masterNode = TLAsyncOutputNode()
|
||||
val masterNode = TLAsyncIdentityNode()
|
||||
val source = LazyModule(new TLAsyncCrossingSource)
|
||||
source.node :=* rocket.masterNode
|
||||
masterNode :=* source.node
|
||||
|
||||
val slaveNode = new TLAsyncInputNode()(ValName("slave")) { override def reverse = true }
|
||||
val slaveNode = new TLAsyncIdentityNode() { override def reverse = true }
|
||||
val sink = LazyModule(new TLAsyncCrossingSink)
|
||||
|
||||
DisableMonitors { implicit p =>
|
||||
@ -289,12 +283,12 @@ class AsyncRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Parameters
|
||||
}
|
||||
|
||||
class RationalRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Parameters) extends RocketTileWrapper(rtp, hartid) {
|
||||
val masterNode = TLRationalOutputNode()
|
||||
val masterNode = TLRationalIdentityNode()
|
||||
val source = LazyModule(new TLRationalCrossingSource)
|
||||
source.node :=* optionalMasterBuffer(rocket.masterNode)
|
||||
masterNode :=* source.node
|
||||
|
||||
val slaveNode = new TLRationalInputNode()(ValName("slave")) { override def reverse = true }
|
||||
val slaveNode = new TLRationalIdentityNode() { override def reverse = true }
|
||||
val sink = LazyModule(new TLRationalCrossingSink(SlowToFast))
|
||||
|
||||
DisableMonitors { implicit p =>
|
||||
|
Reference in New Issue
Block a user