| // 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 |