[alert_handler/fpv] Revive testbenches for esc and ping timers

This revives the FPV testbenches for the escalationa and ping timers,
and fixes / aligns several assertions with the newest code state.

Signed-off-by: Michael Schaffner <msf@google.com>
diff --git a/hw/formal/fpv_all b/hw/formal/fpv_all
index 967b73a..8184c29 100755
--- a/hw/formal/fpv_all
+++ b/hw/formal/fpv_all
@@ -55,6 +55,8 @@
   "pinmux_fpv"
   "rv_plic_fpv"
   "rv_plic_generic_fpv"
+  "alert_handler_esc_timer_fpv"
+  "alert_handler_ping_timer_fpv"
 )
 
 #-------------------------------------------------------------------------
diff --git a/hw/ip/alert_handler/fpv/alert_handler_esc_timer_fpv.core b/hw/ip/alert_handler/fpv/alert_handler_esc_timer_fpv.core
index ac98891..be2b40c 100644
--- a/hw/ip/alert_handler/fpv/alert_handler_esc_timer_fpv.core
+++ b/hw/ip/alert_handler/fpv/alert_handler_esc_timer_fpv.core
@@ -5,7 +5,7 @@
 name: "lowrisc:fpv:alert_handler_esc_timer_fpv:0.1"
 description: "alert_handler_esc_timer FPV target"
 filesets:
-  files_fpv:
+  files_formal:
     depend:
       - lowrisc:prim:all
       # note: this is an example config which may differ
@@ -18,10 +18,14 @@
     file_type: systemVerilogSource
 
 targets:
-  default:
+  default: &default_target
     # note, this setting is just used
     # to generate a file list for jg
     default_tool: icarus
     filesets:
-      - files_fpv
-    toplevel: alert_handler_esc_timer_fpv
+      - files_formal
+    toplevel:
+      - alert_handler_esc_timer_fpv
+
+  formal:
+    <<: *default_target
diff --git a/hw/ip/alert_handler/fpv/alert_handler_ping_timer_fpv.core b/hw/ip/alert_handler/fpv/alert_handler_ping_timer_fpv.core
index 0bc0119..db5d846 100644
--- a/hw/ip/alert_handler/fpv/alert_handler_ping_timer_fpv.core
+++ b/hw/ip/alert_handler/fpv/alert_handler_ping_timer_fpv.core
@@ -5,7 +5,7 @@
 name: "lowrisc:fpv:alert_handler_ping_timer_fpv:0.1"
 description: "ALERT_HANDLER FPV target"
 filesets:
-  files_fpv:
+  files_formal:
     depend:
       - lowrisc:prim:all
       # note: this is an example config which may differ
@@ -18,10 +18,14 @@
     file_type: systemVerilogSource
 
 targets:
-  default:
+  default: &default_target
     # note, this setting is just used
     # to generate a file list for jg
     default_tool: icarus
     filesets:
-      - files_fpv
-    toplevel: alert_handler_ping_timer_fpv
+      - files_formal
+    toplevel:
+      - alert_handler_ping_timer_fpv
+
+  formal:
+    <<: *default_target
diff --git a/hw/ip/alert_handler/fpv/tb/alert_handler_esc_timer_bind_fpv.sv b/hw/ip/alert_handler/fpv/tb/alert_handler_esc_timer_bind_fpv.sv
index 30b76d9..8c57eaa 100644
--- a/hw/ip/alert_handler/fpv/tb/alert_handler_esc_timer_bind_fpv.sv
+++ b/hw/ip/alert_handler/fpv/tb/alert_handler_esc_timer_bind_fpv.sv
@@ -12,7 +12,8 @@
     .rst_ni,
     .en_i,
     .clr_i,
-    .accum_trig_i,
+    .accu_trig_i,
+    .accu_fail_i,
     .timeout_en_i,
     .timeout_cyc_i,
     .esc_en_i,
@@ -20,7 +21,7 @@
     .phase_cyc_i,
     .esc_trig_o,
     .esc_cnt_o,
-    .esc_sig_en_o,
+    .esc_sig_req_o,
     .esc_state_o
   );
 
