diff options
-rw-r--r-- | src/base/traceflags.py | 1 | ||||
-rw-r--r-- | src/mem/bus.cc | 11 | ||||
-rw-r--r-- | src/mem/cache/base_cache.cc | 26 |
3 files changed, 34 insertions, 4 deletions
diff --git a/src/base/traceflags.py b/src/base/traceflags.py index 274407be5..f871ce35f 100644 --- a/src/base/traceflags.py +++ b/src/base/traceflags.py @@ -58,6 +58,7 @@ baseFlags = [ 'BusAddrRanges', 'BusBridge', 'Cache', + 'CachePort', 'Chains', 'Checker', 'Clock', diff --git a/src/mem/bus.cc b/src/mem/bus.cc index 3efaa93ac..c475f6d8f 100644 --- a/src/mem/bus.cc +++ b/src/mem/bus.cc @@ -95,6 +95,7 @@ Bus::recvTiming(Packet *pkt) // one, put this device on the retry list. if (tickNextIdle > curTick || (retryList.size() && (!inRetry || pktPort != retryList.front()))) { + DPRINTF(Bus, "Adding RETRY for %i\n", pktPort); addToRetryList(pktPort); return false; } @@ -108,6 +109,7 @@ Bus::recvTiming(Packet *pkt) if (pkt->flags & SATISFIED) { //Cache-Cache transfer occuring if (inRetry) { + DPRINTF(Bus, "Removing RETRY %i\n", retryList.front()); retryList.pop_front(); inRetry = false; } @@ -116,6 +118,7 @@ Bus::recvTiming(Packet *pkt) port = findPort(pkt->getAddr(), pkt->getSrc()); } else { //Snoop didn't succeed + DPRINTF(Bus, "Snoop caused adding to RETRY list %i\n", pktPort); addToRetryList(pktPort); return false; } @@ -181,6 +184,7 @@ Bus::recvTiming(Packet *pkt) // Packet was successfully sent. Return true. // Also take care of retries if (inRetry) { + DPRINTF(Bus, "Remove retry from list %i\n", retryList.front()); retryList.pop_front(); inRetry = false; } @@ -188,6 +192,7 @@ Bus::recvTiming(Packet *pkt) } // Packet not successfully sent. Leave or put it on the retry list. + DPRINTF(Bus, "Adding a retry to RETRY list %i\n", pktPort); addToRetryList(pktPort); return false; } @@ -195,10 +200,12 @@ Bus::recvTiming(Packet *pkt) void Bus::recvRetry(int id) { + DPRINTF(Bus, "Received a retry\n"); // If there's anything waiting... if (retryList.size()) { //retryingPort = retryList.front(); inRetry = true; + DPRINTF(Bus, "Sending a retry\n"); retryList.front()->sendRetry(); // If inRetry is still true, sendTiming wasn't called if (inRetry) @@ -258,8 +265,8 @@ Bus::findSnoopPorts(Addr addr, int id) //Careful to not overlap ranges //or snoop will be called more than once on the port ports.push_back(portSnoopList[i].portId); - DPRINTF(Bus, " found snoop addr %#llx on device%d\n", addr, - portSnoopList[i].portId); +// DPRINTF(Bus, " found snoop addr %#llx on device%d\n", addr, +// portSnoopList[i].portId); } i++; } diff --git a/src/mem/cache/base_cache.cc b/src/mem/cache/base_cache.cc index 4df13fb2b..cdb9d5475 100644 --- a/src/mem/cache/base_cache.cc +++ b/src/mem/cache/base_cache.cc @@ -116,12 +116,16 @@ BaseCache::CachePort::recvRetry() Packet *pkt; assert(waitingOnRetry); if (!drainList.empty()) { + DPRINTF(CachePort, "%s attempting to send a retry for response\n", name()); //We have some responses to drain first if (sendTiming(drainList.front())) { + DPRINTF(CachePort, "%s sucessful in sending a retry for response\n", name()); drainList.pop_front(); if (!drainList.empty() || !isCpuSide && cache->doMasterRequest() || isCpuSide && cache->doSlaveRequest()) { + + DPRINTF(CachePort, "%s has more responses/requests\n", name()); BaseCache::CacheEvent * reqCpu = new BaseCache::CacheEvent(this); reqCpu->schedule(curTick + 1); } @@ -130,6 +134,7 @@ BaseCache::CachePort::recvRetry() } else if (!isCpuSide) { + DPRINTF(CachePort, "%s attempting to send a retry for MSHR\n", name()); assert(cache->doMasterRequest()); pkt = cache->getPacket(); MSHR* mshr = (MSHR*)pkt->senderState; @@ -140,6 +145,7 @@ BaseCache::CachePort::recvRetry() waitingOnRetry = !success; if (success && cache->doMasterRequest()) { + DPRINTF(CachePort, "%s has more requests\n", name()); //Still more to issue, rerequest in 1 cycle pkt = NULL; BaseCache::CacheEvent * reqCpu = new BaseCache::CacheEvent(this); @@ -163,6 +169,8 @@ BaseCache::CachePort::recvRetry() cshrRetry = NULL; } } + if (waitingOnRetry) DPRINTF(CachePort, "%s STILL Waiting on retry\n", name()); + else DPRINTF(CachePort, "%s no longer waiting on retry\n", name()); return; } void @@ -210,17 +218,26 @@ BaseCache::CacheEvent::process() if (cachePort->waitingOnRetry) return; //We have some responses to drain first if (!cachePort->drainList.empty()) { + DPRINTF(CachePort, "%s trying to drain a response\n", cachePort->name()); if (cachePort->sendTiming(cachePort->drainList.front())) { + DPRINTF(CachePort, "%s drains a response succesfully\n", cachePort->name()); cachePort->drainList.pop_front(); if (!cachePort->drainList.empty() || !cachePort->isCpuSide && cachePort->cache->doMasterRequest() || - cachePort->isCpuSide && cachePort->cache->doSlaveRequest()) + cachePort->isCpuSide && cachePort->cache->doSlaveRequest()) { + + DPRINTF(CachePort, "%s still has outstanding bus reqs\n", cachePort->name()); this->schedule(curTick + 1); + } + } + else { + cachePort->waitingOnRetry = true; + DPRINTF(CachePort, "%s now waiting on a retry\n", cachePort->name()); } - else cachePort->waitingOnRetry = true; } else if (!cachePort->isCpuSide) { + DPRINTF(CachePort, "%s trying to send a MSHR request\n", cachePort->name()); assert(cachePort->cache->doMasterRequest()); //MSHR pkt = cachePort->cache->getPacket(); @@ -230,8 +247,10 @@ BaseCache::CacheEvent::process() pkt->getAddr(), success ? "succesful" : "unsuccesful"); cachePort->cache->sendResult(pkt, mshr, success); cachePort->waitingOnRetry = !success; + if (cachePort->waitingOnRetry) DPRINTF(CachePort, "%s now waiting on a retry\n", cachePort->name()); if (success && cachePort->cache->doMasterRequest()) { + DPRINTF(CachePort, "%s still more MSHR requests to send\n", cachePort->name()); //Still more to issue, rerequest in 1 cycle pkt = NULL; this->schedule(curTick+1); @@ -264,12 +283,15 @@ BaseCache::CacheEvent::process() else pkt->result = Packet::Success; pkt->makeTimingResponse(); + DPRINTF(CachePort, "%s attempting to send a response\n", cachePort->name()); if (!cachePort->drainList.empty()) { //Already have a list, just append cachePort->drainList.push_back(pkt); + DPRINTF(CachePort, "%s appending response onto drain list\n", cachePort->name()); } else if (!cachePort->sendTiming(pkt)) { //It failed, save it to list of drain events + DPRINTF(CachePort, "%s now waiting for a retry\n", cachePort->name()); cachePort->drainList.push_back(pkt); cachePort->waitingOnRetry = true; } |