|  | // Copyright lowRISC contributors. | 
|  | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | // SPDX-License-Identifier: Apache-2.0 | 
|  | // | 
|  | // Wrapper module for computing enable / disable status on family of clocks | 
|  |  | 
|  | module clkmgr_clk_status #( | 
|  | parameter int NumClocks = 1, | 
|  | parameter int FilterStages = 2 | 
|  | ) ( | 
|  | input clk_i, | 
|  | input rst_ni, | 
|  | input [NumClocks-1:0] ens_i, | 
|  | output logic status_o | 
|  | ); | 
|  |  | 
|  | // The enables are coming from different clock domains, | 
|  | // therefore after synchronization we must de-bounce the | 
|  | // signal to ensure it is stable | 
|  | logic [NumClocks-1:0] ens_sync; | 
|  | prim_flop_2sync #( | 
|  | .Width(NumClocks) | 
|  | ) u_en_sync ( | 
|  | .clk_i, | 
|  | .rst_ni, | 
|  | .d_i(ens_i), | 
|  | .q_o(ens_sync) | 
|  | ); | 
|  |  | 
|  | logic [FilterStages-1:0] en_q, dis_q, en_d, dis_d; | 
|  |  | 
|  | // enable is true when all inputs are 1 | 
|  | assign en_d = {en_q[FilterStages-2:0], &ens_sync}; | 
|  |  | 
|  | // disable is true all all inputs are 0 | 
|  | assign dis_d = {dis_q[FilterStages-2:0], ~|ens_sync}; | 
|  |  | 
|  | always_ff @(posedge clk_i or negedge rst_ni) begin | 
|  | if (!rst_ni) begin | 
|  | en_q <= '0; | 
|  | dis_q <= '0; | 
|  | end else begin | 
|  | en_q <= en_d; | 
|  | dis_q <= dis_d; | 
|  | end | 
|  | end | 
|  |  | 
|  | always_ff @(posedge clk_i or negedge rst_ni) begin | 
|  | if (!rst_ni) begin | 
|  | status_o <= '0; | 
|  | end else if (&en_q) begin | 
|  | status_o <= 1'b1; | 
|  | end else if (&dis_q) begin | 
|  | status_o <= 1'b0; | 
|  | end | 
|  | end | 
|  |  | 
|  | endmodule // clkmgr_clk_status |