diff options
-rw-r--r-- | src/mem/cache/mshr.hh | 10 | ||||
-rw-r--r-- | src/mem/cache/mshr_queue.cc | 13 | ||||
-rw-r--r-- | src/mem/cache/mshr_queue.hh | 11 |
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. * |