diff --git a/src/mem/ruby/protocol/chi/CHI-cache-actions.sm b/src/mem/ruby/protocol/chi/CHI-cache-actions.sm index 5d614dcc24..5fa87420d8 100644 --- a/src/mem/ruby/protocol/chi/CHI-cache-actions.sm +++ b/src/mem/ruby/protocol/chi/CHI-cache-actions.sm @@ -823,7 +823,8 @@ action(Initiate_AtomicReturn_I, desc="") { tbe.atomic_to_be_done := true; } else if ((policy_type == 1) || // UNIQUE NEAR (policy_type == 2)) { // PRESENT NEAR - tbe.actions.push(Event:SendAtomicReturn_NoWait); + tbe.actions.push(Event:SendAtomicReturn); + tbe.actions.push(Event:SendARData); tbe.dataToBeInvalid := true; tbe.doCacheFill := false; tbe.atomic_to_be_done := false; @@ -860,7 +861,8 @@ action(Initiate_AtomicReturn_SD, desc="") { tbe.actions.push(Event:TagArrayWrite); tbe.atomic_to_be_done := true; } else if (policy_type == 1) { // UNIQUE NEAR - tbe.actions.push(Event:SendAtomicReturn_NoWait); + tbe.actions.push(Event:SendAtomicReturn); + tbe.actions.push(Event:SendARData); tbe.dataToBeInvalid := true; tbe.doCacheFill := false; tbe.atomic_to_be_done := false; @@ -897,7 +899,8 @@ action(Initiate_AtomicReturn_SC, desc="") { tbe.actions.push(Event:TagArrayWrite); tbe.atomic_to_be_done := true; } else if (policy_type == 1) { // UNIQUE NEAR - tbe.actions.push(Event:SendAtomicReturn_NoWait); + tbe.actions.push(Event:SendAtomicReturn); + tbe.actions.push(Event:SendARData); tbe.dataToBeInvalid := true; tbe.doCacheFill := false; tbe.atomic_to_be_done := false; @@ -1049,7 +1052,7 @@ action(Initiate_AtomicReturn_LocalWrite, desc="") { } tbe.actions.push(Event:SendDBIDResp_AR); tbe.actions.pushNB(Event:WriteFEPipe); - tbe.actions.pushNB(Event:SendCompData_AR); + tbe.actions.push(Event:SendCompData_AR); tbe.actions.push(Event:WriteFEPipe); tbe.actions.push(Event:CheckCacheFill); tbe.actions.push(Event:DelayAtomic); @@ -1082,11 +1085,11 @@ action(Initiate_AtomicNoReturn_LocalWrite, desc="") { action(Initiate_AtomicReturn_Forward, desc="") { - if ((tbe.dir_sharers.count() > 0) && - (tbe.dir_sharers.isElement(tbe.requestor))){ - tbe.dir_sharers.remove(tbe.requestor); - } + tbe.actions.pushNB(Event:WriteFEPipe); tbe.actions.push(Event:SendAtomicReturn); + tbe.actions.push(Event:SendDBIDResp_AR); + tbe.actions.push(Event:SendARData); + tbe.actions.pushNB(Event:WriteFEPipe); tbe.actions.push(Event:SendCompData_AR); tbe.actions.pushNB(Event:TagArrayWrite); @@ -1094,10 +1097,6 @@ action(Initiate_AtomicReturn_Forward, desc="") { } action(Initiate_AtomicNoReturn_Forward, desc="") { - if ((tbe.dir_sharers.count() > 0) && - (tbe.dir_sharers.isElement(tbe.requestor))){ - tbe.dir_sharers.remove(tbe.requestor); - } if (comp_anr) { tbe.actions.push(Event:SendAtomicNoReturn); tbe.actions.push(Event:SendDBIDResp_ANR); @@ -1118,7 +1117,7 @@ action(Initiate_AtomicReturn_Miss, desc="") { tbe.actions.pushNB(Event:WriteFEPipe); tbe.actions.push(Event:SendDBIDResp_AR); tbe.actions.pushNB(Event:WriteFEPipe); - tbe.actions.pushNB(Event:SendCompData_AR); + tbe.actions.push(Event:SendCompData_AR); tbe.actions.push(Event:WriteFEPipe); tbe.actions.push(Event:CheckCacheFill); tbe.actions.push(Event:DelayAtomic); @@ -1664,18 +1663,6 @@ action(Send_AtomicReturn, desc="") { tbe.expected_req_resp.addExpectedCount(1); } -action(Send_AtomicReturn_NoWait, desc="") { - assert(is_valid(tbe)); - - enqueue(reqOutPort, CHIRequestMsg, request_latency) { - prepareRequestAtomic(tbe, CHIRequestType:AtomicReturn, out_msg); - out_msg.Destination.add(mapAddressToDownstreamMachine(tbe.addr)); - allowRequestRetry(tbe, out_msg); - } - - tbe.dataAMOValid := false; -} - action(Send_AtomicNoReturn, desc="") { assert(is_valid(tbe)); @@ -2337,6 +2324,10 @@ action(UpdateDataState_FromADataResp, desc="") { tbe.dataDirty := true; DPRINTF(RubySlicc, "Atomic after %s\n", tbe.dataBlk); + } else if ((tbe.expected_req_resp.hasReceivedData()) && + ((tbe.reqType == CHIRequestType:AtomicReturn) || + (tbe.reqType == CHIRequestType:AtomicNoReturn))){ + tbe.dataMaybeDirtyUpstream := false; } printTBEState(tbe); } @@ -2504,10 +2495,6 @@ action(Receive_ReqResp_WUNeedComp, desc="") { tbe.defer_expected_comp := true; } -action(Receive_ReqResp_AR, desc="") { - tbe.actions.pushFrontNB(Event:SendARData); -} - action(Receive_ReqResp_WUComp, desc="") { if (tbe.defer_expected_comp) { tbe.defer_expected_comp := false; @@ -2730,16 +2717,17 @@ action(Send_ANRData, desc="") { action(CheckARComp, desc="") { assert(is_valid(tbe)); + clearExpectedReqResp(tbe); tbe.expected_req_resp.addExpectedDataType(CHIDataType:CompData_I); tbe.expected_req_resp.addExpectedRespType(CHIResponseType:RespSepData); - tbe.expected_req_resp.addExpectedCount(2); + tbe.expected_req_resp.setExpectedCount(2); } action(CheckANRComp, desc="") { assert(is_valid(tbe)); if (tbe.defer_expected_comp) { tbe.defer_expected_comp := false; - tbe.expected_req_resp.addExpectedCount(1); + tbe.expected_req_resp.setExpectedCount(1); tbe.expected_req_resp.addExpectedRespType(CHIResponseType:Comp); } } @@ -3108,10 +3096,6 @@ action(Send_CompData_AR, desc="") { assert(is_valid(tbe)); assert(tbe.dataValid); - if (is_HN) { - tbe.oldDataBlk := tbe.dataBlk; - } - tbe.snd_msgType := CHIDataType:CompData_I; tbe.dataMaybeDirtyUpstream := false; tbe.requestorToBeExclusiveOwner := false; diff --git a/src/mem/ruby/protocol/chi/CHI-cache-transitions.sm b/src/mem/ruby/protocol/chi/CHI-cache-transitions.sm index 9ced9d1826..1f6f906c0c 100644 --- a/src/mem/ruby/protocol/chi/CHI-cache-transitions.sm +++ b/src/mem/ruby/protocol/chi/CHI-cache-transitions.sm @@ -942,15 +942,6 @@ transition(BUSY_BLKD, SendWriteUnique, BUSY_INTR) {DestinationAvailable} { transition(BUSY_BLKD, SendAtomicReturn, BUSY_INTR) {DestinationAvailable} { Pop_TriggerQueue; Send_AtomicReturn; - CheckARComp; - Profile_OutgoingStart; - ProcessNextState_ClearPending; -} - -transition(BUSY_BLKD, SendAtomicReturn_NoWait, BUSY_INTR) { - Pop_TriggerQueue; - Send_AtomicReturn_NoWait; - CheckARComp; Profile_OutgoingStart; ProcessNextState_ClearPending; } @@ -1016,6 +1007,7 @@ transition(BUSY_BLKD, SendWUDataCB) { transition({BUSY_BLKD,BUSY_INTR}, SendARData) { Pop_TriggerQueue; Send_ARData; + CheckARComp; ProcessNextState_ClearPending; } @@ -1492,7 +1484,6 @@ transition({BUSY_INTR,BUSY_BLKD}, DBIDResp, BUSY_BLKD) { Receive_ReqResp; Receive_ReqResp_CopyDBID; Receive_ReqResp_WUNeedComp; - Receive_ReqResp_AR; Pop_RespInQueue; ProcessNextState; } diff --git a/src/mem/ruby/protocol/chi/CHI-cache.sm b/src/mem/ruby/protocol/chi/CHI-cache.sm index a5c75b167b..487fe60026 100644 --- a/src/mem/ruby/protocol/chi/CHI-cache.sm +++ b/src/mem/ruby/protocol/chi/CHI-cache.sm @@ -135,7 +135,7 @@ machine(MachineType:Cache, "Cache coherency protocol") : // All Near executes all Atomics at L1 (variable set to 0; default) // Unique Near executes Atomics at HNF for states I, SC, SD (set to 1) // Present Near execites all Atomics at L1 except when state is I (set to 2) - int policy_type := 1; + int policy_type := 0; // Use separate Comp/DBIDResp responses for WriteUnique @@ -487,7 +487,6 @@ machine(MachineType:Cache, "Cache coherency protocol") : // Send an atomic request downstream. SendAtomicReturn, out_trans="yes", desc="Send atomic request with return"; - SendAtomicReturn_NoWait, out_trans="yes", desc="Send atomic request with return, but no DBID"; SendAtomicNoReturn, out_trans="yes", desc="Send atomic request without return"; SendARData, desc="Send atomic return request data"; SendANRData, desc="Send atomic no return request data";