changeset 34df8f24be7e in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=34df8f24be7e
description:
        ruby: consumer: avoid using receiver side clock
        A set of patches was recently committed to allow multiple clock domains
        in ruby. In those patches, I had inadvertently made an incorrect use of
        the clocks. Suppose object A needs to schedule an event on object B. It
        was possible that A accesses B's clock to schedule the event. This is 
not
        possible in actual system. Hence, changes are being to the Consumer 
class
        so as to avoid such happenings. Note that in a multi eventq simulation,
        this can possibly lead to an incorrect simulation.

        There are two functions in the Consumer class that are used for 
scheduling
        events. The first function takes in the relative delay over the current 
time
        as the argument and adds the current time to it for scheduling the 
event.
        The second function takes in the absolute time (in ticks) for 
scheduling the
        event. The first function is now being moved to protected section of the
        class so that only objects of the derived classes can use it. All other
        objects will have to specify absolute time while scheduling an event
        for some consumer.

diffstat:

 src/mem/ruby/buffers/MessageBuffer.cc                             |  13 
++++++---
 src/mem/ruby/common/Consumer.cc                                   |   8 +----
 src/mem/ruby/common/Consumer.hh                                   |   4 ++-
 src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh         |   2 +-
 src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc  |   6 +++-
 src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.cc       |   2 +-
 src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.hh        |   2 +-
 src/mem/ruby/network/garnet/fixed-pipeline/Router_d.cc            |   6 ++--
 src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc |   3 +-
 src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.cc      |   3 +-
 src/mem/ruby/network/garnet/flexible-pipeline/Router.cc           |   8 +++--
 src/mem/ruby/system/RubyMemoryControl.cc                          |   2 +-
 src/mem/ruby/system/TimerTable.cc                                 |   3 +-
 src/mem/ruby/system/WireBuffer.cc                                 |   6 +++-
 14 files changed, 39 insertions(+), 29 deletions(-)

diffs (277 lines):

diff -r e95479c2926f -r 34df8f24be7e src/mem/ruby/buffers/MessageBuffer.cc
--- a/src/mem/ruby/buffers/MessageBuffer.cc     Fri Mar 22 15:53:25 2013 -0500
+++ b/src/mem/ruby/buffers/MessageBuffer.cc     Fri Mar 22 15:53:26 2013 -0500
@@ -231,7 +231,8 @@
 
     // Schedule the wakeup
     if (m_consumer_ptr != NULL) {
-        m_consumer_ptr->scheduleEventAbsolute(arrival_time);
+        m_consumer_ptr->scheduleEventAbsolute(
+                arrival_time * m_receiver_ptr->clockPeriod());
         m_consumer_ptr->storeEventInfo(m_vnet_id);
     } else {
         panic("No consumer: %s name: %s\n", *this, m_name);
@@ -312,8 +313,8 @@
     m_prio_heap.back() = node;
     push_heap(m_prio_heap.begin(), m_prio_heap.end(),
         greater<MessageBufferNode>());
-    m_consumer_ptr->scheduleEventAbsolute(m_receiver_ptr->curCycle() +
-                                          m_recycle_latency);
+    m_consumer_ptr->
+        scheduleEventAbsolute(m_receiver_ptr->clockEdge(m_recycle_latency));
 }
 
 void
@@ -336,7 +337,8 @@
         push_heap(m_prio_heap.begin(), m_prio_heap.end(),
                   greater<MessageBufferNode>());
 
-        m_consumer_ptr->scheduleEventAbsolute(msgNode.m_time);
+        m_consumer_ptr->
+            scheduleEventAbsolute(m_receiver_ptr->clockPeriod() * nextCycle);
         m_stall_msg_map[addr].pop_front();
     }
     m_stall_msg_map.erase(addr);
@@ -365,7 +367,8 @@
             push_heap(m_prio_heap.begin(), m_prio_heap.end(),
                       greater<MessageBufferNode>());
 
