summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mem/cache/mshr.hh10
-rw-r--r--src/mem/cache/mshr_queue.cc13
-rw-r--r--src/mem/cache/mshr_queue.hh11
3 files changed, 32 insertions, 2 deletions
diff --git a/src/mem/cache/mshr.hh b/src/mem/cache/mshr.hh
index 56b81b6b2..b94dfb9c5 100644
--- a/src/mem/cache/mshr.hh
+++ b/src/mem/cache/mshr.hh
@@ -514,6 +514,16 @@ class MSHR : public QueueEntry, public Printable
bool trySatisfyFunctional(PacketPtr pkt);
/**
+ * Adds a delay relative to the current tick to the current MSHR
+ * @param delay_ticks the desired delay in ticks
+ */
+ void delay(Tick delay_ticks)
+ {
+ assert(readyTime <= curTick());
+ readyTime = curTick() + delay_ticks;
+ }
+
+ /**
* Prints the contents of this MSHR for debugging.
*/
void print(std::ostream &os,
diff --git a/src/mem/cache/mshr_queue.cc b/src/mem/cache/mshr_queue.cc
index e44a21954..f4b80540c 100644
--- a/src/mem/cache/mshr_queue.cc
+++ b/src/mem/cache/mshr_queue.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2013, 2015-2016 ARM Limited
+ * Copyright (c) 2012-2013, 2015-2016, 2018 ARM Limited
* All rights reserved.
*
* The license below extends only to copyright in the software and shall
@@ -85,6 +85,17 @@ MSHRQueue::moveToFront(MSHR *mshr)
}
void
+MSHRQueue::delay(MSHR *mshr, Tick delay_ticks)
+{
+ mshr->delay(delay_ticks);
+ auto it = std::find_if(mshr->readyIter, readyList.end(),
+ [mshr] (const MSHR* _mshr) {
+ return mshr->readyTime >= _mshr->readyTime;
+ });
+ readyList.splice(it, readyList, mshr->readyIter);
+}
+
+void
MSHRQueue::markInService(MSHR *mshr, bool pending_modified_resp)
{
mshr->markInService(pending_modified_resp);
diff --git a/src/mem/cache/mshr_queue.hh b/src/mem/cache/mshr_queue.hh
index 1b960a5a2..1e4eaeb51 100644
--- a/src/mem/cache/mshr_queue.hh
+++ b/src/mem/cache/mshr_queue.hh
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2013, 2015-2016 ARM Limited
+ * Copyright (c) 2012-2013, 2015-2016, 2018 ARM Limited
* All rights reserved.
*
* The license below extends only to copyright in the software and shall
@@ -107,6 +107,15 @@ class MSHRQueue : public Queue<MSHR>
void moveToFront(MSHR *mshr);
/**
+ * Adds a delay to the provided MSHR and moves MSHRs that will be
+ * ready earlier than this entry to the top of the list
+ *
+ * @param mshr that needs to be delayed
+ * @param delay_ticks ticks of the desired delay
+ */
+ void delay(MSHR *mshr, Tick delay_ticks);
+
+ /**
* Mark the given MSHR as in service. This removes the MSHR from the
* readyList or deallocates the MSHR if it does not expect a response.
*