@@ -40,6 +40,7 @@ localparam int unsigned TOT_DEPTH = H*D
4040)(
4141 input logic clk_i,
4242 input logic rst_ni,
43+ input logic [REP - 1 : 0 ] buffer_clk_en_i,
4344 input logic [REP - 1 : 0 ] clear_i,
4445 input x_buffer_ctrl_t [REP - 1 : 0 ] ctrl_i,
4546 output x_buffer_flgs_t [REP - 1 : 0 ] flags_o,
@@ -48,6 +49,16 @@ localparam int unsigned TOT_DEPTH = H*D
4849 output logic fault_o
4950);
5051
52+ logic [REP - 1 : 0 ] buffer_clock;
53+ for (genvar r = 0 ; r < REP ; r++ ) begin : gen_clock_gate_cells
54+ tc_clk_gating i_x_buffer_clock_gating (
55+ .clk_i ( clk_i ),
56+ .en_i ( buffer_clk_en_i[r] ),
57+ .test_en_i ( '0 ),
58+ .clk_o ( buffer_clock[r] )
59+ );
60+ end
61+
5162// W Index Counnter
5263logic [REP - 1 : 0 ][$clog2 (W ): 0 ] w_index_b, w_index_v, w_index_d, w_index_q;
5364logic [REP - 1 : 0 ][$clog2 (W ): 0 ] w_limit_v;
@@ -78,7 +89,9 @@ for (genvar r = 0; r < REP; r++) begin: gen_w_counter_default_state
7889 assign w_index_b[r] = '0 ;
7990end
8091
81- `FF (w_index_q, w_index_d, w_index_b);
92+ for (genvar r = 0 ; r < REP ; r++ ) begin : gen_w_counter_clock_gated_ffs
93+ `FFARN (w_index_q[r], w_index_d[r], w_index_b[r], buffer_clock[r], rst_ni);
94+ end
8295
8396// Depth Shift Counter with partial deactivation
8497logic [REP - 1 : 0 ][$clog2 (D ): 0 ] d_shift_b, d_shift_v, d_shift_d, d_shift_q;
@@ -107,7 +120,9 @@ for (genvar r = 0; r < REP; r++) begin: gen_d_shift_default_state
107120 assign d_shift_b[r] = '0 ;
108121end
109122
110- `FF (d_shift_q, d_shift_d, d_shift_b);
123+ for (genvar r = 0 ; r < REP ; r++ ) begin : gen_d_shift_clock_gated_ffs
124+ `FFARN (d_shift_q[r], d_shift_d[r], d_shift_b[r], buffer_clock[r], rst_ni);
125+ end
111126
112127for (genvar r = 0 ; r < REP ; r++ ) begin : gen_empty_next_state
113128 always_comb begin
@@ -127,7 +142,9 @@ for (genvar r = 0; r < REP; r++) begin: gen_empty_default_state
127142 assign empty_count_b[r] = '0 ;
128143end
129144
130- `FF (empty_count_q, empty_count_d, empty_count_b);
145+ for (genvar r = 0 ; r < REP ; r++ ) begin : gen_empty_counter_clock_gated_ffs
146+ `FFARN (empty_count_q[r], empty_count_d[r], empty_count_b[r], buffer_clock[r], rst_ni);
147+ end
131148
132149for (genvar r = 0 ; r < REP ; r++ ) begin : gen_depth_shift_counter_reset
133150 always_comb begin : empty_gen_and_shift_count_rst
@@ -170,7 +187,9 @@ for (genvar r = 0; r < REP; r++) begin: gen_h_counter_default_state
170187 assign h_index_b[r] = '0 ;
171188end
172189
173- `FF (h_index_q, h_index_d, h_index_b);
190+ for (genvar r = 0 ; r < REP ; r++ ) begin : gen_h_counter_clock_gated_ffs
191+ `FFARN (h_index_q[r], h_index_d[r], h_index_b[r], buffer_clock[r], rst_ni);
192+ end
174193
175194// From here on out we use the signal of the first replica.
176195// If a fault happens on it then we can detect it since there is no more recursive dependency
@@ -226,8 +245,8 @@ always_comb begin
226245 end
227246end
228247
229- `FF (x_pad_q, x_pad_d, '0 );
230- `FF (x_buffer_q, x_buffer_d, '0 );
248+ `FFARN (x_pad_q, x_pad_d, '0 , buffer_clock[ 0 ], rst_ni );
249+ `FFARN (x_buffer_q, x_buffer_d, '0 , buffer_clock[ 0 ], rst_ni );
231250
232251// Output assignment
233252generate
0 commit comments