ruby: allow restoring from checkpoint when using DRAMCtrl

Restoring from a checkpoint with ruby + the DRAMCtrl memory model was not
working, because ruby and DRAMCtrl disagreed on the current tick during warmup.
Since there is no reason to do timing requests during warmup, use functional
requests instead.

Committed by: Nilay Vaish <nilay@cs.wisc.edu>
This commit is contained in:
Lena Olson 2015-04-13 17:33:57 -05:00
parent d6af46915c
commit dea7acdb3e
2 changed files with 19 additions and 1 deletions

View file

@ -40,7 +40,8 @@ AbstractController::AbstractController(const Params *p)
m_transitions_per_cycle(p->transitions_per_cycle),
m_buffer_size(p->buffer_size), m_recycle_latency(p->recycle_latency),
memoryPort(csprintf("%s.memory", name()), this, ""),
m_responseFromMemory_ptr(new MessageBuffer())
m_responseFromMemory_ptr(new MessageBuffer()),
m_rubySystem(p->ruby_system)
{
// Set the sender pointer of the response message buffer from the
// memory controller.
@ -217,6 +218,13 @@ AbstractController::queueMemoryRead(const MachineID &id, Address addr,
SenderState *s = new SenderState(id);
pkt->pushSenderState(s);
// Use functional rather than timing accesses during warmup
if (m_rubySystem->m_warmup_enabled) {
memoryPort.sendFunctional(pkt);
recvTimingResp(pkt);
return;
}
memoryPort.schedTimingReq(pkt, clockEdge(latency));
}
@ -237,6 +245,13 @@ AbstractController::queueMemoryWrite(const MachineID &id, Address addr,
SenderState *s = new SenderState(id);
pkt->pushSenderState(s);
// Use functional rather than timing accesses during warmup
if (m_rubySystem->m_warmup_enabled) {
memoryPort.sendFunctional(pkt);
recvTimingResp(pkt);
return;
}
// Create a block and copy data from the block.
memoryPort.schedTimingReq(pkt, clockEdge(latency));
}

View file

@ -205,6 +205,9 @@ class AbstractController : public MemObject, public Consumer
// memory controller.
MessageBuffer *m_responseFromMemory_ptr;
// Needed so we know if we are warming up
RubySystem *m_rubySystem;
// State that is stored in packets sent to the memory controller.
struct SenderState : public Packet::SenderState
{