summaryrefslogtreecommitdiff
path: root/src/cpu/testers/traffic_gen/base.cc
diff options
context:
space:
mode:
authorTiago Muck <tiago.muck@arm.com>2019-01-28 15:07:53 -0600
committerTiago Mück <tiago.muck@arm.com>2019-06-11 18:43:23 +0000
commit8be59c268c548cc3098fed05395075b3c8a92e8c (patch)
tree87afbcb2d9cc3357ed6d9737745f0666be3de421 /src/cpu/testers/traffic_gen/base.cc
parent5247008379639f2a44aee919371100b6cf86db35 (diff)
downloadgem5-8be59c268c548cc3098fed05395075b3c8a92e8c.tar.xz
cpu: Limit TrafficGen outstanding reqs
Parameter to limit the number of requests waiting for a response. Change-Id: I6cf9e8782a06ae978fb66f7c4278f4c9e9980c79 Signed-off-by: Tiago Muck <tiago.muck@arm.com> Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/18417 Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Maintainer: Jason Lowe-Power <jason@lowepower.com> Tested-by: kokoro <noreply+kokoro@google.com>
Diffstat (limited to 'src/cpu/testers/traffic_gen/base.cc')
-rw-r--r--src/cpu/testers/traffic_gen/base.cc43
1 files changed, 35 insertions, 8 deletions
diff --git a/src/cpu/testers/traffic_gen/base.cc b/src/cpu/testers/traffic_gen/base.cc
index 43a1b831a..f2385a49c 100644
--- a/src/cpu/testers/traffic_gen/base.cc
+++ b/src/cpu/testers/traffic_gen/base.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2013, 2016-2018 ARM Limited
+ * Copyright (c) 2012-2013, 2016-2019 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -75,9 +75,10 @@ BaseTrafficGen::BaseTrafficGen(const BaseTrafficGenParams* p)
noProgressEvent([this]{ noProgress(); }, name()),
nextTransitionTick(0),
nextPacketTick(0),
+ maxOutstandingReqs(p->max_outstanding_reqs),
port(name() + ".port", *this),
retryPkt(NULL),
- retryPktTick(0),
+ retryPktTick(0), blockedWaitingResp(false),
updateEvent([this]{ update(); }, name()),
masterID(system->getMasterId(this)),
streamGenerator(StreamGen::create(p))
@@ -195,7 +196,9 @@ BaseTrafficGen::update()
// device accesses that could be part of a trace
if (pkt && system->isMemAddr(pkt->getAddr())) {
numPackets++;
- if (!port.sendTimingReq(pkt)) {
+ // Only attempts to send if not blocked by pending responses
+ blockedWaitingResp = allocateWaitingRespSlot(pkt);
+ if (blockedWaitingResp || !port.sendTimingReq(pkt)) {
retryPkt = pkt;
retryPktTick = curTick();
}
@@ -213,8 +216,8 @@ BaseTrafficGen::update()
}
}
- // if we are waiting for a retry, do not schedule any further
- // events, in the case of a transition or a successful send, go
+ // if we are waiting for a retry or for a response, do not schedule any
+ // further events, in the case of a transition or a successful send, go
// ahead and determine when the next update should take place
if (retryPkt == NULL) {
nextPacketTick = activeGenerator->nextPacketTick(elasticReq, 0);
@@ -284,10 +287,18 @@ BaseTrafficGen::start()
void
BaseTrafficGen::recvReqRetry()
{
- assert(retryPkt != NULL);
-
DPRINTF(TrafficGen, "Received retry\n");
numRetries++;
+ retryReq();
+}
+
+void
+BaseTrafficGen::retryReq()
+{
+ assert(retryPkt != NULL);
+ assert(retryPktTick != 0);
+ assert(!blockedWaitingResp);
+
// attempt to send the packet, and if we are successful start up
// the machinery again
if (port.sendTimingReq(retryPkt)) {
@@ -449,9 +460,25 @@ BaseTrafficGen::createTrace(Tick duration,
}
bool
-BaseTrafficGen::TrafficGenPort::recvTimingResp(PacketPtr pkt)
+BaseTrafficGen::recvTimingResp(PacketPtr pkt)
{
+ auto iter = waitingResp.find(pkt->req);
+
+ panic_if(iter == waitingResp.end(), "%s: "
+ "Received unexpected response [%s reqPtr=%x]\n",
+ pkt->print(), pkt->req);
+
+ assert(iter->second <= curTick());
+
+ waitingResp.erase(iter);
+
delete pkt;
+ // Sends up the request if we were blocked
+ if (blockedWaitingResp) {
+ blockedWaitingResp = false;
+ retryReq();
+ }
+
return true;
}