Why can't we allow other bus transactions in the middle of a BusRd(X)? Say we have a separate BusRdResp transaction to complete the read. Couldn't the requestor wait until either a matching BusRdResp appears on the bus? If a matching BusWr appears first, the request can snoop the data from the write.
If the original request was a BusRdX, and another BusRd(X) appears, then the original requestor can restart. I suppose there is potential for livelock here though.
If the original request was a BusRd, then it only needs to restart if a BusRdX appears. Still possible livelock.
I guess that explains why BusRd(X) has to be atomic.
Why can't we allow other bus transactions in the middle of a BusRd(X)? Say we have a separate BusRdResp transaction to complete the read. Couldn't the requestor wait until either a matching BusRdResp appears on the bus? If a matching BusWr appears first, the request can snoop the data from the write.
If the original request was a BusRdX, and another BusRd(X) appears, then the original requestor can restart. I suppose there is potential for livelock here though.
If the original request was a BusRd, then it only needs to restart if a BusRdX appears. Still possible livelock.
I guess that explains why BusRd(X) has to be atomic.