90 lines
2.9 KiB
Scala
90 lines
2.9 KiB
Scala
package tracegen
|
|
|
|
import chisel3._
|
|
import chisel3.util.log2Ceil
|
|
import freechips.rocketchip.config.{Config, Parameters}
|
|
import freechips.rocketchip.groundtest.{TraceGenParams}
|
|
import freechips.rocketchip.subsystem.{ExtMem, SystemBusKey, WithInclusiveCache, InclusiveCacheKey}
|
|
import freechips.rocketchip.system.BaseConfig
|
|
import freechips.rocketchip.rocket.DCacheParams
|
|
import freechips.rocketchip.tile.{MaxHartIdBits, XLen}
|
|
import scala.math.{max, min}
|
|
|
|
class WithTraceGen(params: Seq[DCacheParams], nReqs: Int = 8192)
|
|
extends Config((site, here, up) => {
|
|
case TraceGenKey => params.map { dcp => TraceGenParams(
|
|
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 = site(ExtMem).get.master.base,
|
|
numGens = params.size)
|
|
}
|
|
case MaxHartIdBits => log2Ceil(params.size + up(BoomTraceGenKey, site).length) max 1
|
|
})
|
|
|
|
class WithBoomTraceGen(params: Seq[DCacheParams], nReqs: Int = 8192)
|
|
extends Config((site, here, up) => {
|
|
case BoomTraceGenKey => params.map { dcp => TraceGenParams(
|
|
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 = site(ExtMem).get.master.base,
|
|
numGens = params.size)
|
|
}
|
|
case MaxHartIdBits => log2Ceil(params.size + up(TraceGenKey, site).length) max 1
|
|
})
|
|
|
|
class WithL2TraceGen(params: Seq[DCacheParams], nReqs: Int = 8192)
|
|
extends Config((site, here, up) => {
|
|
case TraceGenKey => params.map { dcp => TraceGenParams(
|
|
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 = site(ExtMem).get.master.base,
|
|
numGens = params.size)
|
|
}
|
|
case MaxHartIdBits => if (params.size == 1) 1 else log2Ceil(params.size)
|
|
})
|
|
|