tile: supply hartid from RocketTileParams
make WithNCores partial configs override rather than append more tiles
This commit is contained in:
		@@ -45,7 +45,7 @@ class WithNBigCores(n: Int) extends Config((site, here, up) => {
 | 
			
		||||
      icache = Some(ICacheParams(
 | 
			
		||||
        rowBits = site(SystemBusKey).beatBits,
 | 
			
		||||
        blockBytes = site(CacheBlockBytes))))
 | 
			
		||||
    List.fill(n)(big) ++ up(RocketTilesKey, site)
 | 
			
		||||
    List.tabulate(n)(i => big.copy(hartid = i))
 | 
			
		||||
  }
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
@@ -67,7 +67,7 @@ class WithNSmallCores(n: Int) extends Config((site, here, up) => {
 | 
			
		||||
        nWays = 1,
 | 
			
		||||
        nTLBEntries = 4,
 | 
			
		||||
        blockBytes = site(CacheBlockBytes))))
 | 
			
		||||
    List.fill(n)(small) ++ up(RocketTilesKey, site)
 | 
			
		||||
    List.tabulate(n)(i => small.copy(hartid = i))
 | 
			
		||||
  }
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
@@ -94,7 +94,7 @@ class WithNTinyCores(n: Int) extends Config((site, here, up) => {
 | 
			
		||||
          nWays = 1,
 | 
			
		||||
          nTLBEntries = 4,
 | 
			
		||||
          blockBytes = site(CacheBlockBytes))))
 | 
			
		||||
    List.fill(n)(tiny) ++ up(RocketTilesKey, site)
 | 
			
		||||
    List.tabulate(n)(i => tiny.copy(hartid = i))
 | 
			
		||||
  }
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ trait HasRocketTiles extends HasSystemBus
 | 
			
		||||
  private val crossing = p(RocketCrossing)
 | 
			
		||||
  private val tileParams = p(RocketTilesKey)
 | 
			
		||||
  val nRocketTiles = tileParams.size
 | 
			
		||||
  val hartIdList = tileParams.map(_.hartid)
 | 
			
		||||
 | 
			
		||||
  // Handle interrupts to be routed directly into each tile
 | 
			
		||||
  // TODO: figure out how to merge the localIntNodes and coreIntXbar below
 | 
			
		||||
