[sram_ctrl] Fix potential back-to-back partial write bug

Signed-off-by: Michael Schaffner <msf@opentitan.org>
diff --git a/hw/ip/prim/rtl/prim_ram_1p_scr.sv b/hw/ip/prim/rtl/prim_ram_1p_scr.sv
index cc10593..0712815 100644
--- a/hw/ip/prim/rtl/prim_ram_1p_scr.sv
+++ b/hw/ip/prim/rtl/prim_ram_1p_scr.sv
@@ -361,16 +361,28 @@
   logic rvalid_q;
   assign rvalid_o = rvalid_q;
 
-  // In case of a collision, we forward the write data from the unscrambled holding register
-  assign rdata_o = (addr_collision_q) ? wdata_q   : // forward pending (unscrambled) write data
-                   (rvalid_q)         ? rdata     : // regular reads
-                                        '0;         // tie to zero otherwise
+  logic [Width-1:0] wmask_q;
+  always_comb begin : p_forward_mux
+    rdata_o = '0;
+    // regular reads
+    if (rvalid_q) begin
+      rdata_o = rdata;
+    end
+    // In case of a collision, we forward the valid bytes of the write data from the unscrambled
+    // holding register.
+    if (addr_collision_q) begin
+      for (int k = 0; k < Width; k++) begin
+        if (wmask_q[k]) begin
+          rdata_o[k] = wdata_q[k];
+        end
+      end
+    end
+  end
 
   ///////////////
   // Registers //
   ///////////////
 
-  logic [Width-1:0] wmask_q;
   always_ff @(posedge clk_i or negedge rst_ni) begin : p_wdata_buf
     if (!rst_ni) begin
       write_pending_q     <= 1'b0;