Generate separate traces per logger/req/resp

This commit is contained in:
Hansung Kim
2023-04-21 15:53:15 -07:00
parent 6ae08b6541
commit e04ffe2130

View File

@@ -154,7 +154,9 @@ class CoalescingUnitImp(outer: CoalescingUnit, numLanes: Int) extends LazyModule
fromSource = reqHead.source,
toAddress = reqHead.address,
lgSize = reqHead.size,
// data should be aligned to beatBytes
// data is already aligned by MemTraceDriver
// NOTE: if tlIn has different parameters, this will no longer be the
// case
data = reqHead.data
)
val (glegal, gbits) = edgeOut.Get(
@@ -799,9 +801,14 @@ class SimMemTrace(filename: String, numLanes: Int)
}
class MemTraceLogger(
numLanes: Int = 4,
reqFilename: String = "vecadd.core1.thread4.logger.req.trace",
respFilename: String = "vecadd.core1.thread4.logger.resp.trace"
numLanes: Int,
// base filename for the generated trace files. full filename will be
// suffixed depending on `reqEnable`/`respEnable`/`loggerName`.
filename: String = "vecadd.core1.thread4.trace",
reqEnable: Boolean = true,
respEnable: Boolean = true,
// filename suffix that is unique to this logger module.
loggerName: String = ".logger"
)(implicit
p: Parameters
) extends LazyModule {
@@ -830,12 +837,22 @@ class MemTraceLogger(
lazy val module = new Impl
class Impl extends LazyModuleImp(this) {
val simReq = Module(new SimMemTraceLogger(false, reqFilename, numLanes))
val simResp = Module(new SimMemTraceLogger(true, respFilename, numLanes))
simReq.io.clock := clock
simReq.io.reset := reset.asBool
simResp.io.clock := clock
simResp.io.reset := reset.asBool
val simReq =
if (reqEnable)
Some(Module(new SimMemTraceLogger(false, s"${filename}.${loggerName}.req", numLanes)))
else None
val simResp =
if (respEnable)
Some(Module(new SimMemTraceLogger(true, s"${filename}.${loggerName}.resp", numLanes)))
else None
if (simReq.isDefined) {
simReq.get.io.clock := clock
simReq.get.io.reset := reset.asBool
}
if (simResp.isDefined) {
simResp.get.io.clock := clock
simResp.get.io.reset := reset.asBool
}
val laneReqs = Wire(Vec(numLanes, new TraceLine))
val laneResps = Wire(Vec(numLanes, new TraceLine))
@@ -932,11 +949,20 @@ class MemTraceLogger(
traceLogIO.data := vecData.asUInt
}
flattenTrace(simReq.io.trace_log, laneReqs)
flattenTrace(simResp.io.trace_log, laneResps)
assert(simReq.io.trace_log.ready === true.B, "MemTraceLogger is expected to be always ready")
assert(simResp.io.trace_log.ready === true.B, "MemTraceLogger is expected to be always ready")
if (simReq.isDefined) {
flattenTrace(simReq.get.io.trace_log, laneReqs)
assert(
simReq.get.io.trace_log.ready === true.B,
"MemTraceLogger is expected to be always ready"
)
}
if (simResp.isDefined) {
flattenTrace(simResp.get.io.trace_log, laneResps)
assert(
simResp.get.io.trace_log.ready === true.B,
"MemTraceLogger is expected to be always ready"
)
}
}
}
@@ -1002,9 +1028,12 @@ object TracePrintf {
class TLRAMCoalescerLogger(implicit p: Parameters) extends LazyModule {
// TODO: use parameters for numLanes
val numLanes = 4
val coal = LazyModule(new CoalescingUnit(numLanes))
val driver = LazyModule(new MemTraceDriver(numLanes))
val logger = LazyModule(new MemTraceLogger(numLanes + 1))
val coreSideLogger = LazyModule(
new MemTraceLogger(numLanes, loggerName = "coreside")
)
val coal = LazyModule(new CoalescingUnit(numLanes))
val memSideLogger = LazyModule(new MemTraceLogger(numLanes + 1, loggerName = "memside"))
val rams = Seq.fill(numLanes + 1)( // +1 for coalesced edge
LazyModule(
// NOTE: beatBytes here sets the data bitwidth of the upstream TileLink
@@ -1014,8 +1043,8 @@ class TLRAMCoalescerLogger(implicit p: Parameters) extends LazyModule {
)
)
logger.node :=* coal.node :=* driver.node
rams.foreach { r => r.node := logger.node }
memSideLogger.node :=* coal.node :=* coreSideLogger.node :=* driver.node
rams.foreach { r => r.node := memSideLogger.node }
lazy val module = new Impl
class Impl extends LazyModuleImp(this) with UnitTestModule {