MOESI_hammer: tbe allocation and dependent wakeup fixes
authorBrad Beckmann <Brad.Beckmann@amd.com>
Fri, 6 Apr 2012 20:47:07 +0000 (13:47 -0700)
committerBrad Beckmann <Brad.Beckmann@amd.com>
Fri, 6 Apr 2012 20:47:07 +0000 (13:47 -0700)
src/mem/protocol/MOESI_hammer-cache.sm
src/mem/protocol/MOESI_hammer-dir.sm

index 219096d26e3e9eaf4f32de6a5a31b5ac4fcff508..1fe353ce56ef8628236900d57716e7f903113cc5 100644 (file)
@@ -1481,6 +1481,7 @@ machine(L1Cache, "AMD Hammer-like protocol")
   transition(SR, {Load, Ifetch}, S) {
     h_load_hit;
     k_popMandatoryQueue;
+    ka_wakeUpAllDependents;
   }
 
   transition({S, SR}, Store, SM) {
@@ -1525,6 +1526,7 @@ machine(L1Cache, "AMD Hammer-like protocol")
   transition(OR, {Load, Ifetch}, O) {
     h_load_hit;
     k_popMandatoryQueue;
+    ka_wakeUpAllDependents;
   }
 
   transition({O, OR}, Store, OM) {
@@ -1569,14 +1571,26 @@ machine(L1Cache, "AMD Hammer-like protocol")
   }
 
   // Transitions from Modified
-  transition({MM, MMR}, {Load, Ifetch}, MM) {
+  transition({MM, M}, {Load, Ifetch}) {
+    h_load_hit;
+    k_popMandatoryQueue;
+  }
+
+  transition(MM, Store) {
+    hh_store_hit;
+    k_popMandatoryQueue;
+  }
+
+  transition(MMR, {Load, Ifetch}, MM) {
     h_load_hit;
     k_popMandatoryQueue;
+    ka_wakeUpAllDependents;
   }
 
-  transition({MM, MMR}, Store, MM) {
+  transition(MMR, Store, MM) {
     hh_store_hit;
     k_popMandatoryQueue;
+    ka_wakeUpAllDependents;
   }
 
   transition({MM, M, MMR, MR}, Flush_line, MM_F) {
@@ -1630,14 +1644,21 @@ machine(L1Cache, "AMD Hammer-like protocol")
   }
  
   // Transitions from Dirty Exclusive
-  transition({M, MR}, {Load, Ifetch}, M) {
+  transition(M, Store, MM) {
+    hh_store_hit;
+    k_popMandatoryQueue;
+  }
+
+  transition(MR, {Load, Ifetch}, M) {
     h_load_hit;
     k_popMandatoryQueue;
+    ka_wakeUpAllDependents;
   }
 
-  transition({M, MR}, Store, MM) {
+  transition(MR, Store, MM) {
     hh_store_hit;
     k_popMandatoryQueue;
+    ka_wakeUpAllDependents;
   }
 
   transition(M, L2_Replacement, MI) {
index 24d64349e309b9d02b72874eb5d923badd13f78a..1fc9463862aa3238a443921e98b5187f09833fdc 100644 (file)
@@ -542,6 +542,7 @@ machine(Directory, "AMD Hammer-like protocol")
   }
 
   action(v_allocateTBE, "v", desc="Allocate TBE") {
+    check_allocate(TBEs);
     peek(requestQueue_in, RequestMsg) {
       TBEs.allocate(address);
       set_tbe(TBEs[address]);
@@ -551,6 +552,7 @@ machine(Directory, "AMD Hammer-like protocol")
   }
 
   action(vd_allocateDmaRequestInTBE, "vd", desc="Record Data in TBE") {
+    check_allocate(TBEs);
     peek(dmaRequestQueue_in, DMARequestMsg) {
       TBEs.allocate(address);
       set_tbe(TBEs[address]);
@@ -1258,6 +1260,8 @@ machine(Directory, "AMD Hammer-like protocol")
     peek(unblockNetwork_in, ResponseMsg) {
       assert(in_msg.Dirty == false);
       assert(in_msg.MessageSize == MessageSizeType:Writeback_Control);
+      DPRINTF(RubySlicc, "%s\n", in_msg.DataBlk);
+      DPRINTF(RubySlicc, "%s\n", getDirectoryEntry(address).DataBlk);
 
       // NOTE: The following check would not be valid in a real
       // implementation.  We include the data in the "dataless"