Add RadianceCluster
This commit is contained in:
@@ -76,6 +76,25 @@ class WithFuzzerCores(
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
class WithRadianceCluster(
|
||||||
|
clusterId: Int,
|
||||||
|
location: HierarchicalLocation = InSubsystem,
|
||||||
|
crossing: RocketCrossingParams = RocketCrossingParams() // TODO make this not rocket
|
||||||
|
) extends Config((site, here, up) => {
|
||||||
|
case ClustersLocated(`location`) => up(ClustersLocated(location)) :+ RadianceClusterAttachParams(
|
||||||
|
RadianceClusterParams(clusterId = clusterId),
|
||||||
|
crossing)
|
||||||
|
case TLNetworkTopologyLocated(InCluster(`clusterId`)) => List(
|
||||||
|
ClusterBusTopologyParams(
|
||||||
|
clusterId = clusterId,
|
||||||
|
csbus = site(SystemBusKey),
|
||||||
|
ccbus = site(ControlBusKey).copy(errorDevice = None),
|
||||||
|
coherence = site(ClusterBankedCoherenceKey(clusterId))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
case PossibleTileLocations => up(PossibleTileLocations) :+ InCluster(clusterId)
|
||||||
|
})
|
||||||
|
|
||||||
// `nSrcIds`: number of source IDs for dmem requests on each SIMT lane
|
// `nSrcIds`: number of source IDs for dmem requests on each SIMT lane
|
||||||
class WithSimtConfig(nWarps: Int = 4, nCoreLanes: Int = 4, nMemLanes: Int = 4, nSrcIds: Int = 8)
|
class WithSimtConfig(nWarps: Int = 4, nCoreLanes: Int = 4, nMemLanes: Int = 4, nSrcIds: Int = 8)
|
||||||
extends Config((site, _, up) => {
|
extends Config((site, _, up) => {
|
||||||
|
|||||||
@@ -9,3 +9,10 @@ case class RadianceTileAttachParams(
|
|||||||
tileParams: RadianceTileParams,
|
tileParams: RadianceTileParams,
|
||||||
crossingParams: RocketCrossingParams
|
crossingParams: RocketCrossingParams
|
||||||
) extends CanAttachTile { type TileType = RadianceTile }
|
) extends CanAttachTile { type TileType = RadianceTile }
|
||||||
|
|
||||||
|
case class RadianceClusterAttachParams (
|
||||||
|
clusterParams: RadianceClusterParams,
|
||||||
|
crossingParams: HierarchicalElementCrossingParamsLike
|
||||||
|
) extends CanAttachCluster {
|
||||||
|
type ClusterType = RadianceCluster
|
||||||
|
}
|
||||||
|
|||||||
59
src/main/scala/radiance/tile/RadianceCluster.scala
Normal file
59
src/main/scala/radiance/tile/RadianceCluster.scala
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
// See LICENSE.SiFive for license details.
|
||||||
|
// See LICENSE.Berkeley for license details.
|
||||||
|
|
||||||
|
package radiance.tile
|
||||||
|
|
||||||
|
import chisel3._
|
||||||
|
import chisel3.util._
|
||||||
|
|
||||||
|
import org.chipsalliance.cde.config.{Field, Parameters}
|
||||||
|
import freechips.rocketchip.subsystem._
|
||||||
|
import freechips.rocketchip.tilelink._
|
||||||
|
import freechips.rocketchip.diplomacy.{LazyModule, AddressSet, ClockCrossingType}
|
||||||
|
import freechips.rocketchip.prci.ClockSinkParameters
|
||||||
|
|
||||||
|
case class RadianceClusterParams(
|
||||||
|
val clusterId: Int,
|
||||||
|
val clockSinkParams: ClockSinkParameters = ClockSinkParameters()
|
||||||
|
) extends InstantiableClusterParams[RadianceCluster] {
|
||||||
|
val baseName = "radiance_cluster"
|
||||||
|
val uniqueName = s"${baseName}_$clusterId"
|
||||||
|
def instantiate(crossing: HierarchicalElementCrossingParamsLike, lookup: LookupByClusterIdImpl)(implicit p: Parameters): RadianceCluster = {
|
||||||
|
new RadianceCluster(this, crossing.crossingType, lookup)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class RadianceCluster (
|
||||||
|
thisClusterParams: RadianceClusterParams,
|
||||||
|
crossing: ClockCrossingType,
|
||||||
|
lookup: LookupByClusterIdImpl
|
||||||
|
)(implicit p: Parameters) extends Cluster(thisClusterParams, crossing, lookup) {
|
||||||
|
// cluster-local bus, used for shared memory traffic that never leaves the
|
||||||
|
// confines of a cluster
|
||||||
|
val clbus = tlBusWrapperLocationMap(CLBUS(clusterId))
|
||||||
|
|
||||||
|
clbus.clockGroupNode := allClockGroupsNode
|
||||||
|
|
||||||
|
val numLsuLanes = 4
|
||||||
|
val wordSize = 4
|
||||||
|
val smemBanks = Seq.tabulate(numLsuLanes) { bankId =>
|
||||||
|
// Banked-by-word (4 bytes)
|
||||||
|
// base for bank 1: ff...000000|01|00
|
||||||
|
// mask for bank 1; 00...111111|00|11
|
||||||
|
// val base = 0xff000000L | (bankId * 4 /*wordSize*/ )
|
||||||
|
// val mask = 0x00001fffL ^ ((numLsuLanes - 1) * 4 /*wordSize*/ )
|
||||||
|
val base = 0xff000000L | (bankId * wordSize)
|
||||||
|
val mask = 0x00ffffffL ^ ((numLsuLanes - 1) * wordSize)
|
||||||
|
LazyModule(new TLRAM(AddressSet(base, mask), beatBytes = wordSize))
|
||||||
|
}
|
||||||
|
smemBanks.foreach(_.node := clbus.outwardNode)
|
||||||
|
|
||||||
|
println(s"===== Cluster: nTotalTiles = ${nTotalTiles}")
|
||||||
|
println(s"===== Cluster: nLeafTiles = ${nLeafTiles}")
|
||||||
|
|
||||||
|
leafTiles.map { case (id, tile: RadianceTile) =>
|
||||||
|
println(s"======= RadianceCluster: connecting cluster ${id} to clbus")
|
||||||
|
clbus.inwardNode :=* tile.smemXbar.node
|
||||||
|
// clbus.inwardNode :=* tile.smemNodes(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user