diff --git a/hw/ip/alert_handler/fpv/tb/alert_handler_esc_timer_fpv.sv b/hw/ip/alert_handler/fpv/tb/alert_handler_esc_timer_fpv.sv
index d15a2f3..5a94efd 100644
--- a/hw/ip/alert_handler/fpv/tb/alert_handler_esc_timer_fpv.sv
+++ b/hw/ip/alert_handler/fpv/tb/alert_handler_esc_timer_fpv.sv
@@ -10,7 +10,8 @@
   input  rst_ni,
   input  en_i,
   input  clr_i,
-  input  accum_trig_i,
+  input  accu_trig_i,
+  input  accu_fail_i,
   input  timeout_en_i,
   input [EscCntDw-1:0] timeout_cyc_i,
   input [N_ESC_SEV-1:0] esc_en_i,
@@ -18,7 +19,7 @@
   input [N_PHASES-1:0][EscCntDw-1:0] phase_cyc_i,
   output logic esc_trig_o,
   output logic[EscCntDw-1:0] esc_cnt_o,
-  output logic[N_ESC_SEV-1:0] esc_sig_en_o,
+  output logic[N_ESC_SEV-1:0] esc_sig_req_o,
   output cstate_e esc_state_o
 );
 
@@ -27,7 +28,8 @@
     .rst_ni,
     .en_i,
     .clr_i,
-    .accum_trig_i,
+    .accu_trig_i,
+    .accu_fail_i,
     .timeout_en_i,
     .timeout_cyc_i,
     .esc_en_i,
@@ -35,7 +37,7 @@
     .phase_cyc_i,
     .esc_trig_o,
     .esc_cnt_o,
-    .esc_sig_en_o,
+    .esc_sig_req_o,
     .esc_state_o
   );
 
