diff --git a/src/mem/ruby/slicc_interface/AbstractController.cc b/src/mem/ruby/slicc_interface/AbstractController.cc index c7f22a60a3..396b128e42 100644 --- a/src/mem/ruby/slicc_interface/AbstractController.cc +++ b/src/mem/ruby/slicc_interface/AbstractController.cc @@ -61,6 +61,7 @@ AbstractController::AbstractController(const Params &p) m_transitions_per_cycle(p.transitions_per_cycle), m_buffer_size(p.buffer_size), m_recycle_latency(p.recycle_latency), m_mandatory_queue_latency(p.mandatory_queue_latency), + m_waiting_mem_retry(false), memoryPort(csprintf("%s.memory", name()), this), addrRanges(p.addr_ranges.begin(), p.addr_ranges.end()), stats(this) @@ -255,7 +256,7 @@ AbstractController::serviceMemoryQueue() { auto mem_queue = getMemReqQueue(); assert(mem_queue); - if (!mem_queue->isReady(clockEdge())) { + if (m_waiting_mem_retry || !mem_queue->isReady(clockEdge())) { return false; } @@ -301,6 +302,7 @@ AbstractController::serviceMemoryQueue() scheduleEvent(Cycles(1)); } else { scheduleEvent(Cycles(1)); + m_waiting_mem_retry = true; delete pkt; delete s; } @@ -441,6 +443,7 @@ AbstractController::MemoryPort::recvTimingResp(PacketPtr pkt) void AbstractController::MemoryPort::recvReqRetry() { + controller->m_waiting_mem_retry = false; controller->serviceMemoryQueue(); } diff --git a/src/mem/ruby/slicc_interface/AbstractController.hh b/src/mem/ruby/slicc_interface/AbstractController.hh index 3fe220582a..56c164f06f 100644 --- a/src/mem/ruby/slicc_interface/AbstractController.hh +++ b/src/mem/ruby/slicc_interface/AbstractController.hh @@ -328,6 +328,7 @@ class AbstractController : public ClockedObject, public Consumer const unsigned int m_buffer_size; Cycles m_recycle_latency; const Cycles m_mandatory_queue_latency; + bool m_waiting_mem_retry; /** * Port that forwards requests and receives responses from the