129 lines
4.5 KiB
Scala
129 lines
4.5 KiB
Scala
package tracegen
|
|
|
|
import chisel3._
|
|
import chisel3.util.log2Ceil
|
|
import freechips.rocketchip.config.{Config, Parameters}
|
|
import freechips.rocketchip.groundtest.{TraceGenParams, TraceGenTileAttachParams}
|
|
import freechips.rocketchip.subsystem._
|
|
import freechips.rocketchip.system.BaseConfig
|
|
import freechips.rocketchip.rocket.DCacheParams
|
|
import freechips.rocketchip.tile.{MaxHartIdBits, XLen}
|
|
import scala.math.{max, min}
|
|
|
|
class WithTraceGen(
|
|
n: Int = 2,
|
|
overrideIdOffset: Option[Int] = None,
|
|
overrideMemOffset: Option[BigInt] = None)(
|
|
params: Seq[DCacheParams] = List.fill(n){ DCacheParams(nSets = 16, nWays = 1) },
|
|
nReqs: Int = 8192
|
|
) extends Config((site, here, up) => {
|
|
case TilesLocated(InSubsystem) => {
|
|
val prev = up(TilesLocated(InSubsystem), site)
|
|
val idOffset = overrideIdOffset.getOrElse(prev.size)
|
|
val memOffset: BigInt = overrideMemOffset.orElse(site(ExtMem).map(_.master.base)).getOrElse(0x0L)
|
|
params.zipWithIndex.map { case (dcp, i) =>
|
|
TraceGenTileAttachParams(
|
|
tileParams = TraceGenParams(
|
|
hartId = i + idOffset,
|
|
dcache = Some(dcp),
|
|
wordBits = site(XLen),
|
|
addrBits = 48,
|
|
addrBag = {
|
|
val nSets = dcp.nSets
|
|
val nWays = dcp.nWays
|
|
val blockOffset = site(SystemBusKey).blockOffset
|
|
val nBeats = min(2, site(SystemBusKey).blockBeats)
|
|
val beatBytes = site(SystemBusKey).beatBytes
|
|
List.tabulate(2 * nWays) { i =>
|
|
Seq.tabulate(nBeats) { j =>
|
|
BigInt((j * beatBytes) + ((i * nSets) << blockOffset))
|
|
}
|
|
}.flatten
|
|
},
|
|
maxRequests = nReqs,
|
|
memStart = memOffset,
|
|
numGens = params.size),
|
|
crossingParams = RocketCrossingParams()
|
|
)
|
|
} ++ prev
|
|
}
|
|
})
|
|
|
|
class WithBoomTraceGen(
|
|
n: Int = 2,
|
|
overrideIdOffset: Option[Int] = None,
|
|
overrideMemOffset: Option[BigInt] = None)(
|
|
params: Seq[DCacheParams] = List.fill(n){ DCacheParams(nMSHRs = 4, nSets = 16, nWays = 2) },
|
|
nReqs: Int = 8192
|
|
) extends Config((site, here, up) => {
|
|
case TilesLocated(InSubsystem) => {
|
|
val prev = up(TilesLocated(InSubsystem), site)
|
|
val idOffset = overrideIdOffset.getOrElse(prev.size)
|
|
val memOffset: BigInt = overrideMemOffset.orElse(site(ExtMem).map(_.master.base)).getOrElse(0x0L)
|
|
params.zipWithIndex.map { case (dcp, i) =>
|
|
BoomTraceGenTileAttachParams(
|
|
tileParams = BoomTraceGenParams(
|
|
hartId = i + idOffset,
|
|
dcache = Some(dcp),
|
|
wordBits = site(XLen),
|
|
addrBits = 48,
|
|
addrBag = {
|
|
val nSets = dcp.nSets
|
|
val nWays = dcp.nWays
|
|
val blockOffset = site(SystemBusKey).blockOffset
|
|
val nBeats = site(SystemBusKey).blockBeats
|
|
List.tabulate(nWays) { i =>
|
|
Seq.tabulate(nBeats) { j => BigInt((j * 8) + ((i * nSets) << blockOffset)) }
|
|
}.flatten
|
|
},
|
|
maxRequests = nReqs,
|
|
memStart = memOffset,
|
|
numGens = params.size),
|
|
crossingParams = RocketCrossingParams()
|
|
)
|
|
} ++ prev
|
|
}
|
|
})
|
|
|
|
class WithL2TraceGen(
|
|
n: Int = 2,
|
|
overrideIdOffset: Option[Int] = None,
|
|
overrideMemOffset: Option[BigInt] = None)(
|
|
params: Seq[DCacheParams] = List.fill(n){ DCacheParams(nSets = 16, nWays = 1) },
|
|
nReqs: Int = 8192
|
|
) extends Config((site, here, up) => {
|
|
case TilesLocated(InSubsystem) => {
|
|
val prev = up(TilesLocated(InSubsystem), site)
|
|
val idOffset = overrideIdOffset.getOrElse(prev.size)
|
|
val memOffset: BigInt = overrideMemOffset.orElse(site(ExtMem).map(_.master.base)).getOrElse(0x0L)
|
|
|
|
params.zipWithIndex.map { case (dcp, i) =>
|
|
TraceGenTileAttachParams(
|
|
tileParams = TraceGenParams(
|
|
hartId = i + idOffset,
|
|
dcache = Some(dcp),
|
|
wordBits = site(XLen),
|
|
addrBits = 48,
|
|
addrBag = {
|
|
val sbp = site(SystemBusKey)
|
|
val l2p = site(InclusiveCacheKey)
|
|
val nSets = max(l2p.sets, dcp.nSets)
|
|
val nWays = max(l2p.ways, dcp.nWays)
|
|
val blockOffset = sbp.blockOffset
|
|
val nBeats = min(2, sbp.blockBeats)
|
|
val beatBytes = sbp.beatBytes
|
|
List.tabulate(2 * nWays) { i =>
|
|
Seq.tabulate(nBeats) { j =>
|
|
BigInt((j * beatBytes) + ((i * nSets) << blockOffset))
|
|
}
|
|
}.flatten
|
|
},
|
|
maxRequests = nReqs,
|
|
memStart = memOffset,
|
|
numGens = params.size),
|
|
crossingParams = RocketCrossingParams()
|
|
)
|
|
} ++ prev
|
|
}
|
|
})
|