diff --git a/hw/ip/alert_handler/fpv/tb/alert_handler_ping_timer_bind_fpv.sv b/hw/ip/alert_handler/fpv/tb/alert_handler_ping_timer_bind_fpv.sv
index dbbac60..78ecf33 100644
--- a/hw/ip/alert_handler/fpv/tb/alert_handler_ping_timer_bind_fpv.sv
+++ b/hw/ip/alert_handler/fpv/tb/alert_handler_ping_timer_bind_fpv.sv
@@ -10,13 +10,15 @@
       alert_handler_ping_timer_assert_fpv i_alert_handler_ping_timer_assert_fpv (
     .clk_i,
     .rst_ni,
-    .entropy_i,
+    .edn_req_o,
+    .edn_ack_i,
+    .edn_data_i,
     .en_i,
-    .alert_en_i,
+    .alert_ping_en_i,
     .ping_timeout_cyc_i,
     .wait_cyc_mask_i,
-    .alert_ping_en_o,
-    .esc_ping_en_o,
+    .alert_ping_req_o,
+    .esc_ping_req_o,
     .alert_ping_ok_i,
     .esc_ping_ok_i,
     .alert_ping_fail_o,
diff --git a/hw/ip/alert_handler/fpv/tb/alert_handler_ping_timer_fpv.sv b/hw/ip/alert_handler/fpv/tb/alert_handler_ping_timer_fpv.sv
index 47e45d5..ca18a84 100644
--- a/hw/ip/alert_handler/fpv/tb/alert_handler_ping_timer_fpv.sv
+++ b/hw/ip/alert_handler/fpv/tb/alert_handler_ping_timer_fpv.sv
@@ -8,13 +8,15 @@
 module alert_handler_ping_timer_fpv import alert_pkg::*; (
   input                          clk_i,
   input                          rst_ni,
-  input                          entropy_i,
+  output logic                   edn_req_o,
+  input                          edn_ack_i,
+  input        [LfsrWidth-1:0]   edn_data_i,
   input                          en_i,
-  input        [NAlerts-1:0]     alert_en_i,
+  input        [NAlerts-1:0]     alert_ping_en_i,
   input        [PING_CNT_DW-1:0] ping_timeout_cyc_i,
   input        [PING_CNT_DW-1:0] wait_cyc_mask_i,
-  output logic [NAlerts-1:0]     alert_ping_en_o,
-  output logic [N_ESC_SEV-1:0]   esc_ping_en_o,
+  output logic [NAlerts-1:0]     alert_ping_req_o,
+  output logic [N_ESC_SEV-1:0]   esc_ping_req_o,
   input        [NAlerts-1:0]     alert_ping_ok_i,
   input        [N_ESC_SEV-1:0]   esc_ping_ok_i,
   output logic                   alert_ping_fail_o,
@@ -28,13 +30,15 @@
   ) i_alert_handler_ping_timer (
     .clk_i             ,
     .rst_ni            ,
-    .entropy_i         ,
+    .edn_req_o         ,
+    .edn_ack_i         ,
+    .edn_data_i        ,
     .en_i              ,
-    .alert_en_i        ,
+    .alert_ping_en_i   ,
     .ping_timeout_cyc_i,
     .wait_cyc_mask_i   ,
-    .alert_ping_en_o   ,
-    .esc_ping_en_o     ,
+    .alert_ping_req_o  ,
+    .esc_ping_req_o    ,
     .alert_ping_ok_i   ,
     .esc_ping_ok_i     ,
     .alert_ping_fail_o ,
diff --git a/hw/ip/alert_handler/fpv/vip/alert_handler_esc_timer_assert_fpv.sv b/hw/ip/alert_handler/fpv/vip/alert_handler_esc_timer_assert_fpv.sv
index ccedf21..b0763ff 100644
--- a/hw/ip/alert_handler/fpv/vip/alert_handler_esc_timer_assert_fpv.sv
+++ b/hw/ip/alert_handler/fpv/vip/alert_handler_esc_timer_assert_fpv.sv
@@ -12,7 +12,8 @@
   input  rst_ni,
   input  en_i,
   input  clr_i,
-  input  accum_trig_i,
+  input  accu_trig_i,
+  input  accu_fail_i,
   input  timeout_en_i,
   input [EscCntDw-1:0] timeout_cyc_i,
   input [N_ESC_SEV-1:0] esc_en_i,
@@ -20,7 +21,7 @@
   input [N_PHASES-1:0][EscCntDw-1:0] phase_cyc_i,
   input logic esc_trig_o,
   input logic[EscCntDw-1:0] esc_cnt_o,
-  input logic[N_ESC_SEV-1:0] esc_sig_en_o,
+  input logic[N_ESC_SEV-1:0] esc_sig_req_o,
   input cstate_e esc_state_o
 );
 
@@ -61,35 +62,46 @@
   // if the class is not enabled and we are in IDLE state,
   // neither of the two escalation mechanisms shall fire
   `ASSERT(ClassDisabledNoEscTrig_A, esc_state_o == Idle && !en_i |-> !esc_trig_o)
-  `ASSERT(ClassDisabledNoEsc_A, esc_state_o == Idle && !en_i |-> !esc_sig_en_o)
-  `ASSERT(EscDisabledNoEsc_A, !esc_en_i[esc_sel] |-> !esc_sig_en_o[esc_sel])
+  `ASSERT(ClassDisabledNoEsc_A, esc_state_o == Idle && !en_i |-> !esc_sig_req_o)
+  `ASSERT(EscDisabledNoEsc_A, !esc_en_i[esc_sel] && esc_state_o != FsmError |->
+      !esc_sig_req_o[esc_sel])
 
   // if timeout counter is enabled due to a pending interrupt, check escalation
   // assume accumulation trigger is not asserted during this sequence
-  `ASSERT(TimeoutEscTrig_A, ##1 en_i && $rose(timeout_en_i) && (timeout_cyc_i > 0) ##1
-      timeout_en_i [*MAX_TIMEOUT_CYCLES] |=> esc_has_triggered_q,
-      clk_i, !rst_ni || accum_trig_i || clr_i)
+  `ASSERT(TimeoutEscTrig_A, esc_state_o == Idle ##1 en_i && $rose(timeout_en_i) &&
+      (timeout_cyc_i > 0) ##1 timeout_en_i [*MAX_TIMEOUT_CYCLES] |=> esc_has_triggered_q,
+      clk_i, !rst_ni || accu_trig_i || clr_i || accu_fail_i)
 
   // check whether an accum trig leads to escalation if enabled
-  `ASSERT(AccumEscTrig_A, ##1 en_i && accum_trig_i && esc_state_o inside {Idle, Timeout} |=>
-      esc_has_triggered_q)
+  `ASSERT(AccumEscTrig_A, ##1 en_i && accu_trig_i && esc_state_o inside {Idle, Timeout} |=>
+      esc_has_triggered_q, clk_i, !rst_ni || clr_i || accu_fail_i)
 
   // check escalation cnt and state out
-  `ASSERT(EscStateOut_A, alert_handler_esc_timer.state_q == esc_state_o)
-  `ASSERT(EscCntOut_A, alert_handler_esc_timer.cnt_q == esc_cnt_o)
+  parameter logic [alert_handler_esc_timer.StateWidth-1:0] state_encodings [0:7] = '{
+    alert_handler_esc_timer.IdleSt,
+    alert_handler_esc_timer.TimeoutSt,
+    alert_handler_esc_timer.FsmErrorSt,
+    alert_handler_esc_timer.TerminalSt,
+    alert_handler_esc_timer.Phase0St,
+    alert_handler_esc_timer.Phase1St,
+    alert_handler_esc_timer.Phase2St,
+    alert_handler_esc_timer.Phase3St
+  };
+  `ASSERT(EscStateOut_A, alert_handler_esc_timer.state_q == state_encodings[esc_state_o])
+  `ASSERT(EscCntOut_A, alert_handler_esc_timer.cnt_q[0] == esc_cnt_o)
 
   // check clr input
   // we cannot use clr to exit from the timeout state
-  `ASSERT(ClrCheck_A, clr_i && !(esc_state_o inside {Idle, Timeout}) |=>
+  `ASSERT(ClrCheck_A, clr_i && !(esc_state_o inside {Idle, Timeout, FsmError}) && !accu_fail_i |=>
       esc_state_o == Idle)
 
   // check escalation map
   `ASSERT(PhaseEscMap_A, esc_state_o == phases[phase_sel] && esc_map_i[esc_sel] == phase_sel &&
-      esc_en_i[esc_sel] |-> esc_sig_en_o[esc_sel])
+      esc_en_i[esc_sel] |-> esc_sig_req_o[esc_sel])
 
   // check terminal state is reached eventually if triggered and not cleared
   `ASSERT(TerminalState_A, esc_trig_o |-> strong(##[1:$] esc_state_o == Terminal),
-      clk_i, !rst_ni || clr_i)
+      clk_i, !rst_ni || clr_i || accu_fail_i)
 
   /////////////////////////
   // Backward Assertions //
@@ -97,16 +109,18 @@
 
   // escalation can only be triggered when in Idle or Timeout state. Trigger mechanisms are either
   // the accumulation trigger or a timeout trigger
-  `ASSERT(EscTrigBkwd_A, esc_trig_o |-> esc_state_o inside {Idle, Timeout} && accum_trig_i ||
-      esc_state_o  == Timeout && esc_cnt_o >= timeout_cyc_i)
+  `ASSERT(EscTrigBkwd_A, esc_trig_o |-> esc_state_o inside {Idle, Timeout} && accu_trig_i ||
+      esc_state_o == Timeout && esc_cnt_o >= timeout_cyc_i)
   `ASSERT(NoEscTrigBkwd_A, !esc_trig_o |-> !(esc_state_o inside {Idle, Timeout}) ||
-      (!en_i || !accum_trig_i || !timeout_en_i))
+      !en_i || !accu_trig_i || !timeout_en_i || clr_i)
 
