Ruby: Fixes MESI CMP directory protocol
The current implementation of MESI CMP directory protocol is broken. This patch, from Arkaprava Basu, fixes the protocol.
This commit is contained in:
parent
43b58ce3ad
commit
47ba26f6b3
2 changed files with 35 additions and 15 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue