diff options
author | Nilay Vaish <nilay@cs.wisc.edu> | 2013-02-10 21:43:17 -0600 |
---|---|---|
committer | Nilay Vaish <nilay@cs.wisc.edu> | 2013-02-10 21:43:17 -0600 |
commit | cb7782f78d337527d8ea3d593645fc67cca54d23 (patch) | |
tree | ac0602477455b2364a32f788b0e1e6bae1fa999b /src/mem/ruby/network/garnet | |
parent | 253e8edf13c4d7bee6bd13f84fdfa6cf40a0c5c3 (diff) | |
download | gem5-cb7782f78d337527d8ea3d593645fc67cca54d23.tar.xz |
ruby: enable multiple clock domains
This patch allows ruby to have multiple clock domains. As I understand
with this patch, controllers can have different frequencies. The entire
network needs to run at a single frequency.
The idea is that with in an object, time is treated in terms of cycles.
But the messages that are passed from one entity to another should contain
the time in Ticks. As of now, this is only true for the message buffers,
but not for the links in the network. As I understand the code, all the
entities in different networks (simple, garnet-fixed, garnet-flexible) should
be clocked at the same frequency.
Another problem is that the directory controller has to operate at the same
frequency as the ruby system. This is because the memory controller does
not make use of the Message Buffer, and instead implements a buffer of its
own. So, it has no idea of the frequency at which the directory controller
is operating and uses ruby system's frequency for scheduling events.
Diffstat (limited to 'src/mem/ruby/network/garnet')
-rw-r--r-- | src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc | 7 | ||||
-rw-r--r-- | src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc | 7 |
2 files changed, 10 insertions, 4 deletions
diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc index 3d915598e..ca4d6aabe 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc @@ -116,7 +116,9 @@ NetworkInterface_d::addNode(vector<MessageBuffer *>& in, // the protocol injects messages into the NI inNode_ptr[j]->setConsumer(this); - inNode_ptr[j]->setClockObj(m_net_ptr); + inNode_ptr[j]->setReceiver(m_net_ptr); + + outNode_ptr[j]->setSender(m_net_ptr); } } @@ -173,7 +175,8 @@ NetworkInterface_d::flitisizeMessage(MsgPtr msg_ptr, int vnet) flit_d *fl = new flit_d(i, vc, vnet, num_flits, new_msg_ptr, m_net_ptr->curCycle()); - fl->set_delay(m_net_ptr->curCycle() - msg_ptr->getTime()); + fl->set_delay(m_net_ptr->curCycle() - + m_net_ptr->ticksToCycles(msg_ptr->getTime())); m_ni_buffers[vc]->insert(fl); } diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc index ddb5da716..79e295601 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc +++ b/src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc @@ -106,7 +106,9 @@ NetworkInterface::addNode(vector<MessageBuffer*>& in, // protocol injects messages into the NI for (int j = 0; j < m_virtual_networks; j++) { inNode_ptr[j]->setConsumer(this); - inNode_ptr[j]->setClockObj(m_net_ptr); + inNode_ptr[j]->setReceiver(m_net_ptr); + + outNode_ptr[j]->setSender(m_net_ptr); } } @@ -169,7 +171,8 @@ NetworkInterface::flitisizeMessage(MsgPtr msg_ptr, int vnet) m_net_ptr->increment_injected_flits(vnet); flit *fl = new flit(i, vc, vnet, num_flits, new_msg_ptr, m_net_ptr->curCycle()); - fl->set_delay(m_net_ptr->curCycle() - msg_ptr->getTime()); + fl->set_delay(m_net_ptr->curCycle() - + m_net_ptr->ticksToCycles(msg_ptr->getTime())); m_ni_buffers[vc]->insert(fl); } |