cpu: Support trace termination in BaseTrafficGen

Make the BaseTrafficGen handle cases where getNextPacket() can't find
a new packet and returns NULL. In that case, assume the generator has
run out of packets and switch to the next generator.

Change-Id: I5ca6ead550005812fb849ed9ce6b5007a65ddfa7
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/11517
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
This commit is contained in:
Andreas Sandberg
2018-05-02 14:04:04 +01:00
parent 102027ee2e
commit 672953ef43

View File

@@ -169,13 +169,13 @@ BaseTrafficGen::update()
// suppress packets that are not destined for a memory, such as
// device accesses that could be part of a trace
if (system->isMemAddr(pkt->getAddr())) {
if (pkt && system->isMemAddr(pkt->getAddr())) {
numPackets++;
if (!port.sendTimingReq(pkt)) {
retryPkt = pkt;
retryPktTick = curTick();
}
} else {
} else if (pkt) {
DPRINTF(TrafficGen, "Suppressed packet %s 0x%x\n",
pkt->cmdString(), pkt->getAddr());
@@ -229,11 +229,19 @@ BaseTrafficGen::transition()
void
BaseTrafficGen::scheduleUpdate()
{
// Has the generator run out of work? In that case, force a
// transition if a transition period hasn't been configured.
while (activeGenerator &&
nextPacketTick == MaxTick && nextTransitionTick == MaxTick) {
transition();
}
if (!activeGenerator)
return;
// schedule next update event based on either the next execute
// tick or the next transition, which ever comes first
const Tick nextEventTick = std::min(nextPacketTick, nextTransitionTick);
if (nextEventTick == MaxTick)
return;
DPRINTF(TrafficGen, "Next event scheduled at %lld\n", nextEventTick);