-            m_consumer_ptr->scheduleEventAbsolute(msgNode.m_time);
+            m_consumer_ptr->
+                scheduleEventAbsolute(m_receiver_ptr->clockPeriod() * 
nextCycle);
             (map_iter->second).pop_front();
         }
     }
diff -r e95479c2926f -r 34df8f24be7e src/mem/ruby/common/Consumer.cc
--- a/src/mem/ruby/common/Consumer.cc   Fri Mar 22 15:53:25 2013 -0500
+++ b/src/mem/ruby/common/Consumer.cc   Fri Mar 22 15:53:26 2013 -0500
@@ -31,19 +31,15 @@
 void
 Consumer::scheduleEvent(Cycles timeDelta)
 {
-    timeDelta += em->curCycle();
-    scheduleEventAbsolute(timeDelta);
+    scheduleEventAbsolute(em->clockEdge(timeDelta));
 }
 
 void
-Consumer::scheduleEventAbsolute(Cycles timeAbs)
+Consumer::scheduleEventAbsolute(Tick evt_time)
 {
-    Tick evt_time = em->clockPeriod() * timeAbs;
     if (!alreadyScheduled(evt_time)) {
         // This wakeup is not redundant
         ConsumerEvent *evt = new ConsumerEvent(this);
-        assert(timeAbs > em->curCycle());
-
         em->schedule(evt, evt_time);
         insertScheduledWakeupTime(evt_time);
     }
diff -r e95479c2926f -r 34df8f24be7e src/mem/ruby/common/Consumer.hh
--- a/src/mem/ruby/common/Consumer.hh   Fri Mar 22 15:53:25 2013 -0500
+++ b/src/mem/ruby/common/Consumer.hh   Fri Mar 22 15:53:26 2013 -0500
@@ -87,8 +87,10 @@
         m_scheduled_wakeups.erase(time);
     }
 
+    void scheduleEventAbsolute(Tick timeAbs);
+
+  protected:
     void scheduleEvent(Cycles timeDelta);
-    void scheduleEventAbsolute(Cycles timeAbs);
 
   private:
     Tick m_last_scheduled_wakeup;
diff -r e95479c2926f -r 34df8f24be7e 
src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh
--- a/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh Fri Mar 22 
15:53:25 2013 -0500
+++ b/src/mem/ruby/network/garnet/fixed-pipeline/InputUnit_d.hh Fri Mar 22 
15:53:26 2013 -0500
@@ -90,7 +90,7 @@
     {
         flit_d *t_flit = new flit_d(in_vc, free_signal, curTime);
         creditQueue->insert(t_flit);
-        m_credit_link->scheduleEvent(Cycles(1));
+        m_credit_link->scheduleEventAbsolute(m_router->clockEdge(Cycles(1)));
     }
 
     inline int
diff -r e95479c2926f -r 34df8f24be7e 
src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc
--- a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc  Fri Mar 
22 15:53:25 2013 -0500
+++ b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc  Fri Mar 
22 15:53:26 2013 -0500
@@ -254,7 +254,8 @@
         flit_d *credit_flit = new flit_d(t_flit->get_vc(), free_signal,
                                          m_net_ptr->curCycle());
         creditQueue->insert(credit_flit);
-        m_ni_credit_link->scheduleEvent(Cycles(1));
+        m_ni_credit_link->
+            scheduleEventAbsolute(m_net_ptr->clockEdge(Cycles(1)));
 
         int vnet = t_flit->get_vnet();
         m_net_ptr->increment_received_flits(vnet);
@@ -328,7 +329,8 @@
             t_flit->set_time(m_net_ptr->curCycle() + Cycles(1));
             outSrcQueue->insert(t_flit);
             // schedule the out link
