Streaming Library - Blocking Behaviour
(Ask a Question)Note that the fifo read()
and write()
calls are blocking. Hence if a module attempts to read from a FIFO that is empty, it will be stalled. Similarly, if it attempts to write to a FIFO that is full, it will be stalled. If you want non-blocking behaviour, you can check if the FIFO is empty (with empty()
) before calling read()
, and likewise, check if the FIFO is full (with full()
) before calling write()
(see Streaming Library - Non-Blocking
Behaviour).
With the blocking behaviour, if the depths of FIFOs are not sized properly, it can cause a deadlock. SmartHLS™ prints out messages to alert the user that a FIFO is causing stalls.
In hardware simulation, the following messages are shown.
Warning: fifo_write() has been stalled for 1000000 cycles due to FIFO being full. Warning: fifo_read() has been stalled for 1000000 cycles due to FIFO being empty. Warning: fifo_read() has been stalled for 1000000 cycles due to FIFO being empty. Warning: fifo_write() has been stalled for 1000000 cycles due to FIFO being full. Warning: fifo_read() has been stalled for 1000000 cycles due to FIFO being empty. Warning: fifo_read() has been stalled for 1000000 cycles due to FIFO being empty.
If you continue to see these messages, you can suspect that there is a deadlock. In this case, we recommend making sure there is no blocking read from an empty FIFO or blocking write to a full FIFO, and potentially increasing the depth of the FIFOs.