cpu: Add drain check functionality to IEW

IEW did not check the instQueue and memDepUnit to ensure
they were drained.  This caused issues when drainSanityCheck()
did check those structures after asserting IEW was drained.
This commit is contained in:
Mitch Hayenga 2014-10-29 23:18:26 -05:00
parent b31d9e93e2
commit 6847bbf7ce
5 changed files with 31 additions and 1 deletions

View file

@ -381,7 +381,7 @@ template <class Impl>
bool bool
DefaultIEW<Impl>::isDrained() const DefaultIEW<Impl>::isDrained() const
{ {
bool drained(ldstQueue.isDrained()); bool drained = ldstQueue.isDrained() && instQueue.isDrained();
for (ThreadID tid = 0; tid < numThreads; tid++) { for (ThreadID tid = 0; tid < numThreads; tid++) {
if (!insts[tid].empty()) { if (!insts[tid].empty()) {

View file

@ -145,6 +145,9 @@ class InstructionQueue
/** Sets the global time buffer. */ /** Sets the global time buffer. */
void setTimeBuffer(TimeBuffer<TimeStruct> *tb_ptr); void setTimeBuffer(TimeBuffer<TimeStruct> *tb_ptr);
/** Determine if we are drained. */
bool isDrained() const;
/** Perform sanity checks after a drain. */ /** Perform sanity checks after a drain. */
void drainSanityCheck() const; void drainSanityCheck() const;

View file

@ -440,6 +440,17 @@ InstructionQueue<Impl>::setTimeBuffer(TimeBuffer<TimeStruct> *tb_ptr)
fromCommit = timeBuffer->getWire(-commitToIEWDelay); fromCommit = timeBuffer->getWire(-commitToIEWDelay);
} }
template <class Impl>
bool
InstructionQueue<Impl>::isDrained() const
{
bool drained = dependGraph.empty() && instsToExecute.empty();
for (ThreadID tid = 0; tid < numThreads; ++tid)
drained = drained && memDepUnit[tid].isDrained();
return drained;
}
template <class Impl> template <class Impl>
void void
InstructionQueue<Impl>::drainSanityCheck() const InstructionQueue<Impl>::drainSanityCheck() const

View file

@ -104,6 +104,9 @@ class MemDepUnit
/** Registers statistics. */ /** Registers statistics. */
void regStats(); void regStats();
/** Determine if we are drained. */
bool isDrained() const;
/** Perform sanity checks after a drain. */ /** Perform sanity checks after a drain. */
void drainSanityCheck() const; void drainSanityCheck() const;

View file

@ -127,6 +127,19 @@ MemDepUnit<MemDepPred, Impl>::regStats()
.desc("Number of conflicting stores."); .desc("Number of conflicting stores.");
} }
template <class MemDepPred, class Impl>
bool
MemDepUnit<MemDepPred, Impl>::isDrained() const
{
bool drained = instsToReplay.empty()
&& memDepHash.empty()
&& instsToReplay.empty();
for (int i = 0; i < Impl::MaxThreads; ++i)
drained = drained && instList[i].empty();
return drained;
}
template <class MemDepPred, class Impl> template <class MemDepPred, class Impl>
void void
MemDepUnit<MemDepPred, Impl>::drainSanityCheck() const MemDepUnit<MemDepPred, Impl>::drainSanityCheck() const