diff options
author | Andreas Sandberg <andreas.sandberg@arm.com> | 2018-05-02 14:04:04 +0100 |
---|---|---|
committer | Andreas Sandberg <andreas.sandberg@arm.com> | 2018-07-13 09:26:23 +0000 |
commit | 672953ef43f8559bd1ac1f8cb5dba9b997ca0ec9 (patch) | |
tree | c9d437f34d46b43e35baf340efe95aed5d5badbe /src/cpu | |
parent | 102027ee2ed50dcadf93b31ef2e7e485b61cc504 (diff) | |
download | gem5-672953ef43f8559bd1ac1f8cb5dba9b997ca0ec9.tar.xz |
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>
Diffstat (limited to 'src/cpu')
-rw-r--r-- | src/cpu/testers/traffic_gen/base.cc | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/cpu/testers/traffic_gen/base.cc b/src/cpu/testers/traffic_gen/base.cc index 95878f078..fe2577835 100644 --- a/src/cpu/testers/traffic_gen/base.cc +++ b/src/cpu/testers/traffic_gen/base.cc @@ -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); |