|  | // Copyright lowRISC contributors. | 
|  | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | // SPDX-License-Identifier: Apache-2.0 | 
|  | // | 
|  | // Power Manager Wake Information | 
|  | // | 
|  |  | 
|  | `include "prim_assert.sv" | 
|  |  | 
|  | module pwrmgr_wake_info import pwrmgr_pkg::*; import pwrmgr_reg_pkg::*; | 
|  | ( | 
|  | input clk_i, | 
|  | input rst_ni, | 
|  | input wr_i, | 
|  | input [TotalWakeWidth-1:0] data_i, | 
|  | input start_capture_i, | 
|  | input record_dis_i, | 
|  | input [NumWkups-1:0] wakeups_i, | 
|  | input fall_through_i, | 
|  | input abort_i, | 
|  | output pwrmgr_hw2reg_wake_info_reg_t info_o | 
|  | ); | 
|  |  | 
|  | logic record_en; | 
|  |  | 
|  | // detect rising edge of start_capture_i | 
|  | logic start_capture_q1, start_capture; | 
|  | always_ff @(posedge clk_i or negedge rst_ni) begin | 
|  | if (!rst_ni) begin | 
|  | start_capture_q1 <= 1'b1; | 
|  | end else begin | 
|  | start_capture_q1 <= start_capture_i; | 
|  | end | 
|  | end | 
|  |  | 
|  | assign start_capture = start_capture_i & ~start_capture_q1; | 
|  |  | 
|  | // generate the record enbale signal | 
|  | // HW enables the recording | 
|  | // Software can suppress the recording or disable it | 
|  | always_ff @(posedge clk_i or negedge rst_ni) begin | 
|  | if (!rst_ni) begin | 
|  | record_en <= 1'b0; | 
|  | end else if (start_capture && !record_dis_i) begin | 
|  | // if not disabled by software | 
|  | // a recording enable puls by HW starts recording | 
|  | record_en <= 1'b1; | 
|  | end else if (record_dis_i && record_en) begin | 
|  | // if recording is already ongoing | 
|  | // a disable command by software shuts things down | 
|  | record_en <= 1'b0; | 
|  | end | 
|  | end | 
|  |  | 
|  | logic [TotalWakeWidth-1:0] info; | 
|  | always_ff @(posedge clk_i or negedge rst_ni) begin | 
|  | if (!rst_ni) begin | 
|  | info <= '0; | 
|  | end else if (wr_i) begin | 
|  | info <= info & ~data_i; // W1C | 
|  | end else if (record_en) begin // If set once, hold until clear | 
|  | info[0 +: NumWkups] <= info[0 +: NumWkups] | wakeups_i; | 
|  | info[NumWkups +: 2] <= info[NumWkups +: 2] | {abort_i, fall_through_i}; | 
|  | end | 
|  | end | 
|  |  | 
|  | // assign outputs | 
|  | assign info_o.abort.d = info[NumWkups + 1]; | 
|  | assign info_o.fall_through.d = info[NumWkups]; | 
|  | assign info_o.reasons = info[NumWkups-1:0]; | 
|  |  | 
|  |  | 
|  |  | 
|  | endmodule |