mem-ruby: Fix MOESI_CMP_directory in ports order
To avoid deadlocks ruby objects typically prioritize the handling of responses to all other events. The order in which in_port statements are written determine the order in which they are handled. This patch fixes the order of in_order statements for the L2 cache in the MOESI_CMP_directory. Change-Id: I62248b0480a88ac2cd945425155f0961a1cf6cb1 Signed-off-by: Nikos Nikoleris <nikos.nikoleris@arm.com> Reviewed-on: https://gem5-review.googlesource.com/c/13595 Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Maintainer: Jason Lowe-Power <jason@lowepower.com>
This commit is contained in:
@@ -592,6 +592,67 @@ machine(MachineType:L2Cache, "Token protocol")
|
||||
}
|
||||
}
|
||||
|
||||
// Response Network
|
||||
in_port(responseNetwork_in, ResponseMsg, responseToL2Cache) {
|
||||
if (responseNetwork_in.isReady(clockEdge())) {
|
||||
peek(responseNetwork_in, ResponseMsg) {
|
||||
assert(in_msg.Destination.isElement(machineID));
|
||||
if (in_msg.Type == CoherenceResponseType:ACK) {
|
||||
if (in_msg.SenderMachine == MachineType:L2Cache) {
|
||||
trigger(Event:ExtAck, in_msg.addr,
|
||||
getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
|
||||
}
|
||||
else {
|
||||
trigger(Event:IntAck, in_msg.addr,
|
||||
getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
|
||||
}
|
||||
} else if (in_msg.Type == CoherenceResponseType:DATA) {
|
||||
trigger(Event:Data, in_msg.addr,
|
||||
getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
|
||||
} else if (in_msg.Type == CoherenceResponseType:DATA_EXCLUSIVE) {
|
||||
trigger(Event:Data_Exclusive, in_msg.addr,
|
||||
getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
|
||||
} else if (in_msg.Type == CoherenceResponseType:UNBLOCK) {
|
||||
DPRINTF(ProtocolTrace, "Received Unblock from L1 addr: %x\n", in_msg.addr);
|
||||
trigger(Event:Unblock, in_msg.addr,
|
||||
getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
|
||||
} else if (in_msg.Type == CoherenceResponseType:UNBLOCK_EXCLUSIVE) {
|
||||
trigger(Event:Exclusive_Unblock, in_msg.addr,
|
||||
getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
|
||||
} else if (in_msg.Type == CoherenceResponseType:WRITEBACK_DIRTY_DATA) {
|
||||
Entry cache_entry := getCacheEntry(in_msg.addr);
|
||||
if (is_invalid(cache_entry) &&
|
||||
L2cache.cacheAvail(in_msg.addr) == false) {
|
||||
trigger(Event:L2_Replacement, L2cache.cacheProbe(in_msg.addr),
|
||||
getCacheEntry(L2cache.cacheProbe(in_msg.addr)),
|
||||
TBEs[L2cache.cacheProbe(in_msg.addr)]);
|
||||
}
|
||||
else {
|
||||
trigger(Event:L1_WBDIRTYDATA, in_msg.addr,
|
||||
cache_entry, TBEs[in_msg.addr]);
|
||||
}
|
||||
} else if (in_msg.Type == CoherenceResponseType:WRITEBACK_CLEAN_DATA) {
|
||||
Entry cache_entry := getCacheEntry(in_msg.addr);
|
||||
if (is_invalid(cache_entry) &&
|
||||
L2cache.cacheAvail(in_msg.addr) == false) {
|
||||
trigger(Event:L2_Replacement, L2cache.cacheProbe(in_msg.addr),
|
||||
getCacheEntry(L2cache.cacheProbe(in_msg.addr)),
|
||||
TBEs[L2cache.cacheProbe(in_msg.addr)]);
|
||||
}
|
||||
else {
|
||||
trigger(Event:L1_WBCLEANDATA, in_msg.addr,
|
||||
cache_entry, TBEs[in_msg.addr]);
|
||||
}
|
||||
} else if (in_msg.Type == CoherenceResponseType:DMA_ACK) {
|
||||
trigger(Event:DmaAck, in_msg.addr,
|
||||
getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
|
||||
} else {
|
||||
error("Unexpected message");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Request Network
|
||||
in_port(requestNetwork_in, RequestMsg, GlobalRequestToL2Cache) {
|
||||
@@ -661,67 +722,6 @@ machine(MachineType:L2Cache, "Token protocol")
|
||||
}
|
||||
|
||||
|
||||
// Response Network
|
||||
in_port(responseNetwork_in, ResponseMsg, responseToL2Cache) {
|
||||
if (responseNetwork_in.isReady(clockEdge())) {
|
||||
peek(responseNetwork_in, ResponseMsg) {
|
||||
assert(in_msg.Destination.isElement(machineID));
|
||||
if (in_msg.Type == CoherenceResponseType:ACK) {
|
||||
if (in_msg.SenderMachine == MachineType:L2Cache) {
|
||||
trigger(Event:ExtAck, in_msg.addr,
|
||||
getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
|
||||
}
|
||||
else {
|
||||
trigger(Event:IntAck, in_msg.addr,
|
||||
getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
|
||||
}
|
||||
} else if (in_msg.Type == CoherenceResponseType:DATA) {
|
||||
trigger(Event:Data, in_msg.addr,
|
||||
getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
|
||||
} else if (in_msg.Type == CoherenceResponseType:DATA_EXCLUSIVE) {
|
||||
trigger(Event:Data_Exclusive, in_msg.addr,
|
||||
getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
|
||||
} else if (in_msg.Type == CoherenceResponseType:UNBLOCK) {
|
||||
trigger(Event:Unblock, in_msg.addr,
|
||||
getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
|
||||
} else if (in_msg.Type == CoherenceResponseType:UNBLOCK_EXCLUSIVE) {
|
||||
trigger(Event:Exclusive_Unblock, in_msg.addr,
|
||||
getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
|
||||
} else if (in_msg.Type == CoherenceResponseType:WRITEBACK_DIRTY_DATA) {
|
||||
Entry cache_entry := getCacheEntry(in_msg.addr);
|
||||
if (is_invalid(cache_entry) &&
|
||||
L2cache.cacheAvail(in_msg.addr) == false) {
|
||||
trigger(Event:L2_Replacement, L2cache.cacheProbe(in_msg.addr),
|
||||
getCacheEntry(L2cache.cacheProbe(in_msg.addr)),
|
||||
TBEs[L2cache.cacheProbe(in_msg.addr)]);
|
||||
}
|
||||
else {
|
||||
trigger(Event:L1_WBDIRTYDATA, in_msg.addr,
|
||||
cache_entry, TBEs[in_msg.addr]);
|
||||
}
|
||||
} else if (in_msg.Type == CoherenceResponseType:WRITEBACK_CLEAN_DATA) {
|
||||
Entry cache_entry := getCacheEntry(in_msg.addr);
|
||||
if (is_invalid(cache_entry) &&
|
||||
L2cache.cacheAvail(in_msg.addr) == false) {
|
||||
trigger(Event:L2_Replacement, L2cache.cacheProbe(in_msg.addr),
|
||||
getCacheEntry(L2cache.cacheProbe(in_msg.addr)),
|
||||
TBEs[L2cache.cacheProbe(in_msg.addr)]);
|
||||
}
|
||||
else {
|
||||
trigger(Event:L1_WBCLEANDATA, in_msg.addr,
|
||||
cache_entry, TBEs[in_msg.addr]);
|
||||
}
|
||||
} else if (in_msg.Type == CoherenceResponseType:DMA_ACK) {
|
||||
trigger(Event:DmaAck, in_msg.addr,
|
||||
getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
|
||||
} else {
|
||||
error("Unexpected message");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ACTIONS
|
||||
|
||||
action(a_issueGETS, "a", desc="issue local request globally") {
|
||||
|
||||
Reference in New Issue
Block a user