-  // escalation signals can only be asserted in the escalation phase states
-  `ASSERT(EscBkwd_A, esc_sig_en_o[esc_sel] |-> esc_en_i[esc_sel] &&
-      esc_has_triggered_q)
-  `ASSERT(NoEscBkwd_A, !esc_sig_en_o[esc_sel] |-> !esc_en_i[esc_sel] ||
-      esc_state_o != phases[esc_map_i[esc_sel]], clk_i, !rst_ni || clr_i)
+  // escalation signals can only be asserted in the escalation phase states, or
+  // if we are in the terminal FsmError state
+  `ASSERT(EscBkwd_A, esc_sig_req_o[esc_sel] |-> esc_en_i[esc_sel] &&
+      esc_has_triggered_q || esc_state_o == FsmError)
+  `ASSERT(NoEscBkwd_A, !esc_sig_req_o[esc_sel] |-> !esc_en_i[esc_sel] ||
+      esc_state_o != phases[esc_map_i[esc_sel]] && esc_state_o != FsmError,
+      clk_i, !rst_ni || clr_i)
 
   //////////////////////
   // Helper Processes //
diff --git a/hw/ip/alert_handler/fpv/vip/alert_handler_ping_timer_assert_fpv.sv b/hw/ip/alert_handler/fpv/vip/alert_handler_ping_timer_assert_fpv.sv
index 35fa43c..12651a5 100644
--- a/hw/ip/alert_handler/fpv/vip/alert_handler_ping_timer_assert_fpv.sv
+++ b/hw/ip/alert_handler/fpv/vip/alert_handler_ping_timer_assert_fpv.sv
@@ -10,13 +10,15 @@
 module alert_handler_ping_timer_assert_fpv import alert_pkg::*; (
   input                   clk_i,
   input                   rst_ni,
-  input                   entropy_i,
+  input                   edn_req_o,
+  input                   edn_ack_i,
+  input [LfsrWidth-1:0]   edn_data_i,
   input                   en_i,
-  input [NAlerts-1:0]     alert_en_i,
+  input [NAlerts-1:0]     alert_ping_en_i,
   input [PING_CNT_DW-1:0] ping_timeout_cyc_i,
   input [PING_CNT_DW-1:0] wait_cyc_mask_i,
-  input [NAlerts-1:0]     alert_ping_en_o,
-  input [N_ESC_SEV-1:0]   esc_ping_en_o,
+  input [NAlerts-1:0]     alert_ping_req_o,
+  input [N_ESC_SEV-1:0]   esc_ping_req_o,
   input [NAlerts-1:0]     alert_ping_ok_i,
   input [N_ESC_SEV-1:0]   esc_ping_ok_i,
   input                   alert_ping_fail_o,
@@ -25,8 +27,8 @@
 
   logic [N_ESC_SEV+NAlerts-1:0] ping_en_vector, ping_en_mask, ping_ok_vector;
 
-  assign ping_en_vector = {esc_ping_en_o, alert_ping_en_o};
-  assign ping_en_mask   = {N_ESC_SEV'('1), alert_en_i};
+  assign ping_en_vector = {esc_ping_req_o, alert_ping_req_o};
+  assign ping_en_mask   = {N_ESC_SEV'('1), alert_ping_en_i};
   assign ping_ok_vector = {esc_ping_ok_i, alert_ping_ok_i};
 
   /////////////////
