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