summaryrefslogtreecommitdiff
path: root/src/mem/protocol/MESI_CMP_directory-dir.sm
diff options
context:
space:
mode:
authorNilay Vaish <nilay@cs.wisc.edu>2012-02-10 11:05:24 -0600
committerNilay Vaish <nilay@cs.wisc.edu>2012-02-10 11:05:24 -0600
commit69d8600bf80ce065feccbac6d55e45db62f1654f (patch)
tree6d7758703a28417873a77bbd88c9f006ed191420 /src/mem/protocol/MESI_CMP_directory-dir.sm
parent72f3f526fc327f2030fe2f44844e783f763ef6e3 (diff)
downloadgem5-69d8600bf80ce065feccbac6d55e45db62f1654f.tar.xz
MESI: Add queues for stalled requests
This patch adds support for stalling the requests queued up at different controllers for the MESI CMP directory protocol. Earlier the controllers would recycle the requests using some fixed latency. This results in younger requests getting serviced first at times, and can result in starvation. Instead all the requests that need a particular block to be in a stable state are moved to a separate queue, where they wait till that block returns to a stable state and then they are processed.
Diffstat (limited to 'src/mem/protocol/MESI_CMP_directory-dir.sm')
-rw-r--r--src/mem/protocol/MESI_CMP_directory-dir.sm24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/mem/protocol/MESI_CMP_directory-dir.sm b/src/mem/protocol/MESI_CMP_directory-dir.sm
index d026e7b90..aa1294b2c 100644
--- a/src/mem/protocol/MESI_CMP_directory-dir.sm
+++ b/src/mem/protocol/MESI_CMP_directory-dir.sm
@@ -109,6 +109,7 @@ machine(Directory, "MESI_CMP_filter_directory protocol")
void set_tbe(TBE tbe);
void unset_tbe();
+ void wakeUpBuffers(Address a);
Entry getDirectoryEntry(Address addr), return_by_pointer="yes" {
Entry dir_entry := static_cast(Entry, "pointer", directory[addr]);
@@ -191,7 +192,7 @@ machine(Directory, "MESI_CMP_filter_directory protocol")
// ** IN_PORTS **
- in_port(requestNetwork_in, RequestMsg, requestToDir) {
+ in_port(requestNetwork_in, RequestMsg, requestToDir, rank = 0) {
if (requestNetwork_in.isReady()) {
peek(requestNetwork_in, RequestMsg) {
assert(in_msg.Destination.isElement(machineID));
@@ -211,7 +212,7 @@ machine(Directory, "MESI_CMP_filter_directory protocol")
}
}
- in_port(responseNetwork_in, ResponseMsg, responseToDir) {
+ in_port(responseNetwork_in, ResponseMsg, responseToDir, rank = 1) {
if (responseNetwork_in.isReady()) {
peek(responseNetwork_in, ResponseMsg) {
assert(in_msg.Destination.isElement(machineID));
@@ -228,7 +229,7 @@ machine(Directory, "MESI_CMP_filter_directory protocol")
}
// off-chip memory request/response is done
- in_port(memQueue_in, MemoryMsg, memBuffer) {
+ in_port(memQueue_in, MemoryMsg, memBuffer, rank = 2) {
if (memQueue_in.isReady()) {
peek(memQueue_in, MemoryMsg) {
if (in_msg.Type == MemoryRequestType:MEMORY_READ) {
@@ -244,7 +245,6 @@ machine(Directory, "MESI_CMP_filter_directory protocol")
}
-
// Actions
action(a_sendAck, "a", desc="Send ack to L2") {
peek(responseNetwork_in, ResponseMsg) {
@@ -297,6 +297,10 @@ machine(Directory, "MESI_CMP_filter_directory protocol")
memQueue_in.dequeue();
}
+ action(kd_wakeUpDependents, "kd", desc="wake-up dependents") {
+ wakeUpBuffers(address);
+ }
+
action(qf_queueMemoryFetchRequest, "qf", desc="Queue off-chip fetch request") {
peek(requestNetwork_in, RequestMsg) {
enqueue(memQueue_out, MemoryMsg, latency=to_mem_ctrl_latency) {
@@ -400,8 +404,8 @@ machine(Directory, "MESI_CMP_filter_directory protocol")
}
}
- action(z_recycleRequestQueue, "z", desc="recycle request queue") {
- requestNetwork_in.recycle();
+ action(z_stallAndWaitRequest, "z", desc="recycle request queue") {
+ stall_and_wait(requestNetwork_in, address);
}
action(zz_recycleDMAQueue, "zz", desc="recycle DMA queue") {
@@ -502,6 +506,7 @@ machine(Directory, "MESI_CMP_filter_directory protocol")
transition(IM, Memory_Data, M) {
d_sendData;
l_popMemQueue;
+ kd_wakeUpDependents;
}
//added by SS
transition(M, CleanReplacement, I) {
@@ -520,6 +525,7 @@ machine(Directory, "MESI_CMP_filter_directory protocol")
c_clearOwner;
aa_sendAck;
l_popMemQueue;
+ kd_wakeUpDependents;
}
@@ -532,6 +538,7 @@ machine(Directory, "MESI_CMP_filter_directory protocol")
transition(ID, Memory_Data, I) {
dr_sendDMAData;
l_popMemQueue;
+ kd_wakeUpDependents;
}
transition(I, DMA_WRITE, ID_W) {
@@ -543,10 +550,11 @@ machine(Directory, "MESI_CMP_filter_directory protocol")
transition(ID_W, Memory_Ack, I) {
da_sendDMAAck;
l_popMemQueue;
+ kd_wakeUpDependents;
}
transition({ID, ID_W, M_DRDI, M_DWRI, IM, MI}, {Fetch, Data} ) {
- z_recycleRequestQueue;
+ z_stallAndWaitRequest;
}
transition({ID, ID_W, M_DRD, M_DRDI, M_DWR, M_DWRI, IM, MI}, {DMA_WRITE, DMA_READ} ) {
@@ -570,6 +578,7 @@ machine(Directory, "MESI_CMP_filter_directory protocol")
aa_sendAck;
c_clearOwner;
l_popMemQueue;
+ kd_wakeUpDependents;
}
transition(M, DMA_WRITE, M_DWR) {
@@ -591,6 +600,7 @@ machine(Directory, "MESI_CMP_filter_directory protocol")
da_sendDMAAck;
w_deallocateTBE;
l_popMemQueue;
+ kd_wakeUpDependents;
}
}