-            outNetLink->scheduleEvent(Cycles(1));
+            outNetLink->
+                scheduleEventAbsolute(m_net_ptr->clockEdge(Cycles(1)));
 
             if (t_flit->get_type() == TAIL_ ||
                t_flit->get_type() == HEAD_TAIL_) {
diff -r e95479c2926f -r 34df8f24be7e 
src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.cc
--- a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.cc       Fri Mar 
22 15:53:25 2013 -0500
+++ b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkLink_d.cc       Fri Mar 
22 15:53:26 2013 -0500
@@ -70,7 +70,7 @@
         flit_d *t_flit = link_srcQueue->getTopFlit();
         t_flit->set_time(curCycle() + m_latency);
         linkBuffer->insert(t_flit);
-        link_consumer->scheduleEvent(m_latency);
+        link_consumer->scheduleEventAbsolute(clockEdge(m_latency));
         m_link_utilized++;
         m_vc_load[t_flit->get_vc()]++;
     }
diff -r e95479c2926f -r 34df8f24be7e 
src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.hh
--- a/src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.hh        Fri Mar 
22 15:53:25 2013 -0500
+++ b/src/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.hh        Fri Mar 
22 15:53:26 2013 -0500
@@ -84,7 +84,7 @@
     insert_flit(flit_d *t_flit)
     {
         m_out_buffer->insert(t_flit);
-        m_out_link->scheduleEvent(Cycles(1));
+        m_out_link->scheduleEventAbsolute(m_router->clockEdge(Cycles(1)));
     }
 
     uint32_t functionalWrite(Packet *pkt);
diff -r e95479c2926f -r 34df8f24be7e 
src/mem/ruby/network/garnet/fixed-pipeline/Router_d.cc
--- a/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.cc    Fri Mar 22 
15:53:25 2013 -0500
+++ b/src/mem/ruby/network/garnet/fixed-pipeline/Router_d.cc    Fri Mar 22 
15:53:26 2013 -0500
@@ -135,13 +135,13 @@
 void
 Router_d::vcarb_req()
 {
-    m_vc_alloc->scheduleEvent(Cycles(1));
+    m_vc_alloc->scheduleEventAbsolute(clockEdge(Cycles(1)));
 }
 
 void
 Router_d::swarb_req()
 {
-    m_sw_alloc->scheduleEvent(Cycles(1));
+    m_sw_alloc->scheduleEventAbsolute(clockEdge(Cycles(1)));
 }
 
 void
@@ -154,7 +154,7 @@
 Router_d::update_sw_winner(int inport, flit_d *t_flit)
 {
     m_switch->update_sw_winner(inport, t_flit);
-    m_switch->scheduleEvent(Cycles(1));
+    m_switch->scheduleEventAbsolute(clockEdge(Cycles(1)));
 }
 
 void
diff -r e95479c2926f -r 34df8f24be7e 
src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc
--- a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc Fri Mar 
22 15:53:25 2013 -0500
+++ b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc Fri Mar 
22 15:53:26 2013 -0500
@@ -321,7 +321,8 @@
                 outSrcQueue->insert(t_flit);
 
                 // schedule the out link
-                outNetLink->scheduleEvent(Cycles(1));
+                outNetLink->
+                    scheduleEventAbsolute(m_net_ptr->clockEdge(Cycles(1)));
                 return;
             }
         }
diff -r e95479c2926f -r 34df8f24be7e 
src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.cc
--- a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.cc      Fri Mar 
22 15:53:25 2013 -0500
+++ b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkLink.cc      Fri Mar 
22 15:53:26 2013 -0500
@@ -140,7 +140,8 @@
     flit *t_flit = link_srcQueue->getTopFlit();
     t_flit->set_time(curCycle() + m_latency);
     linkBuffer->insert(t_flit);
-    link_consumer->scheduleEvent(m_latency);
+    link_consumer->scheduleEventAbsolute(clockEdge(m_latency));
+
     m_link_utilized++;
     m_vc_load[t_flit->get_vc()]++;
 }
diff -r e95479c2926f -r 34df8f24be7e 
src/mem/ruby/network/garnet/flexible-pipeline/Router.cc
--- a/src/mem/ruby/network/garnet/flexible-pipeline/Router.cc   Fri Mar 22 
15:53:25 2013 -0500
+++ b/src/mem/ruby/network/garnet/flexible-pipeline/Router.cc   Fri Mar 22 
15:53:26 2013 -0500
@@ -139,7 +139,7 @@
     m_in_vc_state[in_port][in_vc]->setState(VC_AB_, request_time);
     assert(request_time >= curCycle());
     if (request_time > curCycle())
