[prim_fifo_sync] Add synchronous clear signal to the FIFO primitive

This adds a synchronous clr signal to the synchronous FIFO primitive
which synchronously resets the read and write pointers to zero if
asserted. This has been used to replace some of the gated asynchronous
resets in the design.
diff --git a/hw/ip/hmac/rtl/hmac.sv b/hw/ip/hmac/rtl/hmac.sv
index ade45a3..cc5fbf5 100644
--- a/hw/ip/hmac/rtl/hmac.sv
+++ b/hw/ip/hmac/rtl/hmac.sv
@@ -194,6 +194,7 @@
   ) u_msg_fifo (
     .clk_i,
     .rst_ni,
+    .clr_i  (1'b0),
 
     .wvalid (fifo_wvalid & sha_en),
     .wready (fifo_wready),
diff --git a/hw/ip/i2c/rtl/i2c_core.sv b/hw/ip/i2c/rtl/i2c_core.sv
index 48f307c..8de8be4 100644
--- a/hw/ip/i2c/rtl/i2c_core.sv
+++ b/hw/ip/i2c/rtl/i2c_core.sv
@@ -59,7 +59,6 @@
 
   logic override;
 
-  logic        fmt_fifo_rst_n;
   logic        fmt_fifo_wvalid;
   logic        fmt_fifo_wready;
   logic [12:0] fmt_fifo_wdata;
@@ -77,7 +76,6 @@
   logic [1:0]  i2c_fifo_fmtilvl;
   logic [2:0]  i2c_fifo_rxilvl;
 
-  logic        rx_fifo_rst_n;
   logic        rx_fifo_wvalid;
   logic        rx_fifo_wready;
   logic [7:0]  rx_fifo_wdata;
@@ -180,15 +178,15 @@
   assign fmt_flag_read_bytes    = fmt_fifo_rdata[11];
   assign fmt_flag_nak_ok        = fmt_fifo_rdata[12];
 
-  assign fmt_fifo_rst_n         = scanmode_i ? rst_ni : (rst_ni & ~reg2hw.fifo_ctrl.fmtrst.q);
-
   prim_fifo_sync #(
     .Width(13),
     .Pass(1'b1),
     .Depth(32)
   ) u_i2c_fmtfifo (
     .clk_i,
-    .rst_ni(fmt_fifo_rst_n),
+    .rst_ni,
+    // TODO: check whether qe could be used as clear strobe
+    .clr_i  (reg2hw.fifo_ctrl.fmtrst.q),
     .wvalid(fmt_fifo_wvalid),
     .wready(fmt_fifo_wready),
     .wdata(fmt_fifo_wdata),
@@ -199,7 +197,6 @@
   );
 
   assign rx_fifo_rready = reg2hw.rdata.re;
-  assign rx_fifo_rst_n  = scanmode_i ? rst_ni : (rst_ni & ~reg2hw.fifo_ctrl.rxrst.q);
 
   prim_fifo_sync #(
     .Width(8),
@@ -207,7 +204,9 @@
     .Depth(32)
   ) u_i2c_rxfifo (
     .clk_i,
-    .rst_ni(rx_fifo_rst_n),
+    .rst_ni,
+    // TODO: check whether qe could be used as clear strobe
+    .clr_i(reg2hw.fifo_ctrl.rxrst.q),
     .wvalid(rx_fifo_wvalid),
     .wready(rx_fifo_wready),
     .wdata(rx_fifo_wdata),
diff --git a/hw/ip/prim/rtl/prim_fifo_sync.sv b/hw/ip/prim/rtl/prim_fifo_sync.sv
index 8bd356b..d066eda 100644
--- a/hw/ip/prim/rtl/prim_fifo_sync.sv
+++ b/hw/ip/prim/rtl/prim_fifo_sync.sv
@@ -13,6 +13,8 @@
 ) (
   input                   clk_i,
   input                   rst_ni,
+  // synchronous clear / flush port
+  input                   clr_i,
   // write port
   input                   wvalid,
   output                  wready,
@@ -70,25 +72,31 @@
     assign wready = ~full;
     assign rvalid = ~empty;
 
-    always_ff @(posedge clk_i or negedge rst_ni)
+    always_ff @(posedge clk_i or negedge rst_ni) begin
       if (!rst_ni) begin
         fifo_wptr <= {(PTR_WIDTH){1'b0}};
+      end else if (clr_i) begin
+        fifo_wptr <= {(PTR_WIDTH){1'b0}};
       end else if (fifo_incr_wptr) begin
         if (fifo_wptr[PTR_WIDTH-2:0] == (Depth-1)) begin
           fifo_wptr <= {~fifo_wptr[PTR_WIDTH-1],{(PTR_WIDTH-1){1'b0}}};
         end else begin
           fifo_wptr <= fifo_wptr + {{(PTR_WIDTH-1){1'b0}},1'b1};
+        end
       end
     end
 
-    always_ff @(posedge clk_i or negedge rst_ni)
+    always_ff @(posedge clk_i or negedge rst_ni) begin
       if (!rst_ni) begin
         fifo_rptr <= {(PTR_WIDTH){1'b0}};
+      end else if (clr_i) begin
+        fifo_rptr <= {(PTR_WIDTH){1'b0}};
       end else if (fifo_incr_rptr) begin
         if (fifo_rptr[PTR_WIDTH-2:0] == (Depth-1)) begin
           fifo_rptr <= {~fifo_rptr[PTR_WIDTH-1],{(PTR_WIDTH-1){1'b0}}};
         end else begin
           fifo_rptr <= fifo_rptr + {{(PTR_WIDTH-1){1'b0}},1'b1};
+        end
       end
     end
 
diff --git a/hw/ip/prim/rtl/prim_sram_arbiter.sv b/hw/ip/prim/rtl/prim_sram_arbiter.sv
index a60d81d..1dac50d 100644
--- a/hw/ip/prim/rtl/prim_sram_arbiter.sv
+++ b/hw/ip/prim/rtl/prim_sram_arbiter.sv
@@ -84,6 +84,7 @@
   ) u_req_fifo (
     .clk_i,
     .rst_ni,
+    .clr_i    (1'b0),
     .wvalid   (sram_req && !sram_write),  // Push only for read
     .wready   (),     // TODO: Generate Error
     .wdata    (gnt),
diff --git a/hw/ip/tlul/rtl/tlul_adapter_sram.sv b/hw/ip/tlul/rtl/tlul_adapter_sram.sv
index 0d76cea..69d0a73 100644
--- a/hw/ip/tlul/rtl/tlul_adapter_sram.sv
+++ b/hw/ip/tlul/rtl/tlul_adapter_sram.sv
@@ -225,6 +225,7 @@
   ) u_reqfifo (
     .clk_i,
     .rst_ni,
+    .clr_i  (1'b0),
     .wvalid (reqfifo_wvalid),
     .wready (reqfifo_wready),
     .wdata  (reqfifo_wdata),
@@ -247,6 +248,7 @@
   ) u_rspfifo (
     .clk_i,
     .rst_ni,
+    .clr_i  (1'b0),
     .wvalid (rspfifo_wvalid),
     .wready (rspfifo_wready),
     .wdata  (rspfifo_wdata),
diff --git a/hw/ip/tlul/rtl/tlul_fifo_sync.sv b/hw/ip/tlul/rtl/tlul_fifo_sync.sv
index 4d9a4bc..a3b1b58 100644
--- a/hw/ip/tlul/rtl/tlul_fifo_sync.sv
+++ b/hw/ip/tlul/rtl/tlul_fifo_sync.sv
@@ -32,6 +32,7 @@
   prim_fifo_sync #(.Width(REQFIFO_WIDTH), .Pass(ReqPass), .Depth(ReqDepth)) reqfifo (
     .clk_i,
     .rst_ni,
+    .clr_i         (1'b0          ),
     .wvalid        (tl_h_i.a_valid),
     .wready        (tl_h_o.a_ready),
     .wdata         ({tl_h_i.a_opcode ,
@@ -63,6 +64,7 @@
   prim_fifo_sync #(.Width(RSPFIFO_WIDTH), .Pass(RspPass), .Depth(RspDepth)) rspfifo (
     .clk_i,
     .rst_ni,
+    .clr_i         (1'b0          ),
     .wvalid        (tl_d_i.d_valid),
     .wready        (tl_d_o.d_ready),
     .wdata         ({tl_d_i.d_opcode,
diff --git a/hw/ip/uart/rtl/uart_core.sv b/hw/ip/uart/rtl/uart_core.sv
index 62e14b9..e77a4c4 100644
--- a/hw/ip/uart/rtl/uart_core.sv
+++ b/hw/ip/uart/rtl/uart_core.sv
@@ -31,7 +31,6 @@
   logic   [15:0]  rx_val_q;
   logic   [7:0]   uart_rdata;
   logic           tick_baud_x16, rx_tick_baud;
-  logic           tx_fifo_rst_n, rx_fifo_rst_n;
   logic   [5:0]   tx_fifo_depth, rx_fifo_depth;
   logic   [5:0]   rx_fifo_depth_prev_q;
   logic   [23:0]  rx_timeout_count_d, rx_timeout_count_q, uart_rxto_val;
@@ -166,7 +165,6 @@
   //              TX Logic
 
   assign tx_fifo_rready = tx_uart_idle & tx_fifo_rvalid & tx_enable;
-  assign tx_fifo_rst_n  = scanmode_i ? rst_ni : (rst_ni & ~uart_fifo_txrst);
 
   prim_fifo_sync #(
     .Width(8),
@@ -174,7 +172,8 @@
     .Depth(32)
   ) u_uart_txfifo (
     .clk_i,
-    .rst_ni (tx_fifo_rst_n),
+    .rst_ni,
+    .clr_i  (uart_fifo_txrst),
     .wvalid (reg2hw.wdata.qe),
     .wready (tx_fifo_wready),
     .wdata  (reg2hw.wdata.q),
@@ -264,15 +263,15 @@
   );
 
   assign rx_fifo_wvalid = rx_valid & ~event_rx_frame_err & ~event_rx_parity_err;
-  assign rx_fifo_rst_n = scanmode_i ? rst_ni : (rst_ni & ~uart_fifo_rxrst);
 
   prim_fifo_sync #(
     .Width (8),
     .Pass  (1'b0),
     .Depth (32)
   ) u_uart_rxfifo (
-    .clk_i  (clk_i),
-    .rst_ni (rx_fifo_rst_n),
+    .clk_i,
+    .rst_ni,
+    .clr_i  (uart_fifo_rxrst),
     .wvalid (rx_fifo_wvalid),
     .wready (rx_fifo_wready),
     .wdata  (rx_fifo_data),