[fpv] alert_rx/tx updates
Add support for alert_rx/tx new interface ports: `alert_req_i`,
`alert_ack_o`.
Signed-off-by: Cindy Chen <chencindy@google.com>
diff --git a/hw/ip/prim/fpv/tb/prim_alert_rxtx_async_bind_fpv.sv b/hw/ip/prim/fpv/tb/prim_alert_rxtx_async_bind_fpv.sv
index 3afa607..6e96ee6 100644
--- a/hw/ip/prim/fpv/tb/prim_alert_rxtx_async_bind_fpv.sv
+++ b/hw/ip/prim/fpv/tb/prim_alert_rxtx_async_bind_fpv.sv
@@ -18,7 +18,8 @@
.alert_err_pi,
.alert_err_ni,
.alert_skew_i,
- .alert_i,
+ .alert_req_i,
+ .alert_ack_o,
.ping_req_i,
.ping_ok_o,
.integ_fail_o,
diff --git a/hw/ip/prim/fpv/tb/prim_alert_rxtx_async_fpv.sv b/hw/ip/prim/fpv/tb/prim_alert_rxtx_async_fpv.sv
index d98bbc0..786345f 100644
--- a/hw/ip/prim/fpv/tb/prim_alert_rxtx_async_fpv.sv
+++ b/hw/ip/prim/fpv/tb/prim_alert_rxtx_async_fpv.sv
@@ -22,8 +22,9 @@
input alert_err_ni,
input [1:0] alert_skew_i,
// normal I/Os
- input alert_i,
+ input alert_req_i,
input ping_req_i,
+ output logic alert_ack_o,
output logic ping_ok_o,
output logic integ_fail_o,
output logic alert_o
@@ -68,9 +69,10 @@
prim_alert_sender #(
.AsyncOn ( AsyncOn )
) i_prim_alert_sender (
- .clk_i ,
- .rst_ni ,
- .alert_i ,
+ .clk_i ,
+ .rst_ni ,
+ .alert_req_i,
+ .alert_ack_o,
.alert_rx_i ( alert_rx_in ),
.alert_tx_o ( alert_tx_out )
);
diff --git a/hw/ip/prim/fpv/tb/prim_alert_rxtx_bind_fpv.sv b/hw/ip/prim/fpv/tb/prim_alert_rxtx_bind_fpv.sv
index a46902c..18071d1 100644
--- a/hw/ip/prim/fpv/tb/prim_alert_rxtx_bind_fpv.sv
+++ b/hw/ip/prim/fpv/tb/prim_alert_rxtx_bind_fpv.sv
@@ -15,7 +15,8 @@
.ack_err_ni,
.alert_err_pi,
.alert_err_ni,
- .alert_i,
+ .alert_req_i,
+ .alert_ack_o,
.ping_req_i,
.ping_ok_o,
.integ_fail_o,
diff --git a/hw/ip/prim/fpv/tb/prim_alert_rxtx_fpv.sv b/hw/ip/prim/fpv/tb/prim_alert_rxtx_fpv.sv
index 23f3c1f..a202340 100644
--- a/hw/ip/prim/fpv/tb/prim_alert_rxtx_fpv.sv
+++ b/hw/ip/prim/fpv/tb/prim_alert_rxtx_fpv.sv
@@ -19,8 +19,9 @@
input alert_err_pi,
input alert_err_ni,
// normal I/Os
- input alert_i,
+ input alert_req_i,
input ping_req_i,
+ output logic alert_ack_o,
output logic ping_ok_o,
output logic integ_fail_o,
output logic alert_o
@@ -43,9 +44,10 @@
prim_alert_sender #(
.AsyncOn ( AsyncOn )
) i_prim_alert_sender (
- .clk_i ,
- .rst_ni ,
- .alert_i ,
+ .clk_i ,
+ .rst_ni ,
+ .alert_req_i,
+ .alert_ack_o,
.alert_rx_i ( alert_rx_in ),
.alert_tx_o ( alert_tx_out )
);
diff --git a/hw/ip/prim/fpv/vip/prim_alert_rxtx_assert_fpv.sv b/hw/ip/prim/fpv/vip/prim_alert_rxtx_assert_fpv.sv
index 8f444dc..70cfd6a 100644
--- a/hw/ip/prim/fpv/vip/prim_alert_rxtx_assert_fpv.sv
+++ b/hw/ip/prim/fpv/vip/prim_alert_rxtx_assert_fpv.sv
@@ -18,7 +18,8 @@
input alert_err_pi,
input alert_err_ni,
// normal I/Os
- input alert_i,
+ input alert_req_i,
+ input alert_ack_o,
input ping_req_i,
input ping_ok_o,
input integ_fail_o,
@@ -38,9 +39,9 @@
// ping will stay high until ping ok received, then it must be deasserted
// TODO: this excludes the case where no ping ok will be returned due to an error
`ASSUME_FPV(PingDeassert_M, ping_req_i && ping_ok_o |=> !ping_req_i, clk_i, !rst_ni)
- `ASSUME_FPV(PingEnStaysAsserted0_M, ping_req_i |=> (ping_req_i && !ping_ok_o) or
- (ping_req_i && ping_ok_o ##1 $fell(ping_req_i)), clk_i, !rst_ni || error_present)
-
+ `ASSUME_FPV(PingEn_M, $rose(ping_req_i) |-> ping_req_i throughout
+ (ping_ok_o || error_present)[->1] ##1 $fell(ping_req_i),
+ clk_i, !rst_ni)
sequence FullHandshake_S;
$rose(prim_alert_rxtx_fpv.alert_tx_out.alert_p) ##1
$rose(prim_alert_rxtx_fpv.alert_rx_out.ack_p) &&
@@ -55,27 +56,37 @@
// only take place if both FSMs are in a sane state
`ASSERT(PingHs_A, ##1 $changed(prim_alert_rxtx_fpv.alert_rx_out.ping_p) &&
(prim_alert_rxtx_fpv.i_prim_alert_sender.state_q ==
- prim_alert_rxtx_fpv.i_prim_alert_sender.Idle ) &&
+ prim_alert_rxtx_fpv.i_prim_alert_sender.Idle) &&
(prim_alert_rxtx_fpv.i_prim_alert_receiver.state_q ==
- prim_alert_rxtx_fpv.i_prim_alert_receiver.Idle )|=> FullHandshake_S,
+ prim_alert_rxtx_fpv.i_prim_alert_receiver.Idle)|=> FullHandshake_S,
clk_i, !rst_ni || error_present)
- `ASSERT(AlertHs_A, alert_i &&
+ `ASSERT(AlertHs_A, alert_req_i &&
(prim_alert_rxtx_fpv.i_prim_alert_sender.state_q ==
prim_alert_rxtx_fpv.i_prim_alert_sender.Idle) &&
(prim_alert_rxtx_fpv.i_prim_alert_receiver.state_q ==
prim_alert_rxtx_fpv.i_prim_alert_receiver.Idle) |=>
- FullHandshake_S, clk_i, !rst_ni || error_present)
+ FullHandshake_S |-> alert_ack_o, clk_i, !rst_ni || error_present)
// transmission of pings
- `ASSERT(AlertPing_A, !error_present ##1 $rose(ping_req_i) |->
+ // note: the complete transmission of pings only happen when no ping handshake is in progress
+ `ASSERT(AlertPingOk_A, !(prim_alert_rxtx_fpv.i_prim_alert_sender.state_q inside {
+ prim_alert_rxtx_fpv.i_prim_alert_sender.PingHsPhase1,
+ prim_alert_rxtx_fpv.i_prim_alert_sender.PingHsPhase2}) && $rose(ping_req_i) |->
##[1:9] ping_ok_o, clk_i, !rst_ni || error_present)
+ `ASSERT(AlertPingIgnored_A, (prim_alert_rxtx_fpv.i_prim_alert_sender.state_q inside {
+ prim_alert_rxtx_fpv.i_prim_alert_sender.PingHsPhase1,
+ prim_alert_rxtx_fpv.i_prim_alert_sender.PingHsPhase2}) && $rose(ping_req_i) |->
+ ping_ok_o == 0 throughout ping_req_i [->1], clk_i, !rst_ni || error_present)
// transmission of alerts in case of no collision with ping enable
- `ASSERT(AlertCheck0_A, !ping_req_i [*3] ##0 $rose(alert_i) &&
+ `ASSERT(AlertCheck0_A, !ping_req_i [*3] ##0 $rose(alert_req_i) &&
(prim_alert_rxtx_fpv.i_prim_alert_sender.state_q ==
prim_alert_rxtx_fpv.i_prim_alert_sender.Idle) |=>
alert_o, clk_i, !rst_ni || error_present || ping_req_i)
- // transmission of alerts in the general case which can include ping collisions
- `ASSERT(AlertCheck1_A, alert_i |-> ##[1:9] alert_o, clk_i, !rst_ni || error_present)
+ // transmission of alerts in the general case which can include continous ping collisions
+ `ASSERT(AlertCheck1_A, alert_req_i |=>
+ strong(##[1:$] ((prim_alert_rxtx_fpv.i_prim_alert_sender.state_q ==
+ prim_alert_rxtx_fpv.i_prim_alert_sender.Idle) && !ping_req_i) ##1 alert_o),
+ clk_i, !rst_ni || error_present || alert_ack_o)
// basic liveness of FSMs in case no errors are present
`ASSERT(FsmLivenessSender_A,
diff --git a/hw/ip/prim/fpv/vip/prim_alert_rxtx_async_assert_fpv.sv b/hw/ip/prim/fpv/vip/prim_alert_rxtx_async_assert_fpv.sv
index 07dc1f5..c1cf394 100644
--- a/hw/ip/prim/fpv/vip/prim_alert_rxtx_async_assert_fpv.sv
+++ b/hw/ip/prim/fpv/vip/prim_alert_rxtx_async_assert_fpv.sv
@@ -21,7 +21,8 @@
input alert_err_ni,
input [1:0] alert_skew_i,
// normal I/Os
- input alert_i,
+ input alert_req_i,
+ input alert_ack_o,
input ping_req_i,
input ping_ok_o,
input integ_fail_o,
@@ -57,10 +58,9 @@
// ping will stay high until ping ok received, then it must be deasserted
// TODO: this excludes the case where no ping ok will be returned due to an error
`ASSUME_FPV(PingDeassert_M, ping_req_i && ping_ok_o |=> !ping_req_i, clk_i, !rst_ni)
- `ASSUME_FPV(PingEnStaysAsserted0_M, ping_req_i |=>
- (ping_req_i && !ping_ok_o) or
- (ping_req_i && ping_ok_o ##1 $fell(ping_req_i)),
- clk_i, !rst_ni || error_present)
+ `ASSUME_FPV(PingEn_M, $rose(ping_req_i) |-> ping_req_i throughout
+ (ping_ok_o || error_present)[->1] ##1 $fell(ping_req_i),
+ clk_i, !rst_ni)
// Note: the sequence lengths of the handshake and the following properties needs to
// be parameterized accordingly if different clock ratios are to be used here.
@@ -83,26 +83,37 @@
(prim_alert_rxtx_async_fpv.i_prim_alert_receiver.state_q ==
prim_alert_rxtx_async_fpv.i_prim_alert_receiver.Idle) |-> ##[0:5] FullHandshake_S,
clk_i, !rst_ni || error_setreg_q)
- `ASSERT(AlertHs_A, alert_i &&
+ `ASSERT(AlertHs_A, alert_req_i &&
(prim_alert_rxtx_async_fpv.i_prim_alert_sender.state_q ==
prim_alert_rxtx_async_fpv.i_prim_alert_sender.Idle) &&
(prim_alert_rxtx_async_fpv.i_prim_alert_receiver.state_q ==
- prim_alert_rxtx_async_fpv.i_prim_alert_receiver.Idle) |-> ##[0:5] FullHandshake_S,
+ prim_alert_rxtx_async_fpv.i_prim_alert_receiver.Idle) |-> ##[0:5] FullHandshake_S
+ ##[0:5] alert_ack_o,
clk_i, !rst_ni || error_setreg_q)
// transmission of pings
// this bound is relatively large as in the worst case, we need to resolve
// staggered differential signal patterns on all three differential channels
- `ASSERT(AlertPing_A, $rose(ping_req_i) |-> ##[1:23] ping_ok_o,
- clk_i, !rst_ni || error_setreg_q)
+ // note: the complete transmission of pings only happen when no ping handshake is in progress
+ `ASSERT(AlertPingOk_A, !(prim_alert_rxtx_async_fpv.i_prim_alert_sender.state_q inside {
+ prim_alert_rxtx_async_fpv.i_prim_alert_sender.PingHsPhase1,
+ prim_alert_rxtx_async_fpv.i_prim_alert_sender.PingHsPhase2}) && $rose(ping_req_i) |->
+ ##[1:23] ping_ok_o, clk_i, !rst_ni || error_setreg_q)
+ `ASSERT(AlertPingIgnored_A, (prim_alert_rxtx_async_fpv.i_prim_alert_sender.state_q inside {
+ prim_alert_rxtx_async_fpv.i_prim_alert_sender.PingHsPhase1,
+ prim_alert_rxtx_async_fpv.i_prim_alert_sender.PingHsPhase2}) && $rose(ping_req_i) |->
+ ping_ok_o == 0 throughout ping_req_i[->1], clk_i, !rst_ni || error_setreg_q)
// transmission of first alert assertion (no ping collision)
- `ASSERT(AlertCheck0_A, !ping_req_i [*10] ##1 $rose(alert_i) &&
+ `ASSERT(AlertCheck0_A, !ping_req_i [*10] ##1 $rose(alert_req_i) &&
(prim_alert_rxtx_async_fpv.i_prim_alert_sender.state_q ==
prim_alert_rxtx_async_fpv.i_prim_alert_sender.Idle) |->
##[3:5] alert_o, clk_i, !rst_ni || ping_req_i || error_setreg_q)
- // eventual transmission of alerts in the general case which can include ping collisions
- `ASSERT(AlertCheck1_A, alert_i |-> ##[1:25] alert_o,
- clk_i, !rst_ni || error_setreg_q)
+ // eventual transmission of alerts in the general case which can include continous ping
+ // collisions
+ `ASSERT(AlertCheck1_A, alert_req_i |->
+ strong(##[1:$] (prim_alert_rxtx_async_fpv.i_prim_alert_sender.state_q ==
+ prim_alert_rxtx_async_fpv.i_prim_alert_sender.Idle && !ping_req_i) ##[3:5] alert_o),
+ clk_i, !rst_ni || error_setreg_q || alert_ack_o)
// basic liveness of FSMs in case no errors are present
`ASSERT(FsmLivenessSender_A, !error_present [*2] ##1 !error_present &&