ruby: adds reset function to Ruby memory controllers
authorNuwan Jayasena <Nuwan.Jayasena@amd.com>
Wed, 11 Jul 2012 05:51:54 +0000 (22:51 -0700)
committerNuwan Jayasena <Nuwan.Jayasena@amd.com>
Wed, 11 Jul 2012 05:51:54 +0000 (22:51 -0700)
src/mem/ruby/system/MemoryControl.cc
src/mem/ruby/system/MemoryControl.hh
src/mem/ruby/system/RubyMemoryControl.cc
src/mem/ruby/system/RubyMemoryControl.hh
src/mem/ruby/system/System.cc
src/mem/ruby/system/System.hh

index cf6a618e0b39a7bcf48d8445d3b6b5cb31d794fa..c3b34d96560b202591d5d8556f062647c729719a 100644 (file)
 #include "mem/ruby/system/System.hh"
 
 using namespace std;
-MemoryControl::MemoryControl(const Params *p) : SimObject(p), m_event(this) {};
+MemoryControl::MemoryControl(const Params *p) : SimObject(p), m_event(this)
+{
+    g_system_ptr->registerMemController(this);
+}
+
 MemoryControl::~MemoryControl() {};
 
 RubyMemoryControl *
index eb3de8aef6316a987af2246ebba5478c30da0ed3..7e35ef7a062c926bd48739496ef39800c736b1f1 100644 (file)
@@ -53,6 +53,7 @@ class MemoryControl :
   public:
     MemoryControl(const Params *p);
     virtual void init() = 0;
+    virtual void reset() = 0;
 
     ~MemoryControl();
 
index e777762e3154372bac14a802870b3a1adbb6126d..4879f4fa630e7df2984b92fc9e571cf39b0b5c61 100644 (file)
@@ -222,6 +222,50 @@ RubyMemoryControl::init()
         m_tfaw_count[i] = 0;
     }
 }
+void
+RubyMemoryControl::reset()
+{
+    m_msg_counter = 0;
+
+    assert(m_tFaw <= 62); // must fit in a uint64 shift register
+
+    m_total_banks = m_banks_per_rank * m_ranks_per_dimm * m_dimms_per_channel;
+    m_total_ranks = m_ranks_per_dimm * m_dimms_per_channel;
+    m_refresh_period_system = m_refresh_period / m_total_banks;
+
+    assert(m_bankQueues);
+
+    assert(m_bankBusyCounter);
+
+    assert(m_oldRequest);
+
+    for (int i = 0; i < m_total_banks; i++) {
+        m_bankBusyCounter[i] = 0;
+        m_oldRequest[i] = 0;
+    }
+
+    m_busBusyCounter_Basic = 0;
+    m_busBusyCounter_Write = 0;
+    m_busBusyCounter_ReadNewRank = 0;
+    m_busBusy_WhichRank = 0;
+
+    m_roundRobin = 0;
+    m_refresh_count = 1;
+    m_need_refresh = 0;
+    m_refresh_bank = 0;
+    m_idleCount = 0;
+    m_ageCounter = 0;
+
+    // Each tfaw shift register keeps a moving bit pattern
+    // which shows when recent activates have occurred.
+    // m_tfaw_count keeps track of how many 1 bits are set
+    // in each shift register.  When m_tfaw_count is >= 4,
+    // new activates are not allowed.
+    for (int i = 0; i < m_total_ranks; i++) {
+        m_tfaw_shift[i] = 0;
+        m_tfaw_count[i] = 0;
+    }
+}
 
 RubyMemoryControl::~RubyMemoryControl()
 {
index 2480865ea6f35309da65768708ef995a1b2fbc5d..af915c8073fe6ea600f409d479be05d82e6845c0 100644 (file)
@@ -59,6 +59,7 @@ class RubyMemoryControl : public MemoryControl
     typedef RubyMemoryControlParams Params;
     RubyMemoryControl(const Params *p);
     void init();
+    void reset();
 
     ~RubyMemoryControl();
 
index 078e3549268aca2330740ae766e2afaeca1643b6..3efa74a6a017cffdb57ee353f4529a240440c26e 100644 (file)
@@ -125,6 +125,11 @@ RubySystem::registerSparseMemory(SparseMemory* s)
     m_sparse_memory_vector.push_back(s);
 }
 
+void
+RubySystem::registerMemController(MemoryControl *mc) {
+    m_memory_controller = mc;
+}
+
 RubySystem::~RubySystem()
 {
     delete m_network_ptr;
@@ -390,6 +395,8 @@ RubySystem::startup()
         delete m_cache_recorder;
         m_cache_recorder = NULL;
         m_warmup_enabled = false;
+        // reset DRAM
+        m_memory_controller->reset();
         // Restore eventq head
         eventq_head = eventq->replaceHead(eventq_head);
         // Restore curTick
index d7d01bcacf4b178533b2c033fa98d7bb64dc0561..3d86c3e02088ed8e96e22d67386edfef82796e2d 100644 (file)
@@ -47,6 +47,7 @@
 
 class Network;
 class Profiler;
+class MemoryControl;
 
 class RubySystem : public SimObject
 {
@@ -128,6 +129,7 @@ class RubySystem : public SimObject
     void registerProfiler(Profiler*);
     void registerAbstractController(AbstractController*);
     void registerSparseMemory(SparseMemory*);
+    void registerMemController(MemoryControl *mc);
 
     bool eventQueueEmpty() { return eventq->empty(); }
     void enqueueRubyEvent(Tick tick)
@@ -161,6 +163,8 @@ class RubySystem : public SimObject
     static int m_memory_size_bits;
     static Network* m_network_ptr;
 
+    MemoryControl *m_memory_controller;
+
   public:
     static Profiler* m_profiler_ptr;
     static MemoryVector* m_mem_vec_ptr;