Is there anything special about the data that flows through the FIFO – such as checksum? Otherwise, there is no reason not to use an incrementing data pattern at the input and then check the same values at the output. The only concern with an incrementing pattern is that you drop so many that the counter wraps around and has a matching value – unlikely and you can make sure it did not happen by keeping a stimulus generation count and check count and make sure they match at the end of the test.
What you need to do with the FIFO is vary the traffic enough that you try to do a read while the FIFO is empty and try to do a write while the FIFO is full – in both cases you want to see the interface stop correctly. This can be accomplished simply by randomizing bursts of traffic and blocks of delay.
I go more into this in our VHDL Testbenches and Verification class: https://www.synthworks.com/vhdl_testbench_verification.htm
I also cover scoreboards in the class.
We have an online session of the class starting on November 18th.
Jim