summaryrefslogtreecommitdiff
path: root/src/mem/protocol/MESI_CMP_directory-L2cache.sm
diff options
context:
space:
mode:
authorNilay Vaish <nilay@cs.wisc.edu>2011-01-13 22:17:11 -0600
committerNilay Vaish <nilay@cs.wisc.edu>2011-01-13 22:17:11 -0600
commit47ba26f6b31497ed79703c5cad3270d7ee72512b (patch)
treee7f9f2449101685509173e15f7f4e15a5902c473 /src/mem/protocol/MESI_CMP_directory-L2cache.sm
parent43b58ce3adbd827d9dabfcb117e4ad74ddd911d8 (diff)
downloadgem5-47ba26f6b31497ed79703c5cad3270d7ee72512b.tar.xz
Ruby: Fixes MESI CMP directory protocol
The current implementation of MESI CMP directory protocol is broken. This patch, from Arkaprava Basu, fixes the protocol.
Diffstat (limited to 'src/mem/protocol/MESI_CMP_directory-L2cache.sm')
-rw-r--r--src/mem/protocol/MESI_CMP_directory-L2cache.sm25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/mem/protocol/MESI_CMP_directory-L2cache.sm b/src/mem/protocol/MESI_CMP_directory-L2cache.sm
index 98502df0f..cc8db3335 100644
--- a/src/mem/protocol/MESI_CMP_directory-L2cache.sm
+++ b/src/mem/protocol/MESI_CMP_directory-L2cache.sm
@@ -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;
}