diff options
author | Rekai Gonzalez-Alberquilla <rekai.gonzalezalberquilla@arm.com> | 2016-09-22 10:49:10 +0100 |
---|---|---|
committer | Rekai Gonzalez-Alberquilla <rekai.gonzalezalberquilla@arm.com> | 2016-09-22 10:49:10 +0100 |
commit | ad296b068cf4a0b043988be518994ac6bd7582f0 (patch) | |
tree | 584633dffa6806a93d2c2c1a94b90096e3c50d2e /src/cpu/o3 | |
parent | d0ffd2f9b88d6abb29ed861deec12b40bdb7419f (diff) | |
download | gem5-ad296b068cf4a0b043988be518994ac6bd7582f0.tar.xz |
cpu: Fix the O3 CPU Drain
The drain did not wait until stages were ready again. Therefore, as a
result of messages in the TimeBuffer being drain, the state after the
drain was not consistent and asserts fired in some places when the
draining happened after a stage got blocked, but before the notification
arrived to the previous stages.
Change-Id: Ib50b3b40b7f745b62c1eba2931dec76860824c71
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Diffstat (limited to 'src/cpu/o3')
-rw-r--r-- | src/cpu/o3/decode_impl.hh | 3 | ||||
-rw-r--r-- | src/cpu/o3/fetch_impl.hh | 4 | ||||
-rw-r--r-- | src/cpu/o3/iew_impl.hh | 1 | ||||
-rw-r--r-- | src/cpu/o3/rename_impl.hh | 3 |
4 files changed, 8 insertions, 3 deletions
diff --git a/src/cpu/o3/decode_impl.hh b/src/cpu/o3/decode_impl.hh index 4ff82da8e..ca56ac1e4 100644 --- a/src/cpu/o3/decode_impl.hh +++ b/src/cpu/o3/decode_impl.hh @@ -209,7 +209,8 @@ bool DefaultDecode<Impl>::isDrained() const { for (ThreadID tid = 0; tid < numThreads; ++tid) { - if (!insts[tid].empty() || !skidBuffer[tid].empty()) + if (!insts[tid].empty() || !skidBuffer[tid].empty() || + (decodeStatus[tid] != Running && decodeStatus[tid] != Idle)) return false; } return true; diff --git a/src/cpu/o3/fetch_impl.hh b/src/cpu/o3/fetch_impl.hh index 3b29d87d4..7631b4c6a 100644 --- a/src/cpu/o3/fetch_impl.hh +++ b/src/cpu/o3/fetch_impl.hh @@ -424,8 +424,10 @@ template <class Impl> void DefaultFetch<Impl>::drainResume() { - for (ThreadID i = 0; i < numThreads; ++i) + for (ThreadID i = 0; i < numThreads; ++i) { + stalls[i].decode = false; stalls[i].drain = false; + } } template <class Impl> diff --git a/src/cpu/o3/iew_impl.hh b/src/cpu/o3/iew_impl.hh index e02429b14..78b83eba6 100644 --- a/src/cpu/o3/iew_impl.hh +++ b/src/cpu/o3/iew_impl.hh @@ -391,6 +391,7 @@ DefaultIEW<Impl>::isDrained() const DPRINTF(Drain, "%i: Skid buffer not empty.\n", tid); drained = false; } + drained = drained && dispatchStatus[tid] == Running; } // Also check the FU pool as instructions are "stored" in FU diff --git a/src/cpu/o3/rename_impl.hh b/src/cpu/o3/rename_impl.hh index b6ab4cc3a..00179faae 100644 --- a/src/cpu/o3/rename_impl.hh +++ b/src/cpu/o3/rename_impl.hh @@ -304,7 +304,8 @@ DefaultRename<Impl>::isDrained() const if (instsInProgress[tid] != 0 || !historyBuffer[tid].empty() || !skidBuffer[tid].empty() || - !insts[tid].empty()) + !insts[tid].empty() || + (renameStatus[tid] != Idle && renameStatus[tid] != Running)) return false; } return true; |