// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// This module records the reset reason
//

`include "prim_assert.sv"

module rstmgr_info #(
  parameter int Reasons = 4
) (
  input clk_i,
  input rst_ni,
  input rst_cpu_ni,
  input [Reasons-1:0] rst_req_i,
  input wr_i,
  input [Reasons:0] data_i,              // inclusive of POR
  output logic [Reasons:0] rst_reasons_o // inclusive of POR
);

  logic [Reasons-1:0] reasons;
  logic por;
  logic first_reset;
  logic rst_cpu_nq;

  prim_flop_2sync #(
    .Width(1),
    .ResetValue('0)
  ) u_cpu_reset_synced (
    .clk_i(clk_i),
    .rst_ni(rst_ni),
    .d_i(rst_cpu_ni),
    .q_o(rst_cpu_nq)
  );

  // first reset is a flag that blocks reset recording until first de-assertion
  always_ff @(posedge clk_i or negedge rst_ni) begin
    if (!rst_ni) begin
      first_reset <= 1'b1;
    end else if (rst_cpu_nq) begin
      first_reset <= 1'b0;
    end
  end

  // if cpu has gone into reset, record reset causes
  // the reasons is a logical OR, so that signals that were once asserted do not go away.
  always_ff @(posedge clk_i or negedge rst_ni) begin
    if (!rst_ni) begin
      por <= 1'b1;
      reasons <= '0;
    end else if (!rst_cpu_nq && !first_reset) begin
      reasons <= reasons | rst_req_i;
    end else if (wr_i) begin
      {reasons, por} <= {reasons, por} & ~data_i;
    end
  end

  assign rst_reasons_o = {reasons, por};

endmodule // rstmgr_info
