mem: Fix bug in DRAM bytes per activate
authorAndreas Hansson <andreas.hansson@arm.com>
Sun, 23 Mar 2014 15:12:05 +0000 (11:12 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Sun, 23 Mar 2014 15:12:05 +0000 (11:12 -0400)
This patch ensures that we do not sample the bytes per activate when
the row has already been closed.

src/mem/simple_dram.cc

index 505431772df50a69d7a096ac44e3b95addfbb7c5..42e36486a640c8a72ff4a1835f41bd244d69309d 100644 (file)
@@ -1066,7 +1066,6 @@ SimpleDRAM::doDRAMAccess(DRAMPacket* dram_pkt)
 
     // Update bank state
     if (pageMgmt == Enums::open || pageMgmt == Enums::open_adaptive) {
-        bank.openRow = dram_pkt->row;
         bank.freeAt = curTick() + addDelay + accessLat;
 
         // If you activated a new row do to this access, the next access
@@ -1077,9 +1076,18 @@ SimpleDRAM::doDRAMAccess(DRAMPacket* dram_pkt)
             bank.tRASDoneAt = actTick + tRAS;
             recordActivate(actTick, dram_pkt->rank, dram_pkt->bank);
 
-            // sample the number of bytes accessed and reset it as
-            // we are now closing this row
-            bytesPerActivate.sample(bank.bytesAccessed);
+            // if we closed an open row as a result of this access,
+            // then sample the number of bytes accessed before
+            // resetting it
+            if (bank.openRow != -1)
+                bytesPerActivate.sample(bank.bytesAccessed);
+
+            // update the open row
+            bank.openRow = dram_pkt->row;
+
+            // start counting anew, this covers both the case when we
+            // auto-precharged, and when this access is forced to
+            // precharge
             bank.bytesAccessed = 0;
             bank.rowAccesses = 0;
         }
@@ -1137,6 +1145,11 @@ SimpleDRAM::doDRAMAccess(DRAMPacket* dram_pkt)
                 DPRINTF(DRAM, "All banks precharged at tick: %ld\n",
                         startTickPrechargeAll);
             }
+
+            // sample the bytes per activate here since we are closing
+            // the page
+            bytesPerActivate.sample(bank.bytesAccessed);
+
             DPRINTF(DRAM, "Auto-precharged bank: %d\n", dram_pkt->bankId);
         }