summaryrefslogtreecommitdiff
path: root/src/mem/protocol/MOESI_hammer-cache.sm
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/protocol/MOESI_hammer-cache.sm')
-rw-r--r--src/mem/protocol/MOESI_hammer-cache.sm56
1 files changed, 38 insertions, 18 deletions
diff --git a/src/mem/protocol/MOESI_hammer-cache.sm b/src/mem/protocol/MOESI_hammer-cache.sm
index 44ae479c7..7b49c075c 100644
--- a/src/mem/protocol/MOESI_hammer-cache.sm
+++ b/src/mem/protocol/MOESI_hammer-cache.sm
@@ -40,7 +40,8 @@ machine(L1Cache, "AMD Hammer-like protocol")
CacheMemory * L2cacheMemory,
int cache_response_latency = 10,
int issue_latency = 2,
- int l2_cache_hit_latency = 10
+ int l2_cache_hit_latency = 10,
+ bool no_mig_atomic = true
{
// NETWORK BUFFERS
@@ -94,6 +95,7 @@ machine(L1Cache, "AMD Hammer-like protocol")
// Requests
Other_GETX, desc="A GetX from another processor";
Other_GETS, desc="A GetS from another processor";
+ Other_GETS_No_Mig, desc="A GetS from another processor";
// Responses
Ack, desc="Received an ack message";
@@ -122,6 +124,7 @@ machine(L1Cache, "AMD Hammer-like protocol")
bool Dirty, desc="Is the data dirty (different than memory)?";
DataBlock DataBlk, desc="data for the block";
bool FromL2, default="false", desc="block just moved from L2";
+ bool AtomicAccessed, default="false", desc="block just moved from L2";
}
// TBE fields
@@ -280,7 +283,15 @@ machine(L1Cache, "AMD Hammer-like protocol")
if (in_msg.Type == CoherenceRequestType:GETX) {
trigger(Event:Other_GETX, in_msg.Address);
} else if (in_msg.Type == CoherenceRequestType:GETS) {
- trigger(Event:Other_GETS, in_msg.Address);
+ if (isCacheTagPresent(in_msg.Address)) {
+ if (getCacheEntry(in_msg.Address).AtomicAccessed && no_mig_atomic) {
+ trigger(Event:Other_GETS_No_Mig, in_msg.Address);
+ } else {
+ trigger(Event:Other_GETS, in_msg.Address);
+ }
+ } else {
+ trigger(Event:Other_GETS, in_msg.Address);
+ }
} else if (in_msg.Type == CoherenceRequestType:WB_ACK) {
trigger(Event:Writeback_Ack, in_msg.Address);
} else if (in_msg.Type == CoherenceRequestType:WB_NACK) {
@@ -538,12 +549,16 @@ machine(L1Cache, "AMD Hammer-like protocol")
action(hh_store_hit, "\h", desc="Notify sequencer that store completed.") {
DEBUG_EXPR(getCacheEntry(address).DataBlk);
+ peek(mandatoryQueue_in, CacheMsg) {
+ sequencer.writeCallback(address,
+ testAndClearLocalHit(address),
+ getCacheEntry(address).DataBlk);
- sequencer.writeCallback(address,
- testAndClearLocalHit(address),
- getCacheEntry(address).DataBlk);
-
- getCacheEntry(address).Dirty := true;
+ getCacheEntry(address).Dirty := true;
+ if (in_msg.Type == CacheRequestType:ATOMIC) {
+ getCacheEntry(address).AtomicAccessed := true;
+ }
+ }
}
action(sx_external_store_hit, "sx", desc="store required external msgs.") {
@@ -798,7 +813,7 @@ machine(L1Cache, "AMD Hammer-like protocol")
zz_recycleMandatoryQueue;
}
- transition({IT, ST, OT, MT, MMT}, {Other_GETX, Other_GETS}) {
+ transition({IT, ST, OT, MT, MMT}, {Other_GETX, Other_GETS, Other_GETS_No_Mig}) {
// stall
}
@@ -948,7 +963,7 @@ machine(L1Cache, "AMD Hammer-like protocol")
rr_deallocateL2CacheBlock;
}
- transition(I, {Other_GETX, Other_GETS}) {
+ transition(I, {Other_GETX, Other_GETS, Other_GETS_No_Mig}) {
f_sendAck;
l_popForwardQueue;
}
@@ -975,7 +990,7 @@ machine(L1Cache, "AMD Hammer-like protocol")
l_popForwardQueue;
}
- transition(S, Other_GETS) {
+ transition(S, {Other_GETS, Other_GETS_No_Mig}) {
ff_sendAckShared;
l_popForwardQueue;
}
@@ -1005,7 +1020,7 @@ machine(L1Cache, "AMD Hammer-like protocol")
l_popForwardQueue;
}
- transition(O, Other_GETS) {
+ transition(O, {Other_GETS, Other_GETS_No_Mig}) {
ee_sendDataShared;
l_popForwardQueue;
}
@@ -1037,6 +1052,11 @@ machine(L1Cache, "AMD Hammer-like protocol")
l_popForwardQueue;
}
+ transition(MM, Other_GETS_No_Mig, O) {
+ ee_sendDataShared;
+ l_popForwardQueue;
+ }
+
// Transitions from Dirty Exclusive
transition(M, {Load, Ifetch}) {
h_load_hit;
@@ -1059,14 +1079,14 @@ machine(L1Cache, "AMD Hammer-like protocol")
l_popForwardQueue;
}
- transition(M, Other_GETS, O) {
+ transition(M, {Other_GETS, Other_GETS_No_Mig}, O) {
ee_sendDataShared;
l_popForwardQueue;
}
// Transitions from IM
- transition(IM, {Other_GETX, Other_GETS}) {
+ transition(IM, {Other_GETX, Other_GETS, Other_GETS_No_Mig}) {
f_sendAck;
l_popForwardQueue;
}
@@ -1093,7 +1113,7 @@ machine(L1Cache, "AMD Hammer-like protocol")
}
// Transitions from SM
- transition(SM, Other_GETS) {
+ transition(SM, {Other_GETS, Other_GETS_No_Mig}) {
ff_sendAckShared;
l_popForwardQueue;
}
@@ -1138,7 +1158,7 @@ machine(L1Cache, "AMD Hammer-like protocol")
l_popForwardQueue;
}
- transition(OM, Other_GETS) {
+ transition(OM, {Other_GETS, Other_GETS_No_Mig}) {
ee_sendDataShared;
l_popForwardQueue;
}
@@ -1158,7 +1178,7 @@ machine(L1Cache, "AMD Hammer-like protocol")
// Transitions from IS
- transition(IS, {Other_GETX, Other_GETS}) {
+ transition(IS, {Other_GETX, Other_GETS, Other_GETS_No_Mig}) {
f_sendAck;
l_popForwardQueue;
}
@@ -1274,7 +1294,7 @@ machine(L1Cache, "AMD Hammer-like protocol")
l_popForwardQueue;
}
- transition({OI, MI}, Other_GETS, OI) {
+ transition({OI, MI}, {Other_GETS, Other_GETS_No_Mig}, OI) {
q_sendDataFromTBEToCache;
l_popForwardQueue;
}
@@ -1292,7 +1312,7 @@ machine(L1Cache, "AMD Hammer-like protocol")
}
// Transitions from II
- transition(II, {Other_GETS, Other_GETX}, II) {
+ transition(II, {Other_GETS, Other_GETS_No_Mig, Other_GETX}, II) {
f_sendAck;
l_popForwardQueue;
}