summaryrefslogtreecommitdiff
path: root/src/mem/ruby/slicc_interface/AbstractController.cc
diff options
context:
space:
mode:
authorLena Olson <lena@cs.wisc.edu>2015-04-13 17:33:57 -0500
committerLena Olson <lena@cs.wisc.edu>2015-04-13 17:33:57 -0500
commitdea7acdb3e0357e580bc4e15e3346177b58d7ee0 (patch)
tree6f92cb6258100720791c046c66236a59b2a00239 /src/mem/ruby/slicc_interface/AbstractController.cc
parentd6af46915ccb15e5b9c0b951a101e03140ce0b9a (diff)
downloadgem5-dea7acdb3e0357e580bc4e15e3346177b58d7ee0.tar.xz
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>
Diffstat (limited to 'src/mem/ruby/slicc_interface/AbstractController.cc')
-rw-r--r--src/mem/ruby/slicc_interface/AbstractController.cc17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/mem/ruby/slicc_interface/AbstractController.cc b/src/mem/ruby/slicc_interface/AbstractController.cc
index a1d6ab83e..4290c63fa 100644
--- a/src/mem/ruby/slicc_interface/AbstractController.cc
+++ b/src/mem/ruby/slicc_interface/AbstractController.cc
@@ -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));
}