@@ -39,7 +41,7 @@
   `ASSUME_FPV(PingEnSelStable_M, ##1 $stable(ping_en_sel))
   // assume that the alert enable configuration is locked once en_i is high
   // this is ensured by the CSR regfile on the outside
-  `ASSUME_FPV(ConfigLocked0_M, en_i |-> ($stable(alert_en_i) [*]))
+  `ASSUME_FPV(ConfigLocked0_M, en_i |-> ($stable(alert_ping_en_i) [*]))
   `ASSUME_FPV(ConfigLocked1_M, en_i |-> ($stable(ping_timeout_cyc_i) [*]))
   // enable stays high forever, once it has been asserted
   // this can be enabled in DV as well
@@ -52,10 +54,10 @@
   ////////////////////////
 
   // no pings on disabled alerts
-  `ASSERT(DisabledNoAlertPings_A, ((~alert_en_i) & alert_ping_en_o) == 0)
+  `ASSERT(DisabledNoAlertPings_A, ((~alert_ping_en_i) & alert_ping_req_o) == 0)
   // no pings when not enabled
-  `ASSERT(NoPingsWhenDisabled0_A, !en_i |-> !alert_ping_en_o)
-  `ASSERT(NoPingsWhenDisabled1_A, !en_i |-> !esc_ping_en_o)
+  `ASSERT(NoPingsWhenDisabled0_A, !en_i |-> !alert_ping_req_o)
+  `ASSERT(NoPingsWhenDisabled1_A, !en_i |-> !esc_ping_req_o)
   `ASSERT(NoPingsWhenDisabled2_A, en_i && !ping_en_mask[ping_en_sel] |->
       !ping_en_vector[ping_en_sel])
 
@@ -77,8 +79,8 @@
   /////////////////////////
 
   // no pings when not enabled
-  `ASSERT(NoPingsWhenDisabledBkwd0_A, alert_ping_en_o |-> en_i)
-  `ASSERT(NoPingsWhenDisabledBkwd1_A, esc_ping_en_o   |-> en_i)
+  `ASSERT(NoPingsWhenDisabledBkwd0_A, alert_ping_req_o |-> en_i)
+  `ASSERT(NoPingsWhenDisabledBkwd1_A, esc_ping_req_o   |-> en_i)
 
   // spurious pings (i.e. pings that where not requested)
   // on alert channels