[fpv/padctrl] Add backward assertions
Add backward assertions for padctrl and padring's outputs
Fix small symbolic variable usage in padring
Signed-off-by: Cindy Chen <chencindy@google.com>
diff --git a/hw/ip/padctrl/fpv/vip/padctrl_assert_fpv.sv b/hw/ip/padctrl/fpv/vip/padctrl_assert_fpv.sv
index 9bb44f5..fb7585f 100644
--- a/hw/ip/padctrl/fpv/vip/padctrl_assert_fpv.sv
+++ b/hw/ip/padctrl/fpv/vip/padctrl_assert_fpv.sv
@@ -18,7 +18,7 @@
input clk_i,
input rst_ni,
// Bus Interface (device)
- input tlul_pkg::tl_h2d_t tl_i,
+ input tlul_pkg::tl_h2d_t tl_i,
input tlul_pkg::tl_d2h_t tl_o,
// pad attributes to chip level instance
input logic[padctrl_reg_pkg::NMioPads-1:0]
@@ -45,12 +45,20 @@
!(|mio_attr_o[mio_sel][padctrl_reg_pkg::AttrDw-1:6]))
`ASSERT(MioAttr_A, padctrl.reg2hw.mio_pads[mio_sel].qe |=>
mio_attr_o[mio_sel][5:0] == $past(padctrl.reg2hw.mio_pads[mio_sel].q[5:0]))
+ `ASSERT(MioBackwardCheck_A, ##2 !$stable(mio_attr_o[mio_sel]) |->
+ !$stable(padctrl.reg2hw.mio_pads[mio_sel].q[5:0]) ||
+ $rose($past(padctrl.reg2hw.mio_pads[mio_sel].qe)))
+
end else if (Impl == ImplXilinx) begin : gen_mio_xilinx
`ASSERT(MioWarl_A, padctrl.reg2hw.mio_pads[mio_sel].qe |=>
!(|padctrl.mio_attr_q[mio_sel][padctrl_reg_pkg::AttrDw-1:2]))
`ASSERT(MioAttr_A, padctrl.reg2hw.mio_pads[mio_sel].qe |=>
mio_attr_o[mio_sel][1:0] ==
$past(padctrl.reg2hw.mio_pads[mio_sel].q[1:0]))
+ `ASSERT(MioBackwardCheck_A, ##2 !$stable(mio_attr_o[mio_sel]) |->
+ !$stable(padctrl.reg2hw.mio_pads[mio_sel].q[1:0]) ||
+ $rose($past(padctrl.reg2hw.mio_pads[mio_sel].qe)))
+
end else begin : gen_mio_failure
`ASSERT_INIT(UnknownImpl_A, 0)
end
@@ -66,12 +74,20 @@
!(|dio_attr_o[dio_sel][padctrl_reg_pkg::AttrDw-1:6]))
`ASSERT(DioAttr_A, padctrl.reg2hw.dio_pads[dio_sel].qe |=>
dio_attr_o[dio_sel][5:0] == $past(padctrl.reg2hw.dio_pads[dio_sel].q[5:0]))
+ `ASSERT(DioBackwardCheck_A, ##2 !$stable(dio_attr_o[dio_sel]) |->
+ !$stable(padctrl.reg2hw.dio_pads[dio_sel].q[5:0]) ||
+ $rose($past(padctrl.reg2hw.dio_pads[dio_sel].qe)))
+
end else if (Impl == ImplXilinx) begin : gen_dio_xilinx
`ASSERT(DioWarl_A, padctrl.reg2hw.dio_pads[dio_sel].qe |=>
!(|padctrl.dio_attr_q[dio_sel][5:2]))
`ASSERT(DioAttr_A, padctrl.reg2hw.dio_pads[dio_sel].qe |=>
dio_attr_o[dio_sel][1:0] ==
$past(padctrl.reg2hw.dio_pads[dio_sel].q[1:0]))
+ `ASSERT(DioBackwardCheck_A, ##2 !$stable(dio_attr_o[dio_sel]) |->
+ !$stable(padctrl.reg2hw.dio_pads[dio_sel].q[1:0]) ||
+ $rose($past(padctrl.reg2hw.dio_pads[dio_sel].qe)))
+
end else begin : gen_dio_failure
`ASSERT_INIT(UnknownImpl_A, 0)
end
diff --git a/hw/ip/padctrl/fpv/vip/padring_assert_fpv.sv b/hw/ip/padctrl/fpv/vip/padring_assert_fpv.sv
index dcca3c2..2c83ad1 100644
--- a/hw/ip/padctrl/fpv/vip/padring_assert_fpv.sv
+++ b/hw/ip/padctrl/fpv/vip/padring_assert_fpv.sv
@@ -35,19 +35,24 @@
///////////////////////////////////////////////////////
`ASSERT(Clk_A, clk_pad_i === clk_o, clk_pad_i, !rst_pad_ni)
- `ASSERT(Rstpad__A, rst_pad_ni === rst_no, clk_pad_i, !rst_pad_ni)
+ `ASSERT(Rstpad_A, rst_pad_ni === rst_no, clk_pad_i, !rst_pad_ni)
/////////////////////////
// Check muxed IO pads //
/////////////////////////
`ASSUME(NMioRange_M, mio_sel < padctrl_reg_pkg::NMioPads, clk_pad_i, !rst_pad_ni)
+ `ASSUME(NMioStable_M, ##1 $stable(mio_sel), clk_pad_i, !rst_pad_ni)
// attribute 0 is the input/output inversion bit
logic mio_output_value;
assign mio_output_value = mio_out_i[mio_sel] ^ mio_attr_i[mio_sel][0];
- `ASSERT(MioIn_A, mio_in_o[mio_sel] == mio_pad_io[mio_sel] ^ mio_attr_i[mio_sel][0],
+ `ASSERT(MioIn_A, mio_in_o[mio_sel] == mio_pad_io[mio_sel] ^ mio_attr_i[mio_sel][0],
+ clk_pad_i, !rst_pad_ni)
+
+ `ASSERT(MioInBackwardCheck_A, ##1 !$stable(mio_in_o[mio_sel]) |->
+ !$stable(mio_pad_io[mio_sel]) || !$stable(mio_attr_i[mio_sel][0]),
clk_pad_i, !rst_pad_ni)
`ASSERT(MioOutNormal_A, mio_oe_i[mio_sel] && !mio_attr_i[mio_sel][1] |->
@@ -75,6 +80,7 @@
/////////////////////////////
`ASSUME(NDioRange_M, dio_sel < padctrl_reg_pkg::NDioPads, clk_pad_i, !rst_pad_ni)
+ `ASSUME(NDioStable_M, ##1 $stable(dio_sel), clk_pad_i, !rst_pad_ni)
// attribute 0 is the input/output inversion bit
logic dio_output_value;
@@ -83,6 +89,10 @@
`ASSERT(DioIn_A, dio_in_o[dio_sel] == dio_pad_io[dio_sel] ^ dio_attr_i[dio_sel][0],
clk_pad_i, !rst_pad_ni)
+ `ASSERT(DioInBackwardCheck_A, ##1 !$stable(dio_in_o[dio_sel]) |->
+ !$stable(dio_pad_io[dio_sel]) || !$stable(dio_attr_i[dio_sel][0]),
+ clk_pad_i, !rst_pad_ni)
+
`ASSERT(DioOutNormal_A, dio_oe_i[dio_sel] && !dio_attr_i[dio_sel][1] |->
dio_output_value == dio_pad_io[dio_sel], clk_pad_i, !rst_pad_ni)