Ifetch, desc="I-fetch request from the home processor";
Store, desc="Store request from the home processor";
- Inv, desc="Invalidate request from L2 bank";
+ // invalidations from L1 (due to self or other core)
+ InvOwn, desc="Invalidate request from L1 (own)";
+ InvElse, desc="Invalidate request from L1 (else)";
// internal generated request
L0_Replacement, desc="L0 Replacement", format="!r";
trigger(Event:Ack, in_msg.addr, cache_entry, tbe);
} else if (in_msg.Class == CoherenceClass:WB_ACK) {
trigger(Event:WB_Ack, in_msg.addr, cache_entry, tbe);
- } else if (in_msg.Class == CoherenceClass:INV) {
- trigger(Event:Inv, in_msg.addr, cache_entry, tbe);
+ } else if (in_msg.Class == CoherenceClass:INV_OWN) {
+ trigger(Event:InvOwn, in_msg.addr, cache_entry, tbe);
+ } else if (in_msg.Class == CoherenceClass:INV_ELSE) {
+ trigger(Event:InvElse, in_msg.addr, cache_entry, tbe);
} else if (in_msg.Class == CoherenceClass:GETX ||
in_msg.Class == CoherenceClass:UPGRADE) {
// upgrade transforms to GETX due to race
k_popMandatoryQueue;
}
- transition({I, IS, IM, Inst_IS}, Inv) {
+ transition({I, IS, IM, Inst_IS}, {InvOwn, InvElse}) {
fi_sendInvAck;
l_popRequestQueue;
}
- transition(SM, Inv, IM) {
+ transition(SM, {InvOwn, InvElse}, IM) {
fi_sendInvAck;
l_popRequestQueue;
}
ff_deallocateCacheBlock;
}
- transition(S, Inv, I) {
+ transition(S, {InvOwn, InvElse}, I) {
forward_eviction_to_cpu;
fi_sendInvAck;
ff_deallocateCacheBlock;
ff_deallocateCacheBlock;
}
- transition(E, {Inv, Fwd_GETX}, I) {
+ transition(E, {InvOwn, InvElse, Fwd_GETX}, I) {
// don't send data
forward_eviction_to_cpu;
fi_sendInvAck;
ff_deallocateCacheBlock;
}
- transition(M, {Inv, Fwd_GETX}, I) {
+ transition(M, {InvOwn, InvElse, Fwd_GETX}, I) {
forward_eviction_to_cpu;
f_sendDataToL1;
ff_deallocateCacheBlock;
}
}
- action(forward_eviction_to_L0, "\cc", desc="sends eviction information to the processor") {
+ action(forward_eviction_to_L0_own, "\cc", desc="sends (own) eviction information to the processor") {
enqueue(bufferToL0_out, CoherenceMsg, l1_request_latency) {
out_msg.addr := address;
- out_msg.Class := CoherenceClass:INV;
+ out_msg.Class := CoherenceClass:INV_OWN;
+ out_msg.Sender := machineID;
+ out_msg.Dest := createMachineID(MachineType:L0Cache, version);
+ out_msg.MessageSize := MessageSizeType:Control;
+ }
+ }
+
+ action(forward_eviction_to_L0_else, "\cce", desc="sends (else) eviction information to the processor") {
+ enqueue(bufferToL0_out, CoherenceMsg, l1_request_latency) {
+ out_msg.addr := address;
+ out_msg.Class := CoherenceClass:INV_ELSE;
out_msg.Sender := machineID;
out_msg.Dest := createMachineID(MachineType:L0Cache, version);
out_msg.MessageSize := MessageSizeType:Control;
ff_deallocateCacheBlock;
}
- transition(S, {L0_Invalidate_Own, L0_Invalidate_Else}, S_IL0) {
- forward_eviction_to_L0;
+ transition(S, L0_Invalidate_Own, S_IL0) {
+ forward_eviction_to_L0_own;
+ }
+
+ transition(S, L0_Invalidate_Else, S_IL0) {
+ forward_eviction_to_L0_else;
}
transition(SS, Inv, I) {
l_popL2RequestQueue;
}
- transition(E, {L0_Invalidate_Own, L0_Invalidate_Else}, E_IL0) {
- forward_eviction_to_L0;
+ transition(E, L0_Invalidate_Own, E_IL0) {
+ forward_eviction_to_L0_own;
+ }
+
+ transition(E, L0_Invalidate_Else, E_IL0) {
+ forward_eviction_to_L0_else;
}
// Transitions from Modified
l_popL2RequestQueue;
}
- transition(M, {L0_Invalidate_Own, L0_Invalidate_Else}, M_IL0) {
- forward_eviction_to_L0;
+ transition(M, L0_Invalidate_Own, M_IL0) {
+ forward_eviction_to_L0_own;
+ }
+
+ transition(M, L0_Invalidate_Else, M_IL0) {
+ forward_eviction_to_L0_else;
}
transition(M_I, Fwd_GETX, SINK_WB_ACK) {
}
transition(SM, L0_Invalidate_Else, SM_IL0) {
- forward_eviction_to_L0;
+ forward_eviction_to_L0_else;
}
transition(SINK_WB_ACK, Inv){
/*
+ * Copyright (c) 2020 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder. You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
* Copyright (c) 2013 Mark D. Hill and David A. Wood
* All rights reserved.
*
UPGRADE, desc="UPGRADE to exclusive";
GETS, desc="Get Shared";
GET_INSTR, desc="Get Instruction";
- INV, desc="INValidate";
+ INV_OWN, desc="Invalidate (own)";
+ INV_ELSE, desc="Invalidate (else)";
PUTX, desc="Replacement message";
WB_ACK, desc="Writeback ack";