Ruby: Fixes MESI CMP directory protocol
authorNilay Vaish <nilay@cs.wisc.edu>
Fri, 14 Jan 2011 04:17:11 +0000 (22:17 -0600)
committerNilay Vaish <nilay@cs.wisc.edu>
Fri, 14 Jan 2011 04:17:11 +0000 (22:17 -0600)
The current implementation of MESI CMP directory protocol is broken.
This patch, from Arkaprava Basu, fixes the protocol.

src/mem/protocol/MESI_CMP_directory-L1cache.sm
src/mem/protocol/MESI_CMP_directory-L2cache.sm

index fb78623cdc04c7483991aa62ef0f323a48c83389..50e0c366295242437de69a3bd4f63110884b07b1 100644 (file)
@@ -70,6 +70,7 @@ machine(L1Cache, "MSI Directory L1 Cache CMP")
 
     M_I, desc="L1 replacing, waiting for ACK";
     E_I, desc="L1 replacing, waiting for ACK";
+    SINK_WB_ACK, desc="This is to sink WB_Acks from L2";
 
   }
 
@@ -749,9 +750,8 @@ machine(L1Cache, "MSI Directory L1 Cache CMP")
     l_popRequestQueue;
   }
 
-  transition(M_I, Inv, I) {
+  transition(M_I, Inv, SINK_WB_ACK) {
     ft_sendDataToL2_fromTBE;
-    s_deallocateTBE;
     l_popRequestQueue;
   }
 
@@ -766,16 +766,14 @@ machine(L1Cache, "MSI Directory L1 Cache CMP")
     l_popRequestQueue;
   }
 
-  transition(M_I, Fwd_GETX, I) {
+  transition(M_I, Fwd_GETX, SINK_WB_ACK) {
     dt_sendDataToRequestor_fromTBE;
-    s_deallocateTBE;
     l_popRequestQueue;
   }
 
-  transition(M_I, {Fwd_GETS, Fwd_GET_INSTR}, I) {
+  transition(M_I, {Fwd_GETS, Fwd_GET_INSTR}, SINK_WB_ACK) {
     dt_sendDataToRequestor_fromTBE;
     d2t_sendDataToL2_fromTBE;
-    s_deallocateTBE;
     l_popRequestQueue;
   }
 
@@ -865,6 +863,21 @@ machine(L1Cache, "MSI Directory L1 Cache CMP")
     s_deallocateTBE;
     o_popIncomingResponseQueue;
   }
+
+  transition(SINK_WB_ACK, {Load, Store, Ifetch, L1_Replacement}){
+      z_recycleMandatoryQueue;
+
+  }
+
+  transition(SINK_WB_ACK, Inv){
+    fi_sendInvAck;
+    l_popRequestQueue;
+  }
+
+  transition(SINK_WB_ACK, WB_Ack){
+    s_deallocateTBE;
+    o_popIncomingResponseQueue;
+  }
 }
 
 
index 98502df0faf6a49e77f7c1f6b906ccaecb836aa1..cc8db333578416cbfb87f748e6272c4f3e465162 100644 (file)
@@ -734,11 +734,13 @@ machine(L2Cache, "MESI Directory L2 Cache CMP")
   // BASE STATE - I
 
   // Transitions from I (Idle)
-  transition({NP, IS, ISS, IM, SS, M, M_I, MT_I, MCT_I, I_I, S_I, SS_MB, M_MB, MT_IIB, MT_IB, MT_SB}, L1_PUTX) {
+  transition({NP, IS, ISS, IM, SS, M, M_I, I_I, S_I, M_MB, MT_IB, MT_SB}, L1_PUTX) {
+    t_sendWBAck;    
     jj_popL1RequestQueue;
   }
 
-  transition({NP, SS, M, MT, M_I, MT_I, MCT_I, I_I, S_I, IS, ISS, IM, SS_MB, M_MB, MT_IIB, MT_IB, MT_SB}, L1_PUTX_old) {
+  transition({NP, SS, M, MT, M_I, I_I, S_I, IS, ISS, IM, M_MB, MT_IB, MT_SB}, L1_PUTX_old) {
+    t_sendWBAck;    
     jj_popL1RequestQueue;
   }
 
@@ -968,6 +970,10 @@ machine(L2Cache, "MESI Directory L2 Cache CMP")
     mmu_markExclusiveFromUnblock;
     k_popUnblockQueue;
   }
+  
+  transition(MT_IIB, {L1_PUTX, L1_PUTX_old}){
+    zz_recycleL1RequestQueue;
+  }
 
   transition(MT_IIB, Unblock, MT_IB) {
     nnu_addSharerFromUnblock;
@@ -1015,21 +1021,22 @@ machine(L2Cache, "MESI Directory L2 Cache CMP")
     o_popIncomingResponseQueue;
   }
 
+  transition(MCT_I,  {L1_PUTX, L1_PUTX_old}){
+    zz_recycleL1RequestQueue; 
+  }
+  
   // L1 never changed Dirty data
   transition(MT_I, Ack_all, M_I) {
     ct_exclusiveReplacementFromTBE;
     o_popIncomingResponseQueue;
   }
 
-
-  // drop this because L1 will send data again
-  //  the reason we don't accept is that the request virtual network may be completely backed up
-  // transition(MT_I, L1_PUTX) {
-  //   jj_popL1RequestQueue;
-  //}
+  transition(MT_I, {L1_PUTX, L1_PUTX_old}){
+    zz_recycleL1RequestQueue; 
+  }
 
   // possible race between unblock and immediate replacement
-  transition(MT_MB, {L1_PUTX, L1_PUTX_old}) {
+  transition({MT_MB,SS_MB}, {L1_PUTX, L1_PUTX_old}) {
     zz_recycleL1RequestQueue;
   }