summaryrefslogtreecommitdiff
path: root/src/mem/bus.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/bus.cc')
-rw-r--r--src/mem/bus.cc20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/mem/bus.cc b/src/mem/bus.cc
index 855f82db4..d94bd6a28 100644
--- a/src/mem/bus.cc
+++ b/src/mem/bus.cc
@@ -189,12 +189,20 @@ template <typename SrcType, typename DstType>
bool
BaseBus::Layer<SrcType,DstType>::tryTiming(SrcType* src_port)
{
- // first we see if the layer is busy, next we check if we are in a
- // retry with a port other than the current one, lastly we check
- // if the destination port is already engaged in a transaction
- // waiting for a retry from the peer
- if (state == BUSY || (state == RETRY && src_port != retryingPort) ||
- waitingForPeer != NULL) {
+ // if we are in the retry state, we will not see anything but the
+ // retrying port (or in the case of the snoop ports the snoop
+ // response port that mirrors the actual slave port) as we leave
+ // this state again in zero time if the peer does not immediately
+ // call the bus when receiving the retry
+
+ // first we see if the layer is busy, next we check if the
+ // destination port is already engaged in a transaction waiting
+ // for a retry from the peer
+ if (state == BUSY || waitingForPeer != NULL) {
+ // the port should not be waiting already
+ assert(std::find(waitingForLayer.begin(), waitingForLayer.end(),
+ src_port) == waitingForLayer.end());
+
// put the port at the end of the retry list waiting for the
// layer to be freed up (and in the case of a busy peer, for
// that transaction to go through, and then the bus to free