CPU: Fix bug when a split transaction is issued to a faster cache
In the case of a split transaction and a cache that is faster than a CPU we could get two responses before next_tick expires. Add an event that is scheduled in this case and return false rather than asserting.
This commit is contained in:
parent
265e145db2
commit
16f210da37
2 changed files with 13 additions and 2 deletions
|
@ -999,7 +999,16 @@ TimingSimpleCPU::DcachePort::recvTiming(PacketPtr pkt)
|
|||
if (next_tick == curTick) {
|
||||
cpu->completeDataAccess(pkt);
|
||||
} else {
|
||||
tickEvent.schedule(pkt, next_tick);
|
||||
if (!tickEvent.scheduled()) {
|
||||
tickEvent.schedule(pkt, next_tick);
|
||||
} else {
|
||||
// In the case of a split transaction and a cache that is
|
||||
// faster than a CPU we could get two responses before
|
||||
// next_tick expires
|
||||
if (!retryEvent.scheduled())
|
||||
schedule(retryEvent, next_tick);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
@ -140,7 +140,7 @@ class TimingSimpleCPU : public BaseSimpleCPU
|
|||
public:
|
||||
|
||||
CpuPort(const std::string &_name, TimingSimpleCPU *_cpu, Tick _lat)
|
||||
: Port(_name, _cpu), cpu(_cpu), lat(_lat)
|
||||
: Port(_name, _cpu), cpu(_cpu), lat(_lat), retryEvent(this)
|
||||
{ }
|
||||
|
||||
bool snoopRangeSent;
|
||||
|
@ -161,12 +161,14 @@ class TimingSimpleCPU : public BaseSimpleCPU
|
|||
{
|
||||
PacketPtr pkt;
|
||||
TimingSimpleCPU *cpu;
|
||||
CpuPort *port;
|
||||
|
||||
TickEvent(TimingSimpleCPU *_cpu) : cpu(_cpu) {}
|
||||
const char *description() const { return "Timing CPU tick"; }
|
||||
void schedule(PacketPtr _pkt, Tick t);
|
||||
};
|
||||
|
||||
EventWrapper<Port, &Port::sendRetry> retryEvent;
|
||||
};
|
||||
|
||||
class IcachePort : public CpuPort
|
||||
|
|
Loading…
Reference in a new issue