@@ -34,8 +35,8 @@ trait HasRocketTiles extends HasSystemBus
 | 
			
		||||
 | 
			
		||||
  // Make a wrapper for each tile that will wire it to coreplex devices and crossbars,
 | 
			
		||||
  // according to the specified type of clock crossing.
 | 
			
		||||
  val wiringTuple = localIntNodes.zip(tileParams).zipWithIndex
 | 
			
		||||
  val rocket_tiles: Seq[RocketTileWrapper] = wiringTuple.map { case ((lip, tp), i) =>
 | 
			
		||||
  val wiringTuple = localIntNodes.zip(tileParams)
 | 
			
		||||
  val rocket_tiles: Seq[RocketTileWrapper] = wiringTuple.map { case (lip, tp) =>
 | 
			
		||||
    val pWithExtra = p.alterPartial {
 | 
			
		||||
      case TileKey => tp
 | 
			
		||||
      case BuildRoCC => tp.rocc
 | 
			
		||||
@@ -44,19 +45,19 @@ trait HasRocketTiles extends HasSystemBus
 | 
			
		||||
 | 
			
		||||
    val wrapper = crossing match {
 | 
			
		||||
      case SynchronousCrossing(params) => {
 | 
			
		||||
        val wrapper = LazyModule(new SyncRocketTile(tp, i)(pWithExtra))
 | 
			
		||||
        val wrapper = LazyModule(new SyncRocketTile(tp)(pWithExtra))
 | 
			
		||||
        sbus.fromSyncTiles(params, tp.externalMasterBuffers, tp.name) :=* wrapper.masterNode
 | 
			
		||||
        FlipRendering { implicit p => wrapper.slaveNode :*= pbus.toSyncSlaves(tp.name, tp.externalSlaveBuffers) }
 | 
			
		||||
        wrapper
 | 
			
		||||
      }
 | 
			
		||||
      case AsynchronousCrossing(depth, sync) => {
 | 
			
		||||
        val wrapper = LazyModule(new AsyncRocketTile(tp, i)(pWithExtra))
 | 
			
		||||
        val wrapper = LazyModule(new AsyncRocketTile(tp)(pWithExtra))
 | 
			
		||||
        sbus.fromAsyncTiles(depth, sync, tp.externalMasterBuffers, tp.name) :=* wrapper.masterNode
 | 
			
		||||
        FlipRendering { implicit p => wrapper.slaveNode :*= pbus.toAsyncSlaves(sync, tp.name, tp.externalSlaveBuffers) }
 | 
			
		||||
        wrapper
 | 
			
		||||
      }
 | 
			
		||||
      case RationalCrossing(direction) => {
 | 
			
		||||
        val wrapper = LazyModule(new RationalRocketTile(tp, i)(pWithExtra))
 | 
			
		||||
        val wrapper = LazyModule(new RationalRocketTile(tp)(pWithExtra))
 | 
			
		||||
        sbus.fromRationalTiles(direction, tp.externalMasterBuffers, tp.name) :=* wrapper.masterNode
 | 
			
		||||
        FlipRendering { implicit p => wrapper.slaveNode :*= pbus.toRationalSlaves(tp.name, tp.externalSlaveBuffers) }
 | 
			
		||||
        wrapper
 | 
			
		||||
@@ -127,7 +128,7 @@ trait HasRocketTilesModuleImp extends LazyModuleImp
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Default values for tile inputs; may be overriden in other traits
 | 
			
		||||
  rocket_tile_inputs.zipWithIndex.foreach { case(wire, i) =>
 | 
			
		||||
  rocket_tile_inputs.zip(outer.hartIdList).foreach { case(wire, i) =>
 | 
			
		||||
    wire.clock := clock
 | 
			
		||||
    wire.reset := reset
 | 
			
		||||
    wire.hartid := UInt(i)
 | 
			
		||||
 
 | 
			
		||||
@@ -63,9 +63,6 @@ class EightChannelConfig extends Config(new WithNMemoryChannels(8) ++ new BaseCo
 | 
			
		||||
class DualCoreConfig extends Config(
 | 
			
		||||
  new WithNBigCores(2) ++ new BaseConfig)
 | 
			
		||||
 | 
			
		||||
class HeterogeneousDualCoreConfig extends Config(
 | 
			
		||||
  new WithNSmallCores(1) ++ new WithNBigCores(1) ++ new BaseConfig)
 | 
			
		||||
 | 
			
		||||
class TinyConfig extends Config(
 | 
			
		||||
  new WithNMemoryChannels(0) ++
 | 
			
		||||
  new WithStatelessBridge ++
 | 
			
		||||
 
 | 
			
		||||
@@ -22,13 +22,14 @@ case class RocketTileParams(
 | 
			
		||||
    trace: Boolean = false,
 | 
			
		||||
    hcfOnUncorrectable: Boolean = false,
 | 
			
		||||
    name: Option[String] = Some("tile"),
 | 
			
		||||
    hartid: Int = 0,
 | 
			
		||||
    externalMasterBuffers: Int = 0,
 | 
			
		||||
    externalSlaveBuffers: Int = 0) extends TileParams {
 | 
			
		||||
  require(icache.isDefined)
 | 
			
		||||
  require(dcache.isDefined)
 | 
			
		||||
}
 | 
			
		||||
  
 | 
			
		||||
class RocketTile(val rocketParams: RocketTileParams, val hartid: Int)(implicit p: Parameters) extends BaseTile(rocketParams)(p)
 | 
			
		||||
class RocketTile(val rocketParams: RocketTileParams)(implicit p: Parameters) extends BaseTile(rocketParams)(p)
 | 
			
		||||
    with HasExternalInterrupts
 | 
			
		||||
    with HasLazyRoCC  // implies CanHaveSharedFPU with CanHavePTW with HasHellaCache
 | 
			
		||||
    with CanHaveScratchpad { // implies CanHavePTW with HasHellaCache with HasICacheFrontend
 | 
			
		||||
@@ -39,6 +40,7 @@ class RocketTile(val rocketParams: RocketTileParams, val hartid: Int)(implicit p
 | 
			
		||||
  private def ofStr(x: String) = Seq(ResourceString(x))
 | 
			
		||||
  private def ofRef(x: Device) = Seq(ResourceReference(x.label))
 | 
			
		||||
 | 
			
		||||
  val hartid = rocketParams.hartid
 | 
			
		||||
  val cpuDevice = new Device {
 | 
			
		||||
    def describe(resources: ResourceBindings): Description = {
 | 
			
		||||
      val block =  p(CacheBlockBytes)
 | 
			
		||||
@@ -179,8 +181,8 @@ class RocketTileModule(outer: RocketTile) extends BaseTileModule(outer, () => ne
 | 
			
		||||
  ptw.io.requestor <> ptwPorts
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
abstract class RocketTileWrapper(rtp: RocketTileParams, hartid: Int)(implicit p: Parameters) extends LazyModule {
 | 
			
		||||
  val rocket = LazyModule(new RocketTile(rtp, hartid))
 | 
			
		||||
abstract class RocketTileWrapper(rtp: RocketTileParams)(implicit p: Parameters) extends LazyModule {
 | 
			
		||||
  val rocket = LazyModule(new RocketTile(rtp))
 | 
			
		||||
  val asyncIntNode   : IntInwardNode
 | 
			
		||||
  val periphIntNode  : IntInwardNode
 | 
			
		||||
  val coreIntNode    : IntInwardNode
 | 
			
		||||
@@ -226,7 +228,7 @@ abstract class RocketTileWrapper(rtp: RocketTileParams, hartid: Int)(implicit p:
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class SyncRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Parameters) extends RocketTileWrapper(rtp, hartid) {
 | 
			
		||||
class SyncRocketTile(rtp: RocketTileParams)(implicit p: Parameters) extends RocketTileWrapper(rtp) {
 | 
			
		||||
  val masterNode = optionalMasterBuffer(rocket.masterNode)
 | 
			
		||||
  val slaveNode = optionalSlaveBuffer(rocket.slaveNode)
 | 
			
		||||
 | 
			
		||||
@@ -246,7 +248,7 @@ class SyncRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Parameters)
 | 
			
		||||
  def outputInterruptXingLatency = 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class AsyncRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Parameters) extends RocketTileWrapper(rtp, hartid) {
 | 
			
		||||
class AsyncRocketTile(rtp: RocketTileParams)(implicit p: Parameters) extends RocketTileWrapper(rtp) {
 | 
			
		||||
  val source = LazyModule(new TLAsyncCrossingSource)
 | 
			
		||||
  source.node :=* rocket.masterNode
 | 
			
		||||
  val masterNode = source.node
 | 
			
		||||
@@ -272,7 +274,7 @@ class AsyncRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Parameters
 | 
			
		||||
  def outputInterruptXingLatency = 3
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class RationalRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Parameters) extends RocketTileWrapper(rtp, hartid) {
 | 
			
		||||
class RationalRocketTile(rtp: RocketTileParams)(implicit p: Parameters) extends RocketTileWrapper(rtp) {
 | 
			
		||||
  val source = LazyModule(new TLRationalCrossingSource)
 | 
			
		||||
  source.node :=* optionalMasterBuffer(rocket.masterNode)
 | 
			
		||||
  val masterNode = source.node
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user