Connections through the NoC use a shared set of routing resources from source to destination, and it is possible that more than one interrelated connection could share one or more common resources. This leads to the possibility of deadlock. An example of how deadlock can be avoided is shown in the following figure.
As shown in the illustrated example, data from AXI Sources 1 and 2 routes through the NoC to two separate AXI Destinations, then gets combined by some logic at the destination. If the combining logic depends on synchronization between the sources, it is possible for the two data sources to get out of sync with one another. In this example, FIFOs have been added to help resynchronize the data at the destination. However, if one FIFO fills, AXI Dest 1 in this example deasserts READY. This causes back pressure in the NoC. At the shared NPS in the middle, back pressure on the output stops both inputs. At this point the NoC is deadlocked. The combining logic at the destination is stuck waiting for traffic from AXI Source 2, but it is blocked by the back pressure from AXI Dest 1.
To avoid this deadlock, add extra logic to detect when the FIFOs are approaching full and a feedback mechanism to throttle traffic at the source. In the example above, this logic would detect that the FIFO on AXI Dest 1 was nearing full and signal to AXI Source 1 to stop traffic requests to allow traffic from AXI Source 2 to flow through. As more data flows through from AXI Source 2, FIFO 1 will drain, at which point the feedback can allow more traffic to flow from AXI Source 1.