diff options
author | Nilay Vaish <nilay@cs.wisc.edu> | 2012-02-10 11:05:24 -0600 |
---|---|---|
committer | Nilay Vaish <nilay@cs.wisc.edu> | 2012-02-10 11:05:24 -0600 |
commit | 69d8600bf80ce065feccbac6d55e45db62f1654f (patch) | |
tree | 6d7758703a28417873a77bbd88c9f006ed191420 /src/mem/protocol/MESI_CMP_directory-dir.sm | |
parent | 72f3f526fc327f2030fe2f44844e783f763ef6e3 (diff) | |
download | gem5-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.sm | 24 |
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; } } |