Tiago Muck has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/56811 )

Change subject: cpu: fix issues with ruby's memtest
......................................................................

cpu: fix issues with ruby's memtest

If the size of the address range is smaller than the maximum number
of outstanding requests allowed downstream, the tester will get stuck
trying to find a unique address. This patch adds a check for this
condition and forces the tester to wait for responses before
trying to generate another request.

Change-Id: Ie894a074cc4f8c7ad3d875dc21e8eb4f04562d72
Signed-off-by: Tiago Mück <tiago.m...@arm.com>
---
M src/cpu/testers/memtest/memtest.cc
M src/cpu/testers/memtest/memtest.hh
2 files changed, 39 insertions(+), 1 deletion(-)



diff --git a/src/cpu/testers/memtest/memtest.cc b/src/cpu/testers/memtest/memtest.cc
index f229cab..7c256d8 100644
--- a/src/cpu/testers/memtest/memtest.cc
+++ b/src/cpu/testers/memtest/memtest.cc
@@ -88,6 +88,7 @@
       noResponseEvent([this]{ noResponse(); }, name()),
       port("port", *this),
       retryPkt(nullptr),
+      waitResponse(false),
       size(p.size),
       interval(p.interval),
       percentReads(p.percent_reads),
@@ -96,6 +97,7 @@
       requestorId(p.system->getRequestorId(this)),
       blockSize(p.system->cacheLineSize()),
       blockAddrMask(blockSize - 1),
+      sizeBlocks(size / blockSize),
       baseAddr1(p.base_addr_1),
       baseAddr2(p.base_addr_2),
       uncacheAddr(p.uncacheable_base_addr),
@@ -191,6 +193,12 @@
         reschedule(noResponseEvent, clockEdge(progressCheck));
     else if (noResponseEvent.scheduled())
         deschedule(noResponseEvent);
+
+    // schedule the next tick
+    if (waitResponse) {
+        waitResponse = false;
+        schedule(tickEvent, clockEdge(interval));
+    }
 }
 MemTest::MemTestStats::MemTestStats(statistics::Group *parent)
       : statistics::Group(parent),
@@ -205,8 +213,9 @@
 void
 MemTest::tick()
 {
-    // we should never tick if we are waiting for a retry
+    // we should never tick if we are waiting for a retry or response
     assert(!retryPkt);
+    assert(!waitResponse);

     // create a new request
     unsigned cmd = random_mt.random(0, 100);
@@ -216,6 +225,13 @@
     Request::Flags flags;
     Addr paddr;

+ // halt until we clear outstanding requests, otherwise it won't be able to
+    // find a new unique address
+    if (outstandingAddrs.size() >= sizeBlocks) {
+        waitResponse = true;
+        return;
+    }
+
     // generate a unique address
     do {
         unsigned offset = random_mt.random<unsigned>(0, size - 1);
diff --git a/src/cpu/testers/memtest/memtest.hh b/src/cpu/testers/memtest/memtest.hh
index 2e7824e..2dc1f13 100644
--- a/src/cpu/testers/memtest/memtest.hh
+++ b/src/cpu/testers/memtest/memtest.hh
@@ -120,6 +120,10 @@

     PacketPtr retryPkt;

+    // Set if reached the maximum number of outstanding requests.
+    // Won't tick until a response is received.
+    bool waitResponse;
+
     const unsigned size;

     const Cycles interval;
@@ -142,6 +146,8 @@

     const Addr blockAddrMask;

+    const unsigned sizeBlocks;
+
     /**
      * Get the block aligned address.
      *

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/56811
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: Ie894a074cc4f8c7ad3d875dc21e8eb4f04562d72
Gerrit-Change-Number: 56811
Gerrit-PatchSet: 1
Gerrit-Owner: Tiago Muck <tiago.m...@arm.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to