Ruby Memory Controller: Fix clocking
authorJoel Hestness <hestness@cs.wisc.edu>
Thu, 6 Sep 2012 01:51:41 +0000 (20:51 -0500)
committerJoel Hestness <hestness@cs.wisc.edu>
Thu, 6 Sep 2012 01:51:41 +0000 (20:51 -0500)
src/mem/ruby/system/MemoryControl.cc
src/mem/ruby/system/MemoryControl.hh
src/mem/ruby/system/MemoryControl.py
src/mem/ruby/system/RubyMemoryControl.cc
src/mem/ruby/system/RubyMemoryControl.hh
src/mem/ruby/system/RubyMemoryControl.py

index c5f6ecb8399e3e58a4a8d75883196dc221d3269d..f1ebc07fa5ddbf4369c3b9abaeb3c32fa8de0f67 100644 (file)
@@ -42,7 +42,7 @@
 #include "mem/ruby/system/System.hh"
 
 using namespace std;
-MemoryControl::MemoryControl(const Params *p) : SimObject(p), m_event(this)
+MemoryControl::MemoryControl(const Params *p) : ClockedObject(p), m_event(this)
 {
     g_system_ptr->registerMemController(this);
 }
index 80a55e9c123315bd5235eabda5a75466eb684220..b7de06c5efc2129802232b84096b1dc18483200b 100644 (file)
 #include <list>
 #include <string>
 
-#include "mem/protocol/MemoryMsg.hh"
 #include "mem/protocol/MemoryControlRequestType.hh"
+#include "mem/protocol/MemoryMsg.hh"
 #include "mem/ruby/common/Consumer.hh"
 #include "mem/ruby/profiler/MemCntrlProfiler.hh"
 #include "mem/ruby/slicc_interface/Message.hh"
 #include "mem/ruby/system/AbstractMemOrCache.hh"
 #include "mem/ruby/system/MemoryNode.hh"
 #include "mem/ruby/system/System.hh"
-#include "sim/sim_object.hh"
+#include "params/MemoryControl.hh"
+#include "sim/clocked_object.hh"
 
 //////////////////////////////////////////////////////////////////////////////
 
 class Consumer;
 
 class MemoryControl :
-    public SimObject, public Consumer, public AbstractMemOrCache
+    public ClockedObject, public Consumer, public AbstractMemOrCache
 {
   public:
+    typedef MemoryControlParams Params;
+    const Params *params() const
+    { return dynamic_cast<const Params *>(_params); }
+
     MemoryControl(const Params *p);
     virtual void init() = 0;
     virtual void reset() = 0;
index c4c8529329714a2299444d92ad3d6117c1fbd1c4..09c940fee1790d2f32bc4e750a6c7f98233e0f08 100644 (file)
 #          Brad Beckmann
 
 from m5.params import *
-from m5.SimObject import SimObject
+from ClockedObject import ClockedObject
 
-class MemoryControl(SimObject):
+class MemoryControl(ClockedObject):
     abstract = True
     type = 'MemoryControl'
     cxx_class = 'MemoryControl'
     version = Param.Int("");
     ruby_system = Param.RubySystem("")
-
-    mem_bus_cycle_multiplier = Param.Int(10, "");
index 230f652c2587ec2e93bccedfa5d0b68d619d665c..f931e4618dbcbaee6c351d268d0dc9c94f842b7f 100644 (file)
@@ -149,7 +149,6 @@ operator<<(ostream& out, const RubyMemoryControl& obj)
 RubyMemoryControl::RubyMemoryControl(const Params *p)
     : MemoryControl(p)
 {
-    m_mem_bus_cycle_multiplier = p->mem_bus_cycle_multiplier;
     m_banks_per_rank = p->banks_per_rank;
     m_ranks_per_dimm = p->ranks_per_dimm;
     m_dimms_per_channel = p->dimms_per_channel;
@@ -309,7 +308,7 @@ RubyMemoryControl::enqueueMemRef(MemoryNode& memRef)
     m_input_queue.push_back(memRef);
 
     if (!m_event.scheduled()) {
-        schedule(m_event, curTick() + 1);
+        schedule(m_event, nextCycle());
     }
 }
 
@@ -377,17 +376,17 @@ RubyMemoryControl::printStats(ostream& out) const
 void
 RubyMemoryControl::enqueueToDirectory(MemoryNode req, int latency)
 {
-    Time arrival_time = g_system_ptr->getTime()
-        + (latency * m_mem_bus_cycle_multiplier);
-    req.m_time = arrival_time;
+    Time arrival_time = curTick() + (latency * clock);
+    Time ruby_arrival_time = arrival_time / g_system_ptr->getClock();
+    req.m_time = ruby_arrival_time;
     m_response_queue.push_back(req);
 
     DPRINTF(RubyMemory, "Enqueueing msg %#08x %c back to directory at %15d\n",
             req.m_addr, req.m_is_mem_read ? 'R':'W',
-            arrival_time * g_system_ptr->getClock());
+            arrival_time);
 
     // schedule the wake up
-    m_consumer_ptr->scheduleEventAbsolute(arrival_time);
+    m_consumer_ptr->scheduleEventAbsolute(ruby_arrival_time);
 }
 
 // getBank returns an integer that is unique for each
@@ -705,7 +704,7 @@ RubyMemoryControl::wakeup()
     m_idleCount--;
     if (m_idleCount > 0) {
         assert(!m_event.scheduled());
-        schedule(m_event, curTick() + m_mem_bus_cycle_multiplier);
+        schedule(m_event, curTick() + clock);
     }
 }
 
index 512533f976d8c1e415112d7b9b012df9999e348c..de0da56b504f6bc79c1f9affd65d13583da9276e 100644 (file)
@@ -116,7 +116,6 @@ class RubyMemoryControl : public MemoryControl
     std::string m_description;
     int m_msg_counter;
 
-    int m_mem_bus_cycle_multiplier;
     int m_banks_per_rank;
     int m_ranks_per_dimm;
     int m_dimms_per_channel;
index f79ed9b18e43fe3b2749eeb8b83ca66b73e615a3..e65b6f5ccd5994f2c35695ec17c66fa030567a89 100644 (file)
@@ -36,6 +36,8 @@ class RubyMemoryControl(MemoryControl):
     cxx_class = 'RubyMemoryControl'
     version = Param.Int("");
 
+    # Override the default clock
+    clock = '400MHz'
     banks_per_rank = Param.Int(8, "");
     ranks_per_dimm = Param.Int(2, "");
     dimms_per_channel = Param.Int(2, "");