Only respond if the pkt needs a response.
Fix an issue with memory handling writebacks. src/mem/cache/base_cache.hh: src/mem/tport.cc: Only respond if the pkt needs a response. src/mem/physical.cc: Make physical memory respond to writebacks, set satisfied for invalidates/upgrades. --HG-- extra : convert_revision : 7601987a7923e54a6d1a168def4f8133d8de19fd
This commit is contained in:
parent
8a539a774f
commit
e65f0cef3c
3 changed files with 23 additions and 13 deletions
5
src/mem/cache/base_cache.hh
vendored
5
src/mem/cache/base_cache.hh
vendored
|
@ -516,9 +516,11 @@ class BaseCache : public MemObject
|
||||||
*/
|
*/
|
||||||
void respond(Packet *pkt, Tick time)
|
void respond(Packet *pkt, Tick time)
|
||||||
{
|
{
|
||||||
|
if (pkt->needsResponse()) {
|
||||||
CacheEvent *reqCpu = new CacheEvent(cpuSidePort, pkt);
|
CacheEvent *reqCpu = new CacheEvent(cpuSidePort, pkt);
|
||||||
reqCpu->schedule(time);
|
reqCpu->schedule(time);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a reponse to the slave interface and calculate miss latency.
|
* Send a reponse to the slave interface and calculate miss latency.
|
||||||
|
@ -530,9 +532,11 @@ class BaseCache : public MemObject
|
||||||
if (!pkt->req->isUncacheable()) {
|
if (!pkt->req->isUncacheable()) {
|
||||||
missLatency[pkt->cmdToIndex()][0/*pkt->req->getThreadNum()*/] += time - pkt->time;
|
missLatency[pkt->cmdToIndex()][0/*pkt->req->getThreadNum()*/] += time - pkt->time;
|
||||||
}
|
}
|
||||||
|
if (pkt->needsResponse()) {
|
||||||
CacheEvent *reqCpu = new CacheEvent(cpuSidePort, pkt);
|
CacheEvent *reqCpu = new CacheEvent(cpuSidePort, pkt);
|
||||||
reqCpu->schedule(time);
|
reqCpu->schedule(time);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Suppliess the data if cache to cache transfers are enabled.
|
* Suppliess the data if cache to cache transfers are enabled.
|
||||||
|
@ -542,6 +546,7 @@ class BaseCache : public MemObject
|
||||||
{
|
{
|
||||||
// assert("Implement\n" && 0);
|
// assert("Implement\n" && 0);
|
||||||
// mi->respond(pkt,curTick + hitLatency);
|
// mi->respond(pkt,curTick + hitLatency);
|
||||||
|
assert (pkt->needsResponse());
|
||||||
CacheEvent *reqMem = new CacheEvent(memSidePort, pkt);
|
CacheEvent *reqMem = new CacheEvent(memSidePort, pkt);
|
||||||
reqMem->schedule(time);
|
reqMem->schedule(time);
|
||||||
}
|
}
|
||||||
|
|
|
@ -197,22 +197,25 @@ PhysicalMemory::doFunctionalAccess(Packet *pkt)
|
||||||
{
|
{
|
||||||
assert(pkt->getAddr() + pkt->getSize() < params()->addrRange.size());
|
assert(pkt->getAddr() + pkt->getSize() < params()->addrRange.size());
|
||||||
|
|
||||||
switch (pkt->cmd) {
|
if (pkt->isRead()) {
|
||||||
case Packet::ReadReq:
|
|
||||||
if (pkt->req->isLocked()) {
|
if (pkt->req->isLocked()) {
|
||||||
trackLoadLocked(pkt->req);
|
trackLoadLocked(pkt->req);
|
||||||
}
|
}
|
||||||
memcpy(pkt->getPtr<uint8_t>(),
|
memcpy(pkt->getPtr<uint8_t>(),
|
||||||
pmemAddr + pkt->getAddr() - params()->addrRange.start,
|
pmemAddr + pkt->getAddr() - params()->addrRange.start,
|
||||||
pkt->getSize());
|
pkt->getSize());
|
||||||
break;
|
}
|
||||||
case Packet::WriteReq:
|
else if (pkt->isWrite()) {
|
||||||
if (writeOK(pkt->req)) {
|
if (writeOK(pkt->req)) {
|
||||||
memcpy(pmemAddr + pkt->getAddr() - params()->addrRange.start,
|
memcpy(pmemAddr + pkt->getAddr() - params()->addrRange.start,
|
||||||
pkt->getPtr<uint8_t>(), pkt->getSize());
|
pkt->getPtr<uint8_t>(), pkt->getSize());
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
default:
|
else if (pkt->isInvalidate()) {
|
||||||
|
//upgrade or invalidate
|
||||||
|
pkt->flags |= SATISFIED;
|
||||||
|
}
|
||||||
|
else {
|
||||||
panic("unimplemented");
|
panic("unimplemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,9 +47,11 @@ SimpleTimingPort::recvTiming(Packet *pkt)
|
||||||
// if we ever added it back.
|
// if we ever added it back.
|
||||||
assert(pkt->result != Packet::Nacked);
|
assert(pkt->result != Packet::Nacked);
|
||||||
Tick latency = recvAtomic(pkt);
|
Tick latency = recvAtomic(pkt);
|
||||||
// turn packet around to go back to requester
|
// turn packet around to go back to requester if response expected
|
||||||
|
if (pkt->needsResponse()) {
|
||||||
pkt->makeTimingResponse();
|
pkt->makeTimingResponse();
|
||||||
sendTimingLater(pkt, latency);
|
sendTimingLater(pkt, latency);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue