blob: ca2599e36e9d7f82f21a3c5de007aa3377a16f4f [file] [log] [blame]
// Copyright lowRISC contributors.
// 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