@@ -40,6 +40,7 @@ localparam int unsigned TOT_DEPTH = H*D
40
40
)(
41
41
input logic clk_i,
42
42
input logic rst_ni,
43
+ input logic [REP - 1 : 0 ] buffer_clk_en_i,
43
44
input logic [REP - 1 : 0 ] clear_i,
44
45
input x_buffer_ctrl_t [REP - 1 : 0 ] ctrl_i,
45
46
output x_buffer_flgs_t [REP - 1 : 0 ] flags_o,
@@ -48,6 +49,16 @@ localparam int unsigned TOT_DEPTH = H*D
48
49
output logic fault_o
49
50
);
50
51
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
+
51
62
// W Index Counnter
52
63
logic [REP - 1 : 0 ][$clog2 (W ): 0 ] w_index_b, w_index_v, w_index_d, w_index_q;
53
64
logic [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
78
89
assign w_index_b[r] = '0 ;
79
90
end
80
91
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
82
95
83
96
// Depth Shift Counter with partial deactivation
84
97
logic [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
107
120
assign d_shift_b[r] = '0 ;
108
121
end
109
122
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
111
126
112
127
for (genvar r = 0 ; r < REP ; r++ ) begin : gen_empty_next_state
113
128
always_comb begin
@@ -127,7 +142,9 @@ for (genvar r = 0; r < REP; r++) begin: gen_empty_default_state
127
142
assign empty_count_b[r] = '0 ;
128
143
end
129
144
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
131
148
132
149
for (genvar r = 0 ; r < REP ; r++ ) begin : gen_depth_shift_counter_reset
133
150
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
170
187
assign h_index_b[r] = '0 ;
171
188
end
172
189
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
174
193
175
194
// From here on out we use the signal of the first replica.
176
195
// 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
226
245
end
227
246
end
228
247
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 );
231
250
232
251
// Output assignment
233
252
generate
0 commit comments