-        m_vc_arbiter->scheduleEventAbsolute(request_time);
+        m_vc_arbiter->scheduleEventAbsolute(clockPeriod() * request_time);
     else
         vc_arbitrate();
 }
@@ -364,7 +364,9 @@
                         m_router_buffers[port][vc_tolookat]->getTopFlit();
                     t_flit->set_time(curCycle() + Cycles(1));
                     m_out_src_queue[port]->insert(t_flit);
-                    m_out_link[port]->scheduleEvent(Cycles(1));
+
+                    m_out_link[port]->
+                        scheduleEventAbsolute(clockEdge(Cycles(1)));
                     break; // done for this port
                 }
             }
@@ -400,7 +402,7 @@
         for (int vc = 0; vc < m_num_vcs; vc++) {
             if (m_in_vc_state[port][vc]->isInState(VC_AB_, curCycle() +
                                                    Cycles(1))) {
-                m_vc_arbiter->scheduleEvent(Cycles(1));
+                m_vc_arbiter->scheduleEventAbsolute(clockEdge(Cycles(1)));
                 return;
             }
         }
diff -r e95479c2926f -r 34df8f24be7e src/mem/ruby/system/RubyMemoryControl.cc
--- a/src/mem/ruby/system/RubyMemoryControl.cc  Fri Mar 22 15:53:25 2013 -0500
+++ b/src/mem/ruby/system/RubyMemoryControl.cc  Fri Mar 22 15:53:26 2013 -0500
@@ -384,7 +384,7 @@
             req.m_addr, req.m_is_mem_read ? 'R':'W', arrival_time);
 
     // schedule the wake up
-    m_consumer_ptr->scheduleEventAbsolute(ruby_arrival_time);
+    m_consumer_ptr->scheduleEventAbsolute(arrival_time);
 }
 
 // getBank returns an integer that is unique for each
diff -r e95479c2926f -r 34df8f24be7e src/mem/ruby/system/TimerTable.cc
--- a/src/mem/ruby/system/TimerTable.cc Fri Mar 22 15:53:25 2013 -0500
+++ b/src/mem/ruby/system/TimerTable.cc Fri Mar 22 15:53:26 2013 -0500
@@ -75,7 +75,8 @@
     Cycles ready_time = m_clockobj_ptr->curCycle() + relative_latency;
     m_map[address] = ready_time;
     assert(m_consumer_ptr != NULL);
-    m_consumer_ptr->scheduleEventAbsolute(ready_time);
+    m_consumer_ptr->
+        scheduleEventAbsolute(m_clockobj_ptr->clockPeriod() * ready_time);
     m_next_valid = false;
 
     // Don't always recalculate the next ready address
diff -r e95479c2926f -r 34df8f24be7e src/mem/ruby/system/WireBuffer.cc
--- a/src/mem/ruby/system/WireBuffer.cc Fri Mar 22 15:53:25 2013 -0500
+++ b/src/mem/ruby/system/WireBuffer.cc Fri Mar 22 15:53:26 2013 -0500
@@ -80,7 +80,8 @@
     MessageBufferNode thisNode(arrival_time, m_msg_counter, message);
     m_message_queue.push_back(thisNode);
     if (m_consumer_ptr != NULL) {
-        m_consumer_ptr->scheduleEventAbsolute(arrival_time);
+        m_consumer_ptr->
+            scheduleEventAbsolute(g_system_ptr->clockPeriod() * arrival_time);
     } else {
         panic("No Consumer for WireBuffer! %s\n", *this);
     }
@@ -128,7 +129,8 @@
     m_message_queue.back() = node;
     push_heap(m_message_queue.begin(), m_message_queue.end(),
         greater<MessageBufferNode>());
-    m_consumer_ptr->scheduleEventAbsolute(node.m_time);
+    m_consumer_ptr->
+        scheduleEventAbsolute(g_system_ptr->clockPeriod() * node.m_time);
 }
 
 bool
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to