[dv common] SW test status interface updates

- Now written in pure SV for Verilator compatibility
- Fixes some simulation issues with previous implementation.

Signed-off-by: Srikrishna Iyer <sriyer@google.com>
diff --git a/hw/top_earlgrey/dv/env/sw_test_status_if.sv b/hw/top_earlgrey/dv/env/sw_test_status_if.sv
index 4fa7bca..35f40b6 100644
--- a/hw/top_earlgrey/dv/env/sw_test_status_if.sv
+++ b/hw/top_earlgrey/dv/env/sw_test_status_if.sv
@@ -2,18 +2,24 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 
-interface sw_test_status_if ();
-  import top_pkg::*;
+interface sw_test_status_if (
+  input clk,
+  input valid,
+  input bit [15:0] data
+);
+
+  import bus_params_pkg::*;
   import sw_test_status_pkg::*;
+`ifdef UVM
+  import uvm_pkg::*;
+  `include "uvm_macros.svh"
+`endif
 
   // Single cycle qualifier for the sw_test_status_val.
   logic valid;
 
   // Address to which the test status is written to.
-  logic [TL_AW-1:0] sw_test_status_addr;
-
-  // SW test status written by the CPU.
-  logic [TL_DW-1:0] sw_test_status_val;
+  logic [bus_params_pkg::BUS_AW-1:0] sw_test_status_addr;
 
   // SW test status indication.
   sw_test_status_e sw_test_status;
@@ -21,16 +27,22 @@
   // If the sw_test_status reaches the terminal states, assert that we are done.
   bit sw_test_done;
 
-  // Logic that updates the sw_test_status from the val.
-  // Note that sw_test_status is set by the testbench when the CPU is under reset.
-  initial begin
-    forever begin
-      @(valid);
-      if (valid) begin
-        sw_test_status = sw_test_status_e'(sw_test_status_val[15:0]);
-        if (!sw_test_done) begin
-          sw_test_done = (sw_test_status inside {SwTestStatusPassed, SwTestStatusFailed});
-        end
+  always @(posedge clk) begin
+    if (valid) begin
+      if ($cast(sw_test_status, data)) begin
+`ifdef UVM
+        `uvm_info($sformatf("%m"), $sformatf("Detected SW test status change: %0s",
+                                             sw_test_status.name()), UVM_LOW)
+`elsif VERILATOR
+        $display("%t [%m]: Detected SW test status change: 0x%0h", $time, sw_test_status);
+`else
+        $display("%t [%m]: Detected SW test status change: %0s", $time, sw_test_status.name());
+`endif
+        sw_test_done = sw_test_done | (sw_test_status inside {SwTestStatusPassed,
+                                                              SwTestStatusFailed});
+      end else begin
+        $error("%t [%m] Illegal sw_test_status data 0x%0h written to addr 0x%0h",
+               $time, data, sw_test_status_addr);
       end
     end
   end
diff --git a/hw/top_earlgrey/dv/tb/tb.sv b/hw/top_earlgrey/dv/tb/tb.sv
index 317fcd6..72e1cae 100644
--- a/hw/top_earlgrey/dv/tb/tb.sv
+++ b/hw/top_earlgrey/dv/tb/tb.sv
@@ -124,11 +124,11 @@
   bit [TL_AW-1:0] sw_log_addr;
 
   sw_logger_if sw_logger_if (
-    .clk          (`RAM_MAIN_SUB_HIER.clk_i),
-    .rst_n        (`RAM_MAIN_HIER.rst_ni),
-    .valid        (sw_log_valid),
-    .addr_data    (`RAM_MAIN_SUB_HIER.wdata_i),
-    .sw_log_addr  (sw_log_addr)
+    .clk        (`RAM_MAIN_SUB_HIER.clk_i),
+    .rst_n      (`RAM_MAIN_HIER.rst_ni),
+    .valid      (sw_log_valid),
+    .addr_data  (`RAM_MAIN_SUB_HIER.wdata_i),
+    .sw_log_addr(sw_log_addr)
   );
   assign sw_log_valid = !stub_cpu &&
                         `RAM_MAIN_SUB_HIER.req_i &&
@@ -137,13 +137,17 @@
                         (`RAM_MAIN_SUB_HIER.addr_i == sw_log_addr[15:2]);
 
   // connect the sw_test_status_if
-  sw_test_status_if sw_test_status_if();
-  assign sw_test_status_if.valid =  !stub_cpu &&
-                                    `RAM_MAIN_SUB_HIER.req_i &&
-                                    `RAM_MAIN_SUB_HIER.write_i &&
-                                    (`RAM_MAIN_SUB_HIER.addr_i ==
-                                     sw_test_status_if.sw_test_status_addr[15:2]);
-  assign sw_test_status_if.sw_test_status_val = `RAM_MAIN_SUB_HIER.wdata_i;
+  bit sw_test_status_valid;
+  sw_test_status_if sw_test_status_if(
+    .clk  (`RAM_MAIN_SUB_HIER.clk_i),
+    .valid(sw_test_status_valid),
+    .data (`RAM_MAIN_SUB_HIER.wdata_i[15:0])
+  );
+  assign sw_test_status_valid = !stub_cpu &&
+                                `RAM_MAIN_SUB_HIER.req_i &&
+                                `RAM_MAIN_SUB_HIER.write_i &&
+                                (`RAM_MAIN_SUB_HIER.addr_i ==
+                                 sw_test_status_if.sw_test_status_addr[15:2]);
 
   // Instantiate & connect the simulation SRAM.
   sim_sram u_sim_sram (