package coreplex import Chisel._ import cde.{Parameters, Field} import junctions._ import uncore.tilelink._ import uncore.util._ import rocket._ trait DirectConnection { val tiles: Seq[Tile] val uncoreTileIOs: Seq[TileIO] val tlBuffering = TileLinkDepths(1,1,2,2,0) val ultBuffering = UncachedTileLinkDepths(1,2) (tiles zip uncoreTileIOs) foreach { case (tile, uncore) => (uncore.cached zip tile.io.cached) foreach { case (u, t) => u <> TileLinkEnqueuer(t, tlBuffering)(t.p) } (uncore.uncached zip tile.io.uncached) foreach { case (u, t) => u <> TileLinkEnqueuer(t, ultBuffering)(t.p) } tile.io.slave.foreach { _ <> TileLinkEnqueuer(uncore.slave.get, 1)(uncore.slave.get.p) } tile.io.interrupts <> uncore.interrupts tile.io.hartid := uncore.hartid tile.io.resetVector := uncore.resetVector } } class DefaultCoreplex(c: CoreplexConfig)(implicit p: Parameters) extends BaseCoreplex(c)(p) { override lazy val module = Module(new DefaultCoreplexModule(c, this, new DefaultCoreplexBundle(c)(p))(p)) } class DefaultCoreplexBundle(c: CoreplexConfig)(implicit p: Parameters) extends BaseCoreplexBundle(c)(p) class DefaultCoreplexModule[+L <: DefaultCoreplex, +B <: DefaultCoreplexBundle]( c: CoreplexConfig, l: L, b: => B)(implicit p: Parameters) extends BaseCoreplexModule(c, l, b)(p) with DirectConnection ///// trait TileClockResetBundle { val c: CoreplexConfig val trcs = Vec(c.nTiles, new Bundle { val clock = Clock(INPUT) val reset = Bool(INPUT) }) } trait AsyncConnection { val io: TileClockResetBundle val tiles: Seq[Tile] val uncoreTileIOs: Seq[TileIO] (tiles, uncoreTileIOs, io.trcs).zipped foreach { case (tile, uncore, trc) => tile.clock := trc.clock tile.reset := trc.reset (uncore.cached zip tile.io.cached) foreach { case (u, t) => u <> AsyncTileLinkFrom(trc.clock, trc.reset, t) } (uncore.uncached zip tile.io.uncached) foreach { case (u, t) => u <> AsyncUTileLinkFrom(trc.clock, trc.reset, t) } tile.io.slave.foreach { _ <> AsyncUTileLinkTo(trc.clock, trc.reset, uncore.slave.get)} val ti = tile.io.interrupts val ui = uncore.interrupts ti.debug := LevelSyncTo(trc.clock, ui.debug) ti.mtip := LevelSyncTo(trc.clock, ui.mtip) ti.msip := LevelSyncTo(trc.clock, ui.msip) ti.meip := LevelSyncTo(trc.clock, ui.meip) ti.seip.foreach { _ := LevelSyncTo(trc.clock, ui.seip.get) } tile.io.hartid := uncore.hartid tile.io.resetVector := uncore.resetVector } } class MultiClockCoreplex(c: CoreplexConfig)(implicit p: Parameters) extends BaseCoreplex(c)(p) { override lazy val module = Module(new MultiClockCoreplexModule(c, this, new MultiClockCoreplexBundle(c)(p))(p)) } class MultiClockCoreplexBundle(c: CoreplexConfig)(implicit p: Parameters) extends BaseCoreplexBundle(c)(p) with TileClockResetBundle class MultiClockCoreplexModule[+L <: MultiClockCoreplex, +B <: MultiClockCoreplexBundle]( c: CoreplexConfig, l: L, b: => B)(implicit p: Parameters) extends BaseCoreplexModule(c, l, b)(p) with AsyncConnection