// Copyright lowRISC contributors (OpenTitan project). // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 `include "prim_assert.sv" module prim_sparse_fsm_flop #( parameter int Width = 1, parameter type StateEnumT = logic [Width-1:0], parameter logic [Width-1:0] ResetValue = '0, // This should only be disabled in special circumstances, for example // in non-comportable IPs where an error does not trigger an alert. parameter bit EnableAlertTriggerSVA = 1 `ifdef SIMULATION , // In case this parameter is set to a non-empty string, the // prim_sparse_fsm_flop_if will also force the signal with this name // in the parent module that instantiates prim_sparse_fsm_flop. parameter string CustomForceName = "" `endif ) ( input clk_i, input rst_ni, input StateEnumT state_i, output StateEnumT state_o ); logic unused_err_o; logic [Width-1:0] state_raw; prim_flop #( .Width(Width), .ResetValue(ResetValue) ) u_state_flop ( .clk_i, .rst_ni, .d_i(state_i), .q_o(state_raw) ); assign state_o = StateEnumT'(state_raw); `ifdef INC_ASSERT assign unused_err_o = is_undefined_state(state_o); function automatic logic is_undefined_state(StateEnumT sig); // This is written with a vector in order to make it amenable to x-prop analysis. logic is_defined = 1'b0; for (int i = 0, StateEnumT t = t.first(); i < t.num(); i += 1, t = t.next()) begin is_defined |= (sig === t); end return ~is_defined; endfunction `else assign unused_err_o = 1'b0; `endif // If ASSERT_PRIM_FSM_ERROR_TRIGGER_ALERT is declared, the unused_assert_connected signal will // be set to 1 and the below check will pass. // If the assertion is not declared however, the statement below will fail. `ifdef INC_ASSERT logic unused_assert_connected; `ASSERT_INIT_NET(AssertConnected_A, unused_assert_connected === 1'b1 || !EnableAlertTriggerSVA) `endif endmodule