mem-ruby: Remove AtomicReturn_NoWait from CHI

To make Atomic transaction recursive and enable 2-level config,
remove AtomicReturn_NoWait and other level-dependent code

GitHub Issue: https://github.com/gem5/gem5/issues/882

Change-Id: Iac468cdb8a3b5914c8f05c5cedde866ce85f359a
This commit is contained in:
Víctor Soria Pardos
2024-03-26 16:04:23 +01:00
parent 0c6543d781
commit 7ee574b309
3 changed files with 21 additions and 47 deletions

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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";