Debugging info
authorRon Dreslinski <rdreslin@umich.edu>
Wed, 11 Oct 2006 02:50:36 +0000 (22:50 -0400)
committerRon Dreslinski <rdreslin@umich.edu>
Wed, 11 Oct 2006 02:50:36 +0000 (22:50 -0400)
src/base/traceflags.py:
    Add new flags for cacheport
src/mem/bus.cc:
    Add debugging info
src/mem/cache/base_cache.cc:
    Add debuggin info

--HG--
extra : convert_revision : a6c4b452466a8e0b50a86e886833cb6e29edc748

src/base/traceflags.py
src/mem/bus.cc
src/mem/cache/base_cache.cc

index 274407be5961302089bc176df8da549ff64952f3..f871ce35f8912f54aa1152e6aac23cacf54ce3ed 100644 (file)
@@ -58,6 +58,7 @@ baseFlags = [
     'BusAddrRanges',
     'BusBridge',
     'Cache',
+    'CachePort',
     'Chains',
     'Checker',
     'Clock',
index 3efaa93acf3205848e6cf5e2fc12d6c11d3475ad..c475f6d8f7f6d903a57fb116f276f6e704f79771 100644 (file)
@@ -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++;
     }
index 4df13fb2b2facb06d7ea2709d4a44aabbb3a57ee..cdb9d547594a55266493d54b4d09f8c5ac4e0d24 100644 (file)
@@ -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;
     }