../src/lowrisc_prim_all_0.1/rtl/prim_filter.sv Cov: 100%
1: // Copyright 2018 lowRISC contributors.
2: // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3: // SPDX-License-Indentifier: Apache-2.0
4: //
5: // Primitive input filter, with enable. Configurable number of cycles.
6: //
7: // when in reset, stored vector is zero
8: // when enable is false, output is input
9: // when enable is true, output is stored value,
10: // new input must be opposite value from stored value for
11: // #Cycles before switching to new value.
12:
13: module prim_filter #(parameter int Cycles = 4) (
14: input clk_i,
15: input rst_ni,
16: input enable_i,
17: input filter_i,
18: output filter_o
19: );
20:
21: logic [Cycles-1:0] stored_vector_q, stored_vector_d;
22: logic stored_value_q, update_stored_value;
23: logic unused_stored_vector_q_msb;
24:
25: always_ff @(posedge clk_i or negedge rst_ni) begin
26: if (!rst_ni) begin
27: stored_value_q <= 1'b0;
28: end else if (update_stored_value) begin
29: stored_value_q <= filter_i;
30: end
31: end
32:
33: assign stored_vector_d = {stored_vector_q[Cycles-2:0],filter_i};
34: assign unused_stored_vector_q_msb = stored_vector_q[Cycles-1];
35:
36: always_ff @(posedge clk_i or negedge rst_ni) begin
37: if (!rst_ni) begin
38: stored_vector_q <= {Cycles{1'b0}};
39: end else begin
40: stored_vector_q <= stored_vector_d;
41: end
42: end
43:
44: assign update_stored_value =
45: (stored_vector_d == {Cycles{1'b0}}) |
46: (stored_vector_d == {Cycles{1'b1}});
47:
48: assign filter_o = enable_i ? stored_value_q : filter_i;
49:
50: endmodule
51:
52: