FIFO_EMPTY is typically used to indicate when the FIFO_WR_CLK starts at the end of the startup sequence as shown below:
If FIFO_RD_EN is not asserted at the end of the startup sequence, FIFO_EMPTY should pulse once every 8 FIFO_WR_CLK cycles (see figure).
This is not reliable. The issue is dependent on the relative clock phases of the FIFO_WR_CLK and FIFO_RD_CLK which gets routed through the fabric.
For example, some designs do not use the first falling edge of the FIFO_EMPTY to assert FIFO_RD_EN at the end of startup sequence and instead use one of the subsequent FIFO_EMPTY pulses.
In this case FIFO_RD_EN might never assert and as a result no data will get read out of the FIFO.
This behavior applies to RX_BITSLICE, RXTX_BITSLICE, and ISERDESE3 for all UltraScale and UltraScale+ devices.
The solution is to use the first de-assertion of FIFO_EMPTY after reset to assert FIFO_RD_EN.
The FIFO_RD_EN circuitry should use the first de-assertion of FIFO_EMPTY as shown below.
The FIFO_EMPTY from the Bitslice furthest from the strobe is typically used.
In the case of multiple FIFO_EMPTY signals being used, NOR all of the FIFO_EMPTY signals to ensure that FIFO_RD_EN is asserted after the FIFO_WR_CLK has started for all of the Bitslices.
The fix has been included in the following version of the IP: