[prim_fifo_async] Make async FIFO output zero when empty

This is configurable by the parameter `OutputZeroIfEmpty`, which
defaults to off.

Signed-off-by: Noah Moroze <noahmoroze@gmail.com>
Co-authored-by: Philipp Wagner <mail@philipp-wagner.com>
diff --git a/hw/ip/prim/rtl/prim_fifo_async.sv b/hw/ip/prim/rtl/prim_fifo_async.sv
index 1f4be40..056c392 100644
--- a/hw/ip/prim/rtl/prim_fifo_async.sv
+++ b/hw/ip/prim/rtl/prim_fifo_async.sv
@@ -9,6 +9,7 @@
 module prim_fifo_async #(
   parameter  int unsigned Width  = 16,
   parameter  int unsigned Depth  = 4,
+  parameter  bit OutputZeroIfEmpty = 1'b0, // if == 1 always output 0 when FIFO is empty
   localparam int unsigned DepthW = $clog2(Depth+1) // derived parameter representing [0..Depth]
 ) (
   // write port
@@ -171,6 +172,7 @@
   // Storage //
   /////////////
 
+  logic [Width-1:0] rdata_int;
   if (Depth > 1) begin : g_storage_mux
 
     always_ff @(posedge clk_wr_i) begin
@@ -179,7 +181,7 @@
       end
     end
 
-    assign rdata_o = storage[fifo_rptr_q[PTRV_W-1:0]];
+    assign rdata_int = storage[fifo_rptr_q[PTRV_W-1:0]];
 
   end else begin : g_storage_simple
 
@@ -189,10 +191,16 @@
       end
     end
 
-    assign rdata_o = storage[0];
+    assign rdata_int = storage[0];
 
   end
 
+  if (OutputZeroIfEmpty == 1'b1) begin : gen_output_zero
+    assign rdata_o = empty_rclk ? '0 : rdata_int;
+  end else begin : gen_no_output_zero
+    assign rdata_o = rdata_int;
+  end
+
   //////////////////////////////////////
   // Decimal <-> Gray-code Conversion //
   //////////////////////////////////////