Line Coverage for Module :
flash_phy_prog
| Line No. | Total | Covered | Percent |
TOTAL | | 96 | 96 | 100.00 |
CONT_ASSIGN | 111 | 1 | 1 | 100.00 |
CONT_ASSIGN | 122 | 1 | 1 | 100.00 |
CONT_ASSIGN | 126 | 1 | 1 | 100.00 |
ALWAYS | 130 | 3 | 3 | 100.00 |
CONT_ASSIGN | 138 | 1 | 1 | 100.00 |
CONT_ASSIGN | 143 | 1 | 1 | 100.00 |
CONT_ASSIGN | 144 | 1 | 1 | 100.00 |
CONT_ASSIGN | 147 | 1 | 1 | 100.00 |
CONT_ASSIGN | 148 | 1 | 1 | 100.00 |
ALWAYS | 151 | 6 | 6 | 100.00 |
ALWAYS | 164 | 3 | 3 | 100.00 |
ALWAYS | 174 | 51 | 51 | 100.00 |
ALWAYS | 299 | 12 | 12 | 100.00 |
CONT_ASSIGN | 314 | 1 | 1 | 100.00 |
ALWAYS | 323 | 4 | 4 | 100.00 |
CONT_ASSIGN | 331 | 1 | 1 | 100.00 |
CONT_ASSIGN | 352 | 1 | 1 | 100.00 |
CONT_ASSIGN | 355 | 1 | 1 | 100.00 |
CONT_ASSIGN | 365 | 1 | 1 | 100.00 |
CONT_ASSIGN | 366 | 1 | 1 | 100.00 |
ALWAYS | 369 | 3 | 3 | 100.00 |
110 // selects empty data or real data
111 1/1 assign pack_data = (data_sel == Actual) ? data_i[BusWidth-1:0] : {BusWidth{1'b1}};
Tests: T1 T2 T3
112
113 logic data_intg_ok;
114 logic data_err;
115
116 // use the tlul integrity module directly for bus integrity
117 // SEC_CM: MEM.BUS.INTEGRITY
118 tlul_data_integ_dec u_data_intg_chk (
119 .data_intg_i(data_i),
120 .data_err_o(data_err)
121 );
122 1/1 assign data_intg_ok = ~data_err;
Tests: T1 T2 T3
123
124 logic data_invalid_q, data_invalid_d;
125 // hold on integrity failure indication until reset
126 1/1 assign data_invalid_d = data_invalid_q |
Tests: T1 T2 T3
127 (pack_valid & ~data_intg_ok);
128
129 always_ff @(posedge clk_i or negedge rst_ni) begin
130 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
131 1/1 data_invalid_q <= '0;
Tests: T1 T2 T3
132 end else begin
133 1/1 data_invalid_q <= data_invalid_d;
Tests: T1 T2 T3
134 end
135 end
136
137 // indication to upper layer presence of error
138 1/1 assign intg_err_o = data_invalid_q;
Tests: T1 T2 T3
139
140 // if integrity failure is seen, fake communication with flash
141 // and simply terminate
142 logic ack, done;
143 1/1 assign ack = ack_i | data_invalid_q;
Tests: T1 T2 T3
144 1/1 assign done = done_i | data_invalid_q;
Tests: T1 T2 T3
145
146 // next idx will be aligned
147 1/1 assign idx_sub_one = idx - 1'b1;
Tests: T1 T2 T3
148 1/1 assign align_next = (idx > '0) ? (idx_sub_one == sel_i) : 1'b0;
Tests: T1 T2 T3
149
150 always_ff @(posedge clk_i or negedge rst_ni) begin
151 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
152 1/1 idx <= '0;
Tests: T1 T2 T3
153 1/1 end else if (pack_valid && idx == MaxIdx) begin
Tests: T1 T2 T3
154 // when a flash word is packed full, return index to 0
155 1/1 idx <= '0;
Tests: T2 T7 T11
156 1/1 end else if (pack_valid) begin
Tests: T1 T2 T3
157 // increment otherwise
158 1/1 idx <= idx + 1'b1;
Tests: T2 T7 T11
159 end
MISSING_ELSE
160 end
161
162
163 // SEC_CM: PHY_PROG.FSM.SPARSE
164 3/3 `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, StIdle)
Tests: T1 T2 T3 | T1 T2 T3 | T1 T2 T3
PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, StIdle):
164.1 `ifdef SIMULATION
164.2 prim_sparse_fsm_flop #(
164.3 .StateEnumT(state_e),
164.4 .Width($bits(state_e)),
164.5 .ResetValue($bits(state_e)'(StIdle)),
164.6 .EnableAlertTriggerSVA(1),
164.7 .CustomForceName("state_q")
164.8 ) u_state_regs (
164.9 .clk_i ( clk_i ),
164.10 .rst_ni ( rst_ni ),
164.11 .state_i ( state_d ),
164.12 .state_o ( )
164.13 );
164.14 always_ff @(posedge clk_i or negedge rst_ni) begin
164.15 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
164.16 1/1 state_q <= StIdle;
Tests: T1 T2 T3
164.17 end else begin
164.18 1/1 state_q <= state_d;
Tests: T1 T2 T3
164.19 end
164.20 end
164.21 u_state_regs_A: assert property (@(posedge clk_i) disable iff ((!rst_ni) !== '0) (state_q === u_state_regs.state_o))
164.22 else begin
164.23 `ifdef UVM
164.24 uvm_pkg::uvm_report_error("ASSERT FAILED", "u_state_regs_A", uvm_pkg::UVM_NONE,
164.25 "../src/lowrisc_opentitan_top_earlgrey_flash_ctrl_0.1/rtl/flash_phy_prog.sv", 164, "", 1);
164.26 `else
164.27 $error("%0t: (%0s:%0d) [%m] [ASSERT FAILED] %0s", $time, `__FILE__, `__LINE__,
164.28 `PRIM_STRINGIFY(u_state_regs_A));
164.29 `endif
164.30 end
164.31 `else
164.32 prim_sparse_fsm_flop #(
164.33 .StateEnumT(state_e),
164.34 .Width($bits(state_e)),
164.35 .ResetValue($bits(state_e)'(StIdle)),
164.36 .EnableAlertTriggerSVA(1)
164.37 ) u_state_regs (
164.38 .clk_i ( `PRIM_FLOP_CLK ),
164.39 .rst_ni ( `PRIM_FLOP_RST ),
164.40 .state_i ( state_d ),
164.41 .state_o ( state_q )
164.42 );
164.43 `endif165
166 // If the first beat of an incoming transaction is not aligned to word boundary (for example
167 // if each flash word is 4 bus words wide, and the first word to program starts at index 1),
168 // the fsm pre-packs the flash word with empty words until the supplied index.
169 // Once at the index, real data supplied from the flash controller is packed until the last
170 // beat of data. At the last beat of data, if it is not also aligned (index 3 in this example),
171 // more empty words are packed at the end to fill out the word.
172 //
173 always_comb begin
174 1/1 state_d = state_q;
Tests: T1 T2 T3
175
176 1/1 pack_valid = 1'b0;
Tests: T1 T2 T3
177 1/1 data_sel = Filler;
Tests: T1 T2 T3
178 1/1 plain_ecc_en = 1'b0;
Tests: T1 T2 T3
179 1/1 req_o = 1'b0;
Tests: T1 T2 T3
180 1/1 ack_o = 1'b0;
Tests: T1 T2 T3
181 1/1 last_o = 1'b0;
Tests: T1 T2 T3
182 1/1 calc_req_o = 1'b0;
Tests: T1 T2 T3
183 1/1 scramble_req_o = 1'b0;
Tests: T1 T2 T3
184 1/1 fsm_err_o = 1'b0;
Tests: T1 T2 T3
185
186 1/1 unique case (state_q)
Tests: T1 T2 T3
187 StIdle: begin
188 // if first beat of a transaction is not aligned, prepack with empty bits
189 1/1 if (prim_mubi_pkg::mubi4_test_true_loose(disable_i)) begin
Tests: T1 T2 T3
190 // only disable during idle state to ensure program is able to gracefully complete
191 // this is important as we do not want to accidentally disturb any electrical procedure
192 // internal to the flash macro
193 1/1 state_d = StDisabled;
Tests: T7 T8 T9
194 1/1 end else if (req_i && |sel_i) begin
Tests: T1 T2 T3
195 1/1 state_d = StPrePack;
Tests: T9 T59 T45
196 1/1 end else if (req_i) begin
Tests: T1 T2 T3
197 1/1 state_d = StPackData;
Tests: T2 T7 T11
198 end
MISSING_ELSE
199 end
200
201 StPrePack: begin
202 // pack until currently supplied data
203 1/1 pack_valid = (idx < sel_i);
Tests: T9 T59 T45
204 1/1 if (idx == align_next) begin
Tests: T9 T59 T45
205 1/1 state_d = StPackData;
Tests: T9 T59 T45
206 end
MISSING_ELSE
207 end
208
209 StPackData: begin
210 1/1 pack_valid = req_i;
Tests: T2 T7 T11
211 1/1 data_sel = Actual;
Tests: T2 T7 T11
212
213 1/1 if (req_i && idx == MaxIdx) begin
Tests: T2 T7 T11
214 // last beat of a flash word
215 1/1 state_d = StCalcPlainEcc;
Tests: T2 T7 T11
216 1/1 end else if (req_i && last_i) begin
Tests: T2 T7 T11
217 // last beat is not aligned with the last entry of flash word
218 1/1 state_d = StPostPack;
Tests: T9 T59 T45
219 1/1 end else if (req_i) begin
Tests: T2 T7 T11
220 1/1 ack_o = 1'b1;
Tests: T2 T7 T11
221 end
MISSING_ELSE
222 end
223
224 StPostPack: begin
225 // supply filler data
226 1/1 pack_valid = 1'b1;
Tests: T9 T59 T45
227 1/1 data_sel = Filler;
Tests: T9 T59 T45
228
229 // finish packing remaining entries
230 1/1 if (idx == MaxIdx) begin
Tests: T9 T59 T45
231 1/1 state_d = StCalcPlainEcc;
Tests: T9 T59 T45
232 end
MISSING_ELSE
233 end
234
235 StCalcPlainEcc: begin
236 1/1 plain_ecc_en = 1'b1;
Tests: T2 T7 T11
237 1/1 state_d = scramble_i ? StCalcMask : StReqFlash;
Tests: T2 T7 T11
238 end
239
240 StCalcMask: begin
241 1/1 calc_req_o = 1'b1;
Tests: T7 T11 T8
242
243 1/1 if (calc_ack_i) begin
Tests: T7 T11 T8
244 1/1 state_d = StScrambleData;
Tests: T7 T11 T8
245 end
MISSING_ELSE
246 end
247
248 StScrambleData: begin
249 1/1 scramble_req_o = 1'b1;
Tests: T7 T11 T8
250
251 1/1 if (scramble_ack_i) begin
Tests: T7 T11 T8
252 1/1 state_d = StCalcEcc;
Tests: T7 T8 T9
253 end
MISSING_ELSE
254 end
255
256 StCalcEcc: begin
257 1/1 state_d = StReqFlash;
Tests: T7 T8 T9
258 end
259
260 StReqFlash: begin
261 // only request flash if data integrity was valid
262 1/1 req_o = ~data_invalid_q;
Tests: T2 T7 T12
263 1/1 last_o = last_i;
Tests: T2 T7 T12
264
265 // if this is the last beat of the program burst
266 // - wait for done
267 // if this is NOT the last beat
268 // - ack the upstream request and accept more beats
269 1/1 if (last_i) begin
Tests: T2 T7 T12
270 1/1 state_d = ack ? StWaitFlash : StReqFlash;
Tests: T2 T7 T12
271 end else begin
272 1/1 ack_o = ack;
Tests: T2 T7 T12
273 1/1 state_d = ack ? StIdle : StReqFlash;
Tests: T2 T7 T12
274 end
275 end
276
277 StWaitFlash: begin
278 1/1 if (done) begin
Tests: T2 T7 T12
279 1/1 ack_o = 1'b1;
Tests: T2 T7 T12
280 1/1 state_d = StIdle;
Tests: T2 T7 T12
281 end
MISSING_ELSE
282 end
283
284 StDisabled: begin
285 1/1 state_d = StDisabled;
Tests: T7 T8 T9
286 end
287
288 default: begin
289 fsm_err_o = 1'b1;
290 end
291
292 endcase // unique case (state_q)
293
294 end
295
296 logic [DataWidth-1:0] mask_q;
297
298 always_ff @(posedge clk_i or negedge rst_ni) begin
299 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
300 1/1 packed_data <= '0;
Tests: T1 T2 T3
301 1/1 mask_q <= '0;
Tests: T1 T2 T3
302 1/1 end else if (req_o && ack) begin
Tests: T1 T2 T3
303 1/1 packed_data <= '0;
Tests: T2 T7 T12
304 1/1 end else if (calc_req_o && calc_ack_i) begin
Tests: T1 T2 T3
305 1/1 packed_data <= packed_data ^ mask_i;
Tests: T7 T11 T8
306 1/1 mask_q <= mask_i;
Tests: T7 T11 T8
307 1/1 end else if (scramble_req_o && scramble_ack_i) begin
Tests: T1 T2 T3
308 1/1 packed_data <= scrambled_data_i[DataWidth-1:0] ^ mask_q;
Tests: T7 T8 T9
309 1/1 end else if (pack_valid) begin
Tests: T1 T2 T3
310 1/1 packed_data[idx] <= pack_data;
Tests: T2 T7 T11
311 end
MISSING_ELSE
312 end
313
314 1/1 assign block_data_o = packed_data;
Tests: T1 T2 T3
315
316 // ECC handling
317 localparam int PlainDataEccWidth = DataWidth + 8;
318
319 logic [FullDataWidth-1:0] ecc_data;
320 logic [PlainDataEccWidth-1:0] plain_data_w_ecc;
321 logic [PlainIntgWidth-1:0] plain_data_ecc;
322 always_ff @(posedge clk_i or negedge rst_ni) begin
323 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
324 1/1 plain_data_ecc <= '1;
Tests: T1 T2 T3
325 1/1 end else if (plain_ecc_en) begin
Tests: T1 T2 T3
326 1/1 plain_data_ecc <= plain_data_w_ecc[DataWidth +: PlainIntgWidth];
Tests: T2 T7 T11
327 end
MISSING_ELSE
328 end
329
330 logic [PlainDataWidth-1:0] ecc_data_in;
331 1/1 assign ecc_data_in = {plain_data_ecc, packed_data};
Tests: T1 T2 T3
332
333 // reliability ECC calculation
334 prim_secded_hamming_76_68_enc u_enc (
335 .data_i(ecc_data_in),
336 .data_o(ecc_data)
337 );
338
339 // integrity ECC calculation
340 // This instance can technically be merged with the instance above, but is
341 // kept separate for the sake of convenience
342 // The plain data ecc is calculated continuously from packed data (which changes
343 // from packed data to masked/scrambled data based on software configuration).
344 // The actual plain data ECC is explicitly captured during this process when
345 // it is required.
346 prim_secded_hamming_72_64_enc u_plain_enc (
347 .data_i(packed_data),
348 .data_o(plain_data_w_ecc)
349 );
350
351 logic unused_data;
352 1/1 assign unused_data = |plain_data_w_ecc;
Tests: T1 T2 T3
353
354 // pad the remaining bits with '1' if ecc is not used.
355 1/1 assign data_o = ecc_i ? ecc_data : {{EccWidth{1'b1}}, ecc_data_in};
Tests: T1 T2 T3
356
357 /////////////////////////////////
358 // Assertions
359 /////////////////////////////////
360
361 `ifdef INC_ASSERT
362 logic txn_done;
363 logic [15:0] done_cnt_d, done_cnt_q;
364
365 1/1 assign txn_done = req_i && ack_o && last_i;
Tests: T1 T2 T3
366 1/1 assign done_cnt_d = txn_done ? '0 : (done ? done_cnt_q + 16'h1 : done_cnt_q);
Tests: T1 T2 T3
367
368 always_ff @(posedge clk_i or negedge rst_ni) begin
369 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
370 1/1 done_cnt_q <= '0;
Tests: T1 T2 T3
371 end else begin
372 1/1 done_cnt_q <= done_cnt_d;
Tests: T1 T2 T3
Cond Coverage for Module :
flash_phy_prog
| Total | Covered | Percent |
Conditions | 65 | 64 | 98.46 |
Logical | 65 | 64 | 98.46 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 111
EXPRESSION ((data_sel == Actual) ? data_i[(flash_phy_pkg::BusWidth - 1):0] : ({flash_phy_pkg::BusWidth {1'b1}}))
----------1---------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T2,T7,T11 |
LINE 111
SUB-EXPRESSION (data_sel == Actual)
----------1---------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T2,T7,T11 |
LINE 126
EXPRESSION (data_invalid_q | (pack_valid & ((~data_intg_ok))))
-------1------ ----------------2---------------
-1- | -2- | Status | Tests |
0 | 0 | Covered | T1,T2,T3 |
0 | 1 | Covered | T8,T121,T18 |
1 | 0 | Covered | T8,T121,T18 |
LINE 126
SUB-EXPRESSION (pack_valid & ((~data_intg_ok)))
-----1---- --------2--------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T2,T7,T11 |
1 | 1 | Covered | T8,T121,T18 |
LINE 143
EXPRESSION (ack_i | data_invalid_q)
--1-- -------2------
-1- | -2- | Status | Tests |
0 | 0 | Covered | T1,T2,T3 |
0 | 1 | Covered | T249,T93 |
1 | 0 | Covered | T1,T2,T3 |
LINE 144
EXPRESSION (done_i | data_invalid_q)
---1-- -------2------
-1- | -2- | Status | Tests |
0 | 0 | Covered | T1,T2,T3 |
0 | 1 | Covered | T8,T121,T18 |
1 | 0 | Covered | T1,T2,T3 |
LINE 148
EXPRESSION ((idx > '0) ? (idx_sub_one == sel_i) : 1'b0)
-----1----
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T2,T7,T11 |
LINE 148
SUB-EXPRESSION (idx_sub_one == sel_i)
-----------1----------
-1- | Status | Tests |
0 | Covered | T2,T7,T11 |
1 | Covered | T59,T45,T74 |
LINE 153
EXPRESSION (pack_valid && (idx == MaxIdx))
-----1---- -------2-------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T2,T7,T11 |
1 | 0 | Covered | T2,T7,T11 |
1 | 1 | Covered | T2,T7,T11 |
LINE 153
SUB-EXPRESSION (idx == MaxIdx)
-------1-------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T2,T7,T11 |
LINE 194
EXPRESSION (req_i && ((|sel_i)))
--1-- -----2----
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T2,T7,T11 |
1 | 1 | Covered | T59,T45,T74 |
LINE 204
EXPRESSION (idx == align_next)
---------1---------
-1- | Status | Tests |
0 | Covered | T9,T10 |
1 | Covered | T9,T59,T45 |
LINE 213
EXPRESSION (req_i && (idx == MaxIdx))
--1-- -------2-------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T2,T7,T11 |
1 | 0 | Covered | T2,T7,T11 |
1 | 1 | Covered | T2,T7,T11 |
LINE 213
SUB-EXPRESSION (idx == MaxIdx)
-------1-------
-1- | Status | Tests |
0 | Covered | T2,T7,T11 |
1 | Covered | T2,T7,T11 |
LINE 216
EXPRESSION (req_i && last_i)
--1-- ---2--
-1- | -2- | Status | Tests |
0 | 1 | Covered | T2,T7,T12 |
1 | 0 | Covered | T2,T7,T11 |
1 | 1 | Covered | T59,T45,T74 |
LINE 230
EXPRESSION (idx == MaxIdx)
-------1-------
-1- | Status | Tests |
0 | Covered | T9,T10 |
1 | Covered | T59,T45,T74 |
LINE 237
EXPRESSION (scramble_i ? StCalcMask : StReqFlash)
-----1----
-1- | Status | Tests |
0 | Covered | T2,T12,T8 |
1 | Covered | T7,T11,T8 |
LINE 270
EXPRESSION (ack ? StWaitFlash : StReqFlash)
-1-
-1- | Status | Tests |
0 | Covered | T2,T7,T12 |
1 | Covered | T2,T7,T12 |
LINE 273
EXPRESSION (ack ? StIdle : StReqFlash)
-1-
-1- | Status | Tests |
0 | Covered | T2,T7,T12 |
1 | Covered | T2,T7,T12 |
LINE 302
EXPRESSION (req_o && ack)
--1-- -2-
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T2,T7,T12 |
1 | 1 | Covered | T2,T7,T12 |
LINE 304
EXPRESSION (calc_req_o && calc_ack_i)
-----1---- -----2----
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T7,T11,T8 |
1 | 1 | Covered | T7,T11,T8 |
LINE 307
EXPRESSION (scramble_req_o && scramble_ack_i)
-------1------ -------2------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T7,T8,T9 |
1 | 1 | Covered | T7,T8,T9 |
LINE 355
EXPRESSION (ecc_i ? ecc_data : ({{flash_phy_pkg::EccWidth {1'b1}}, ecc_data_in}))
--1--
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 365
EXPRESSION (req_i && ack_o && last_i)
--1-- --2-- ---3--
-1- | -2- | -3- | Status | Tests |
0 | 1 | 1 | Not Covered | |
1 | 0 | 1 | Covered | T2,T7,T12 |
1 | 1 | 0 | Covered | T2,T7,T11 |
1 | 1 | 1 | Covered | T2,T7,T12 |
LINE 366
EXPRESSION (txn_done ? '0 : (done ? ((done_cnt_q + 16'b1)) : done_cnt_q))
----1---
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T2,T7,T12 |
LINE 366
SUB-EXPRESSION (done ? ((done_cnt_q + 16'b1)) : done_cnt_q)
--1-
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
FSM Coverage for Module :
flash_phy_prog
Summary for FSM :: state_q
| Total | Covered | Percent | |
States |
11 |
11 |
100.00 |
(Not included in score) |
Transitions |
15 |
15 |
100.00 |
|
Sequences |
0 |
0 |
|
|
State, Transition and Sequence Details for FSM :: state_q
states | Line No. | Covered | Tests |
StCalcEcc |
252 |
Covered |
T7,T8,T9 |
StCalcMask |
237 |
Covered |
T7,T11,T8 |
StCalcPlainEcc |
215 |
Covered |
T2,T7,T11 |
StDisabled |
193 |
Covered |
T7,T8,T15 |
StIdle |
273 |
Covered |
T1,T2,T3 |
StPackData |
197 |
Covered |
T2,T7,T11 |
StPostPack |
218 |
Covered |
T59,T45,T74 |
StPrePack |
195 |
Covered |
T59,T45,T74 |
StReqFlash |
237 |
Covered |
T2,T7,T12 |
StScrambleData |
244 |
Covered |
T7,T11,T8 |
StWaitFlash |
270 |
Covered |
T2,T7,T12 |
transitions | Line No. | Covered | Tests |
StCalcEcc->StReqFlash |
257 |
Covered |
T7,T8,T9 |
StCalcMask->StScrambleData |
244 |
Covered |
T7,T11,T8 |
StCalcPlainEcc->StCalcMask |
237 |
Covered |
T7,T11,T8 |
StCalcPlainEcc->StReqFlash |
237 |
Covered |
T2,T12,T8 |
StIdle->StDisabled |
193 |
Covered |
T7,T8,T15 |
StIdle->StPackData |
197 |
Covered |
T2,T7,T11 |
StIdle->StPrePack |
195 |
Covered |
T59,T45,T74 |
StPackData->StCalcPlainEcc |
215 |
Covered |
T2,T7,T11 |
StPackData->StPostPack |
218 |
Covered |
T59,T45,T74 |
StPostPack->StCalcPlainEcc |
231 |
Covered |
T59,T45,T74 |
StPrePack->StPackData |
205 |
Covered |
T59,T45,T74 |
StReqFlash->StIdle |
273 |
Covered |
T2,T7,T12 |
StReqFlash->StWaitFlash |
270 |
Covered |
T2,T7,T12 |
StScrambleData->StCalcEcc |
252 |
Covered |
T7,T8,T9 |
StWaitFlash->StIdle |
280 |
Covered |
T2,T7,T12 |
Branch Coverage for Module :
flash_phy_prog
| Line No. | Total | Covered | Percent |
Branches |
|
55 |
55 |
100.00 |
TERNARY |
111 |
2 |
2 |
100.00 |
TERNARY |
148 |
2 |
2 |
100.00 |
TERNARY |
355 |
2 |
2 |
100.00 |
TERNARY |
366 |
3 |
3 |
100.00 |
IF |
130 |
2 |
2 |
100.00 |
IF |
151 |
4 |
4 |
100.00 |
IF |
164 |
2 |
2 |
100.00 |
CASE |
186 |
27 |
27 |
100.00 |
IF |
299 |
6 |
6 |
100.00 |
IF |
323 |
3 |
3 |
100.00 |
IF |
369 |
2 |
2 |
100.00 |
111 assign pack_data = (data_sel == Actual) ? data_i[BusWidth-1:0] : {BusWidth{1'b1}};
-1-
==>
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T2,T7,T11 |
0 |
Covered |
T1,T2,T3 |
148 assign align_next = (idx > '0) ? (idx_sub_one == sel_i) : 1'b0;
-1-
==>
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T2,T7,T11 |
0 |
Covered |
T1,T2,T3 |
355 assign data_o = ecc_i ? ecc_data : {{EccWidth{1'b1}}, ecc_data_in};
-1-
==>
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
366 assign done_cnt_d = txn_done ? '0 : (done ? done_cnt_q + 16'h1 : done_cnt_q);
-1- -2-
==> ==>
==>
Branches:
-1- | -2- | Status | Tests |
1 |
- |
Covered |
T2,T7,T12 |
0 |
1 |
Covered |
T1,T2,T3 |
0 |
0 |
Covered |
T1,T2,T3 |
130 if (!rst_ni) begin
-1-
131 data_invalid_q <= '0;
==>
132 end else begin
133 data_invalid_q <= data_invalid_d;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
151 if (!rst_ni) begin
-1-
152 idx <= '0;
==>
153 end else if (pack_valid && idx == MaxIdx) begin
-2-
154 // when a flash word is packed full, return index to 0
155 idx <= '0;
==>
156 end else if (pack_valid) begin
-3-
157 // increment otherwise
158 idx <= idx + 1'b1;
==>
159 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
1 |
- |
- |
Covered |
T1,T2,T3 |
0 |
1 |
- |
Covered |
T2,T7,T11 |
0 |
0 |
1 |
Covered |
T2,T7,T11 |
0 |
0 |
0 |
Covered |
T1,T2,T3 |
164 `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, StIdle)
-1-
==>
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
186 unique case (state_q)
-1-
187 StIdle: begin
188 // if first beat of a transaction is not aligned, prepack with empty bits
189 if (prim_mubi_pkg::mubi4_test_true_loose(disable_i)) begin
-2-
190 // only disable during idle state to ensure program is able to gracefully complete
191 // this is important as we do not want to accidentally disturb any electrical procedure
192 // internal to the flash macro
193 state_d = StDisabled;
==>
194 end else if (req_i && |sel_i) begin
-3-
195 state_d = StPrePack;
==>
196 end else if (req_i) begin
-4-
197 state_d = StPackData;
==>
198 end
MISSING_ELSE
==>
199 end
200
201 StPrePack: begin
202 // pack until currently supplied data
203 pack_valid = (idx < sel_i);
204 if (idx == align_next) begin
-5-
205 state_d = StPackData;
==>
206 end
MISSING_ELSE
==>
207 end
208
209 StPackData: begin
210 pack_valid = req_i;
211 data_sel = Actual;
212
213 if (req_i && idx == MaxIdx) begin
-6-
214 // last beat of a flash word
215 state_d = StCalcPlainEcc;
==>
216 end else if (req_i && last_i) begin
-7-
217 // last beat is not aligned with the last entry of flash word
218 state_d = StPostPack;
==>
219 end else if (req_i) begin
-8-
220 ack_o = 1'b1;
==>
221 end
MISSING_ELSE
==>
222 end
223
224 StPostPack: begin
225 // supply filler data
226 pack_valid = 1'b1;
227 data_sel = Filler;
228
229 // finish packing remaining entries
230 if (idx == MaxIdx) begin
-9-
231 state_d = StCalcPlainEcc;
==>
232 end
MISSING_ELSE
==>
233 end
234
235 StCalcPlainEcc: begin
236 plain_ecc_en = 1'b1;
237 state_d = scramble_i ? StCalcMask : StReqFlash;
-10-
==>
==>
238 end
239
240 StCalcMask: begin
241 calc_req_o = 1'b1;
242
243 if (calc_ack_i) begin
-11-
244 state_d = StScrambleData;
==>
245 end
MISSING_ELSE
==>
246 end
247
248 StScrambleData: begin
249 scramble_req_o = 1'b1;
250
251 if (scramble_ack_i) begin
-12-
252 state_d = StCalcEcc;
==>
253 end
MISSING_ELSE
==>
254 end
255
256 StCalcEcc: begin
257 state_d = StReqFlash;
==>
258 end
259
260 StReqFlash: begin
261 // only request flash if data integrity was valid
262 req_o = ~data_invalid_q;
263 last_o = last_i;
264
265 // if this is the last beat of the program burst
266 // - wait for done
267 // if this is NOT the last beat
268 // - ack the upstream request and accept more beats
269 if (last_i) begin
-13-
270 state_d = ack ? StWaitFlash : StReqFlash;
-14-
==>
==>
271 end else begin
272 ack_o = ack;
273 state_d = ack ? StIdle : StReqFlash;
-15-
==>
==>
274 end
275 end
276
277 StWaitFlash: begin
278 if (done) begin
-16-
279 ack_o = 1'b1;
==>
280 state_d = StIdle;
281 end
MISSING_ELSE
==>
282 end
283
284 StDisabled: begin
285 state_d = StDisabled;
==>
286 end
287
288 default: begin
289 fsm_err_o = 1'b1;
==>
Branches:
-1- | -2- | -3- | -4- | -5- | -6- | -7- | -8- | -9- | -10- | -11- | -12- | -13- | -14- | -15- | -16- | Status | Tests |
StIdle |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T7,T8,T9 |
StIdle |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T59,T45 |
StIdle |
0 |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T2,T7,T11 |
StIdle |
0 |
0 |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T1,T2,T3 |
StPrePack |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T59,T45 |
StPrePack |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T10 |
StPackData |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T2,T7,T11 |
StPackData |
- |
- |
- |
- |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T59,T45 |
StPackData |
- |
- |
- |
- |
0 |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T2,T7,T11 |
StPackData |
- |
- |
- |
- |
0 |
0 |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T2,T7,T11 |
StPostPack |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T59,T45 |
StPostPack |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T10 |
StCalcPlainEcc |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
Covered |
T7,T11,T8 |
StCalcPlainEcc |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
Covered |
T2,T12,T8 |
StCalcMask |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
Covered |
T7,T11,T8 |
StCalcMask |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
Covered |
T7,T11,T8 |
StScrambleData |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
Covered |
T7,T8,T9 |
StScrambleData |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
Covered |
T7,T11,T8 |
StCalcEcc |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T7,T8,T9 |
StReqFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
1 |
- |
- |
Covered |
T2,T7,T12 |
StReqFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
0 |
- |
- |
Covered |
T2,T7,T12 |
StReqFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
1 |
- |
Covered |
T2,T7,T12 |
StReqFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
0 |
- |
Covered |
T2,T7,T12 |
StWaitFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
Covered |
T2,T7,T12 |
StWaitFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
Covered |
T2,T7,T12 |
StDisabled |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T7,T8,T9 |
default |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T10,T16 |
299 if (!rst_ni) begin
-1-
300 packed_data <= '0;
==>
301 mask_q <= '0;
302 end else if (req_o && ack) begin
-2-
303 packed_data <= '0;
==>
304 end else if (calc_req_o && calc_ack_i) begin
-3-
305 packed_data <= packed_data ^ mask_i;
==>
306 mask_q <= mask_i;
307 end else if (scramble_req_o && scramble_ack_i) begin
-4-
308 packed_data <= scrambled_data_i[DataWidth-1:0] ^ mask_q;
==>
309 end else if (pack_valid) begin
-5-
310 packed_data[idx] <= pack_data;
==>
311 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | -4- | -5- | Status | Tests |
1 |
- |
- |
- |
- |
Covered |
T1,T2,T3 |
0 |
1 |
- |
- |
- |
Covered |
T2,T7,T12 |
0 |
0 |
1 |
- |
- |
Covered |
T7,T11,T8 |
0 |
0 |
0 |
1 |
- |
Covered |
T7,T8,T9 |
0 |
0 |
0 |
0 |
1 |
Covered |
T2,T7,T11 |
0 |
0 |
0 |
0 |
0 |
Covered |
T1,T2,T3 |
323 if (!rst_ni) begin
-1-
324 plain_data_ecc <= '1;
==>
325 end else if (plain_ecc_en) begin
-2-
326 plain_data_ecc <= plain_data_w_ecc[DataWidth +: PlainIntgWidth];
==>
327 end
MISSING_ELSE
==>
Branches:
-1- | -2- | Status | Tests |
1 |
- |
Covered |
T1,T2,T3 |
0 |
1 |
Covered |
T2,T7,T11 |
0 |
0 |
Covered |
T1,T2,T3 |
369 if (!rst_ni) begin
-1-
370 done_cnt_q <= '0;
==>
371 end else begin
372 done_cnt_q <= done_cnt_d;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
Assert Coverage for Module :
flash_phy_prog
Assertion Details
OneDonePerTxn_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
747591906 |
2433686 |
0 |
0 |
T2 |
3525 |
14 |
0 |
0 |
T3 |
1219 |
0 |
0 |
0 |
T4 |
1433 |
0 |
0 |
0 |
T7 |
1352 |
1 |
0 |
0 |
T8 |
4369 |
1 |
0 |
0 |
T9 |
656 |
0 |
0 |
0 |
T11 |
2053 |
0 |
0 |
0 |
T12 |
2602 |
1 |
0 |
0 |
T13 |
34283 |
0 |
0 |
0 |
T15 |
0 |
1 |
0 |
0 |
T17 |
1829 |
0 |
0 |
0 |
T19 |
1958 |
1 |
0 |
0 |
T20 |
42997 |
254 |
0 |
0 |
T22 |
0 |
1 |
0 |
0 |
T24 |
0 |
1 |
0 |
0 |
T29 |
114745 |
0 |
0 |
0 |
T37 |
35890 |
154 |
0 |
0 |
T38 |
31423 |
76 |
0 |
0 |
T43 |
13318 |
1 |
0 |
0 |
T45 |
0 |
25 |
0 |
0 |
T49 |
0 |
28 |
0 |
0 |
T59 |
3051 |
3 |
0 |
0 |
T64 |
2484 |
0 |
0 |
0 |
T66 |
0 |
288 |
0 |
0 |
T73 |
0 |
45 |
0 |
0 |
T92 |
0 |
50 |
0 |
0 |
T106 |
4279 |
0 |
0 |
0 |
T145 |
1355 |
0 |
0 |
0 |
PostPackRule_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
747591906 |
1767 |
0 |
0 |
T29 |
114745 |
0 |
0 |
0 |
T30 |
0 |
15 |
0 |
0 |
T38 |
31423 |
0 |
0 |
0 |
T39 |
65239 |
0 |
0 |
0 |
T44 |
2155 |
0 |
0 |
0 |
T45 |
129340 |
35 |
0 |
0 |
T48 |
0 |
2 |
0 |
0 |
T49 |
0 |
34 |
0 |
0 |
T51 |
28820 |
0 |
0 |
0 |
T56 |
1821 |
0 |
0 |
0 |
T59 |
3051 |
3 |
0 |
0 |
T65 |
1335 |
0 |
0 |
0 |
T67 |
7393 |
0 |
0 |
0 |
T68 |
66631 |
0 |
0 |
0 |
T69 |
45342 |
0 |
0 |
0 |
T73 |
164213 |
0 |
0 |
0 |
T74 |
70627 |
2 |
0 |
0 |
T78 |
0 |
4 |
0 |
0 |
T79 |
0 |
6 |
0 |
0 |
T80 |
3567 |
0 |
0 |
0 |
T92 |
162267 |
0 |
0 |
0 |
T94 |
0 |
1 |
0 |
0 |
T105 |
0 |
12 |
0 |
0 |
T110 |
357218 |
0 |
0 |
0 |
T111 |
53736 |
0 |
0 |
0 |
T143 |
0 |
4 |
0 |
0 |
T173 |
0 |
1 |
0 |
0 |
T224 |
0 |
5 |
0 |
0 |
T225 |
0 |
3 |
0 |
0 |
T230 |
2125 |
0 |
0 |
0 |
T250 |
0 |
1 |
0 |
0 |
PrePackRule_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
747591906 |
1231 |
0 |
0 |
T29 |
114745 |
0 |
0 |
0 |
T30 |
0 |
12 |
0 |
0 |
T38 |
31423 |
0 |
0 |
0 |
T39 |
65239 |
0 |
0 |
0 |
T44 |
2155 |
0 |
0 |
0 |
T45 |
129340 |
29 |
0 |
0 |
T48 |
0 |
2 |
0 |
0 |
T49 |
0 |
24 |
0 |
0 |
T51 |
28820 |
0 |
0 |
0 |
T56 |
1821 |
0 |
0 |
0 |
T59 |
3051 |
2 |
0 |
0 |
T65 |
1335 |
0 |
0 |
0 |
T67 |
7393 |
0 |
0 |
0 |
T68 |
66631 |
0 |
0 |
0 |
T69 |
45342 |
0 |
0 |
0 |
T73 |
164213 |
0 |
0 |
0 |
T74 |
70627 |
2 |
0 |
0 |
T75 |
0 |
2 |
0 |
0 |
T78 |
0 |
2 |
0 |
0 |
T79 |
0 |
1 |
0 |
0 |
T80 |
3567 |
0 |
0 |
0 |
T92 |
162267 |
0 |
0 |
0 |
T94 |
0 |
3 |
0 |
0 |
T105 |
0 |
17 |
0 |
0 |
T110 |
357218 |
0 |
0 |
0 |
T111 |
53736 |
0 |
0 |
0 |
T143 |
0 |
6 |
0 |
0 |
T224 |
0 |
8 |
0 |
0 |
T225 |
0 |
2 |
0 |
0 |
T230 |
2125 |
0 |
0 |
0 |
T251 |
0 |
2 |
0 |
0 |
WidthCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
2116 |
2116 |
0 |
0 |
T1 |
2 |
2 |
0 |
0 |
T2 |
2 |
2 |
0 |
0 |
T3 |
2 |
2 |
0 |
0 |
T4 |
2 |
2 |
0 |
0 |
T7 |
2 |
2 |
0 |
0 |
T8 |
2 |
2 |
0 |
0 |
T11 |
2 |
2 |
0 |
0 |
T12 |
2 |
2 |
0 |
0 |
T13 |
2 |
2 |
0 |
0 |
T17 |
2 |
2 |
0 |
0 |
u_state_regs_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
747591906 |
745898988 |
0 |
0 |
T1 |
4640 |
4534 |
0 |
0 |
T2 |
7050 |
6914 |
0 |
0 |
T3 |
2438 |
2312 |
0 |
0 |
T4 |
2866 |
2690 |
0 |
0 |
T7 |
2704 |
2518 |
0 |
0 |
T8 |
8738 |
7806 |
0 |
0 |
T11 |
4106 |
3790 |
0 |
0 |
T12 |
5204 |
5056 |
0 |
0 |
T13 |
68566 |
68414 |
0 |
0 |
T17 |
3658 |
3492 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[1].u_core.gen_prog_data.u_prog
| Line No. | Total | Covered | Percent |
TOTAL | | 96 | 96 | 100.00 |
CONT_ASSIGN | 111 | 1 | 1 | 100.00 |
CONT_ASSIGN | 122 | 1 | 1 | 100.00 |
CONT_ASSIGN | 126 | 1 | 1 | 100.00 |
ALWAYS | 130 | 3 | 3 | 100.00 |
CONT_ASSIGN | 138 | 1 | 1 | 100.00 |
CONT_ASSIGN | 143 | 1 | 1 | 100.00 |
CONT_ASSIGN | 144 | 1 | 1 | 100.00 |
CONT_ASSIGN | 147 | 1 | 1 | 100.00 |
CONT_ASSIGN | 148 | 1 | 1 | 100.00 |
ALWAYS | 151 | 6 | 6 | 100.00 |
ALWAYS | 164 | 3 | 3 | 100.00 |
ALWAYS | 174 | 51 | 51 | 100.00 |
ALWAYS | 299 | 12 | 12 | 100.00 |
CONT_ASSIGN | 314 | 1 | 1 | 100.00 |
ALWAYS | 323 | 4 | 4 | 100.00 |
CONT_ASSIGN | 331 | 1 | 1 | 100.00 |
CONT_ASSIGN | 352 | 1 | 1 | 100.00 |
CONT_ASSIGN | 355 | 1 | 1 | 100.00 |
CONT_ASSIGN | 365 | 1 | 1 | 100.00 |
CONT_ASSIGN | 366 | 1 | 1 | 100.00 |
ALWAYS | 369 | 3 | 3 | 100.00 |
110 // selects empty data or real data
111 1/1 assign pack_data = (data_sel == Actual) ? data_i[BusWidth-1:0] : {BusWidth{1'b1}};
Tests: T1 T2 T3
112
113 logic data_intg_ok;
114 logic data_err;
115
116 // use the tlul integrity module directly for bus integrity
117 // SEC_CM: MEM.BUS.INTEGRITY
118 tlul_data_integ_dec u_data_intg_chk (
119 .data_intg_i(data_i),
120 .data_err_o(data_err)
121 );
122 1/1 assign data_intg_ok = ~data_err;
Tests: T1 T2 T3
123
124 logic data_invalid_q, data_invalid_d;
125 // hold on integrity failure indication until reset
126 1/1 assign data_invalid_d = data_invalid_q |
Tests: T1 T2 T3
127 (pack_valid & ~data_intg_ok);
128
129 always_ff @(posedge clk_i or negedge rst_ni) begin
130 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
131 1/1 data_invalid_q <= '0;
Tests: T1 T2 T3
132 end else begin
133 1/1 data_invalid_q <= data_invalid_d;
Tests: T1 T2 T3
134 end
135 end
136
137 // indication to upper layer presence of error
138 1/1 assign intg_err_o = data_invalid_q;
Tests: T1 T2 T3
139
140 // if integrity failure is seen, fake communication with flash
141 // and simply terminate
142 logic ack, done;
143 1/1 assign ack = ack_i | data_invalid_q;
Tests: T1 T2 T3
144 1/1 assign done = done_i | data_invalid_q;
Tests: T1 T2 T3
145
146 // next idx will be aligned
147 1/1 assign idx_sub_one = idx - 1'b1;
Tests: T1 T2 T3
148 1/1 assign align_next = (idx > '0) ? (idx_sub_one == sel_i) : 1'b0;
Tests: T1 T2 T3
149
150 always_ff @(posedge clk_i or negedge rst_ni) begin
151 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
152 1/1 idx <= '0;
Tests: T1 T2 T3
153 1/1 end else if (pack_valid && idx == MaxIdx) begin
Tests: T1 T2 T3
154 // when a flash word is packed full, return index to 0
155 1/1 idx <= '0;
Tests: T9 T43 T19
156 1/1 end else if (pack_valid) begin
Tests: T1 T2 T3
157 // increment otherwise
158 1/1 idx <= idx + 1'b1;
Tests: T9 T43 T19
159 end
MISSING_ELSE
160 end
161
162
163 // SEC_CM: PHY_PROG.FSM.SPARSE
164 3/3 `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, StIdle)
Tests: T1 T2 T3 | T1 T2 T3 | T1 T2 T3
PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, StIdle):
164.1 `ifdef SIMULATION
164.2 prim_sparse_fsm_flop #(
164.3 .StateEnumT(state_e),
164.4 .Width($bits(state_e)),
164.5 .ResetValue($bits(state_e)'(StIdle)),
164.6 .EnableAlertTriggerSVA(1),
164.7 .CustomForceName("state_q")
164.8 ) u_state_regs (
164.9 .clk_i ( clk_i ),
164.10 .rst_ni ( rst_ni ),
164.11 .state_i ( state_d ),
164.12 .state_o ( )
164.13 );
164.14 always_ff @(posedge clk_i or negedge rst_ni) begin
164.15 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
164.16 1/1 state_q <= StIdle;
Tests: T1 T2 T3
164.17 end else begin
164.18 1/1 state_q <= state_d;
Tests: T1 T2 T3
164.19 end
164.20 end
164.21 u_state_regs_A: assert property (@(posedge clk_i) disable iff ((!rst_ni) !== '0) (state_q === u_state_regs.state_o))
164.22 else begin
164.23 `ifdef UVM
164.24 uvm_pkg::uvm_report_error("ASSERT FAILED", "u_state_regs_A", uvm_pkg::UVM_NONE,
164.25 "../src/lowrisc_opentitan_top_earlgrey_flash_ctrl_0.1/rtl/flash_phy_prog.sv", 164, "", 1);
164.26 `else
164.27 $error("%0t: (%0s:%0d) [%m] [ASSERT FAILED] %0s", $time, `__FILE__, `__LINE__,
164.28 `PRIM_STRINGIFY(u_state_regs_A));
164.29 `endif
164.30 end
164.31 `else
164.32 prim_sparse_fsm_flop #(
164.33 .StateEnumT(state_e),
164.34 .Width($bits(state_e)),
164.35 .ResetValue($bits(state_e)'(StIdle)),
164.36 .EnableAlertTriggerSVA(1)
164.37 ) u_state_regs (
164.38 .clk_i ( `PRIM_FLOP_CLK ),
164.39 .rst_ni ( `PRIM_FLOP_RST ),
164.40 .state_i ( state_d ),
164.41 .state_o ( state_q )
164.42 );
164.43 `endif165
166 // If the first beat of an incoming transaction is not aligned to word boundary (for example
167 // if each flash word is 4 bus words wide, and the first word to program starts at index 1),
168 // the fsm pre-packs the flash word with empty words until the supplied index.
169 // Once at the index, real data supplied from the flash controller is packed until the last
170 // beat of data. At the last beat of data, if it is not also aligned (index 3 in this example),
171 // more empty words are packed at the end to fill out the word.
172 //
173 always_comb begin
174 1/1 state_d = state_q;
Tests: T1 T2 T3
175
176 1/1 pack_valid = 1'b0;
Tests: T1 T2 T3
177 1/1 data_sel = Filler;
Tests: T1 T2 T3
178 1/1 plain_ecc_en = 1'b0;
Tests: T1 T2 T3
179 1/1 req_o = 1'b0;
Tests: T1 T2 T3
180 1/1 ack_o = 1'b0;
Tests: T1 T2 T3
181 1/1 last_o = 1'b0;
Tests: T1 T2 T3
182 1/1 calc_req_o = 1'b0;
Tests: T1 T2 T3
183 1/1 scramble_req_o = 1'b0;
Tests: T1 T2 T3
184 1/1 fsm_err_o = 1'b0;
Tests: T1 T2 T3
185
186 1/1 unique case (state_q)
Tests: T1 T2 T3
187 StIdle: begin
188 // if first beat of a transaction is not aligned, prepack with empty bits
189 1/1 if (prim_mubi_pkg::mubi4_test_true_loose(disable_i)) begin
Tests: T1 T2 T3
190 // only disable during idle state to ensure program is able to gracefully complete
191 // this is important as we do not want to accidentally disturb any electrical procedure
192 // internal to the flash macro
193 1/1 state_d = StDisabled;
Tests: T7 T8 T9
194 1/1 end else if (req_i && |sel_i) begin
Tests: T1 T2 T3
195 1/1 state_d = StPrePack;
Tests: T9 T45 T49
196 1/1 end else if (req_i) begin
Tests: T1 T2 T3
197 1/1 state_d = StPackData;
Tests: T9 T43 T19
198 end
MISSING_ELSE
199 end
200
201 StPrePack: begin
202 // pack until currently supplied data
203 1/1 pack_valid = (idx < sel_i);
Tests: T9 T45 T49
204 1/1 if (idx == align_next) begin
Tests: T9 T45 T49
205 1/1 state_d = StPackData;
Tests: T9 T45 T49
206 end
MISSING_ELSE
207 end
208
209 StPackData: begin
210 1/1 pack_valid = req_i;
Tests: T9 T43 T19
211 1/1 data_sel = Actual;
Tests: T9 T43 T19
212
213 1/1 if (req_i && idx == MaxIdx) begin
Tests: T9 T43 T19
214 // last beat of a flash word
215 1/1 state_d = StCalcPlainEcc;
Tests: T9 T43 T19
216 1/1 end else if (req_i && last_i) begin
Tests: T9 T43 T19
217 // last beat is not aligned with the last entry of flash word
218 1/1 state_d = StPostPack;
Tests: T9 T45 T49
219 1/1 end else if (req_i) begin
Tests: T9 T43 T19
220 1/1 ack_o = 1'b1;
Tests: T9 T43 T19
221 end
MISSING_ELSE
222 end
223
224 StPostPack: begin
225 // supply filler data
226 1/1 pack_valid = 1'b1;
Tests: T9 T45 T49
227 1/1 data_sel = Filler;
Tests: T9 T45 T49
228
229 // finish packing remaining entries
230 1/1 if (idx == MaxIdx) begin
Tests: T9 T45 T49
231 1/1 state_d = StCalcPlainEcc;
Tests: T9 T45 T49
232 end
MISSING_ELSE
233 end
234
235 StCalcPlainEcc: begin
236 1/1 plain_ecc_en = 1'b1;
Tests: T9 T43 T19
237 1/1 state_d = scramble_i ? StCalcMask : StReqFlash;
Tests: T9 T43 T19
238 end
239
240 StCalcMask: begin
241 1/1 calc_req_o = 1'b1;
Tests: T9 T43 T19
242
243 1/1 if (calc_ack_i) begin
Tests: T9 T43 T19
244 1/1 state_d = StScrambleData;
Tests: T43 T19 T20
245 end
MISSING_ELSE
246 end
247
248 StScrambleData: begin
249 1/1 scramble_req_o = 1'b1;
Tests: T9 T43 T19
250
251 1/1 if (scramble_ack_i) begin
Tests: T9 T43 T19
252 1/1 state_d = StCalcEcc;
Tests: T9 T43 T19
253 end
MISSING_ELSE
254 end
255
256 StCalcEcc: begin
257 1/1 state_d = StReqFlash;
Tests: T9 T43 T19
258 end
259
260 StReqFlash: begin
261 // only request flash if data integrity was valid
262 1/1 req_o = ~data_invalid_q;
Tests: T9 T43 T19
263 1/1 last_o = last_i;
Tests: T9 T43 T19
264
265 // if this is the last beat of the program burst
266 // - wait for done
267 // if this is NOT the last beat
268 // - ack the upstream request and accept more beats
269 1/1 if (last_i) begin
Tests: T9 T43 T19
270 1/1 state_d = ack ? StWaitFlash : StReqFlash;
Tests: T9 T43 T19
271 end else begin
272 1/1 ack_o = ack;
Tests: T9 T43 T19
273 1/1 state_d = ack ? StIdle : StReqFlash;
Tests: T9 T43 T19
274 end
275 end
276
277 StWaitFlash: begin
278 1/1 if (done) begin
Tests: T9 T43 T19
279 1/1 ack_o = 1'b1;
Tests: T9 T43 T19
280 1/1 state_d = StIdle;
Tests: T9 T43 T19
281 end
MISSING_ELSE
282 end
283
284 StDisabled: begin
285 1/1 state_d = StDisabled;
Tests: T7 T8 T9
286 end
287
288 default: begin
289 fsm_err_o = 1'b1;
290 end
291
292 endcase // unique case (state_q)
293
294 end
295
296 logic [DataWidth-1:0] mask_q;
297
298 always_ff @(posedge clk_i or negedge rst_ni) begin
299 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
300 1/1 packed_data <= '0;
Tests: T1 T2 T3
301 1/1 mask_q <= '0;
Tests: T1 T2 T3
302 1/1 end else if (req_o && ack) begin
Tests: T1 T2 T3
303 1/1 packed_data <= '0;
Tests: T9 T43 T19
304 1/1 end else if (calc_req_o && calc_ack_i) begin
Tests: T1 T2 T3
305 1/1 packed_data <= packed_data ^ mask_i;
Tests: T43 T19 T20
306 1/1 mask_q <= mask_i;
Tests: T43 T19 T20
307 1/1 end else if (scramble_req_o && scramble_ack_i) begin
Tests: T1 T2 T3
308 1/1 packed_data <= scrambled_data_i[DataWidth-1:0] ^ mask_q;
Tests: T9 T43 T19
309 1/1 end else if (pack_valid) begin
Tests: T1 T2 T3
310 1/1 packed_data[idx] <= pack_data;
Tests: T9 T43 T19
311 end
MISSING_ELSE
312 end
313
314 1/1 assign block_data_o = packed_data;
Tests: T1 T2 T3
315
316 // ECC handling
317 localparam int PlainDataEccWidth = DataWidth + 8;
318
319 logic [FullDataWidth-1:0] ecc_data;
320 logic [PlainDataEccWidth-1:0] plain_data_w_ecc;
321 logic [PlainIntgWidth-1:0] plain_data_ecc;
322 always_ff @(posedge clk_i or negedge rst_ni) begin
323 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
324 1/1 plain_data_ecc <= '1;
Tests: T1 T2 T3
325 1/1 end else if (plain_ecc_en) begin
Tests: T1 T2 T3
326 1/1 plain_data_ecc <= plain_data_w_ecc[DataWidth +: PlainIntgWidth];
Tests: T9 T43 T19
327 end
MISSING_ELSE
328 end
329
330 logic [PlainDataWidth-1:0] ecc_data_in;
331 1/1 assign ecc_data_in = {plain_data_ecc, packed_data};
Tests: T1 T2 T3
332
333 // reliability ECC calculation
334 prim_secded_hamming_76_68_enc u_enc (
335 .data_i(ecc_data_in),
336 .data_o(ecc_data)
337 );
338
339 // integrity ECC calculation
340 // This instance can technically be merged with the instance above, but is
341 // kept separate for the sake of convenience
342 // The plain data ecc is calculated continuously from packed data (which changes
343 // from packed data to masked/scrambled data based on software configuration).
344 // The actual plain data ECC is explicitly captured during this process when
345 // it is required.
346 prim_secded_hamming_72_64_enc u_plain_enc (
347 .data_i(packed_data),
348 .data_o(plain_data_w_ecc)
349 );
350
351 logic unused_data;
352 1/1 assign unused_data = |plain_data_w_ecc;
Tests: T1 T2 T3
353
354 // pad the remaining bits with '1' if ecc is not used.
355 1/1 assign data_o = ecc_i ? ecc_data : {{EccWidth{1'b1}}, ecc_data_in};
Tests: T1 T2 T3
356
357 /////////////////////////////////
358 // Assertions
359 /////////////////////////////////
360
361 `ifdef INC_ASSERT
362 logic txn_done;
363 logic [15:0] done_cnt_d, done_cnt_q;
364
365 1/1 assign txn_done = req_i && ack_o && last_i;
Tests: T1 T2 T3
366 1/1 assign done_cnt_d = txn_done ? '0 : (done ? done_cnt_q + 16'h1 : done_cnt_q);
Tests: T1 T2 T3
367
368 always_ff @(posedge clk_i or negedge rst_ni) begin
369 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
370 1/1 done_cnt_q <= '0;
Tests: T1 T2 T3
371 end else begin
372 1/1 done_cnt_q <= done_cnt_d;
Tests: T1 T2 T3
Cond Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[1].u_core.gen_prog_data.u_prog
| Total | Covered | Percent |
Conditions | 65 | 63 | 96.92 |
Logical | 65 | 63 | 96.92 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 111
EXPRESSION ((data_sel == Actual) ? data_i[(flash_phy_pkg::BusWidth - 1):0] : ({flash_phy_pkg::BusWidth {1'b1}}))
----------1---------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T43,T19,T20 |
LINE 111
SUB-EXPRESSION (data_sel == Actual)
----------1---------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T43,T19,T20 |
LINE 126
EXPRESSION (data_invalid_q | (pack_valid & ((~data_intg_ok))))
-------1------ ----------------2---------------
-1- | -2- | Status | Tests |
0 | 0 | Covered | T1,T2,T3 |
0 | 1 | Covered | T18,T249 |
1 | 0 | Covered | T18,T249 |
LINE 126
SUB-EXPRESSION (pack_valid & ((~data_intg_ok)))
-----1---- --------2--------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T43,T19,T20 |
1 | 1 | Covered | T18,T249 |
LINE 143
EXPRESSION (ack_i | data_invalid_q)
--1-- -------2------
-1- | -2- | Status | Tests |
0 | 0 | Covered | T1,T2,T3 |
0 | 1 | Not Covered | |
1 | 0 | Covered | T1,T2,T3 |
LINE 144
EXPRESSION (done_i | data_invalid_q)
---1-- -------2------
-1- | -2- | Status | Tests |
0 | 0 | Covered | T1,T2,T3 |
0 | 1 | Covered | T18,T249 |
1 | 0 | Covered | T13,T9,T55 |
LINE 148
EXPRESSION ((idx > '0) ? (idx_sub_one == sel_i) : 1'b0)
-----1----
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T43,T19,T20 |
LINE 148
SUB-EXPRESSION (idx_sub_one == sel_i)
-----------1----------
-1- | Status | Tests |
0 | Covered | T43,T19,T20 |
1 | Covered | T45,T49,T30 |
LINE 153
EXPRESSION (pack_valid && (idx == MaxIdx))
-----1---- -------2-------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T43,T19,T20 |
1 | 0 | Covered | T43,T19,T20 |
1 | 1 | Covered | T43,T19,T20 |
LINE 153
SUB-EXPRESSION (idx == MaxIdx)
-------1-------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T43,T19,T20 |
LINE 194
EXPRESSION (req_i && ((|sel_i)))
--1-- -----2----
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T43,T19,T20 |
1 | 1 | Covered | T45,T49,T30 |
LINE 204
EXPRESSION (idx == align_next)
---------1---------
-1- | Status | Tests |
0 | Covered | T9,T10 |
1 | Covered | T9,T45,T49 |
LINE 213
EXPRESSION (req_i && (idx == MaxIdx))
--1-- -------2-------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T43,T19,T20 |
1 | 0 | Covered | T43,T19,T20 |
1 | 1 | Covered | T43,T19,T20 |
LINE 213
SUB-EXPRESSION (idx == MaxIdx)
-------1-------
-1- | Status | Tests |
0 | Covered | T9,T43,T19 |
1 | Covered | T43,T19,T20 |
LINE 216
EXPRESSION (req_i && last_i)
--1-- ---2--
-1- | -2- | Status | Tests |
0 | 1 | Covered | T43,T19,T20 |
1 | 0 | Covered | T43,T19,T20 |
1 | 1 | Covered | T45,T49,T30 |
LINE 230
EXPRESSION (idx == MaxIdx)
-------1-------
-1- | Status | Tests |
0 | Covered | T9,T10 |
1 | Covered | T45,T49,T30 |
LINE 237
EXPRESSION (scramble_i ? StCalcMask : StReqFlash)
-----1----
-1- | Status | Tests |
0 | Covered | T37,T73,T45 |
1 | Covered | T43,T19,T20 |
LINE 270
EXPRESSION (ack ? StWaitFlash : StReqFlash)
-1-
-1- | Status | Tests |
0 | Covered | T43,T19,T20 |
1 | Covered | T43,T19,T20 |
LINE 273
EXPRESSION (ack ? StIdle : StReqFlash)
-1-
-1- | Status | Tests |
0 | Covered | T43,T19,T20 |
1 | Covered | T43,T19,T20 |
LINE 302
EXPRESSION (req_o && ack)
--1-- -2-
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T43,T19,T20 |
1 | 1 | Covered | T43,T19,T20 |
LINE 304
EXPRESSION (calc_req_o && calc_ack_i)
-----1---- -----2----
-1- | -2- | Status | Tests |
0 | 1 | Covered | T55,T22,T23 |
1 | 0 | Covered | T43,T19,T20 |
1 | 1 | Covered | T43,T19,T20 |
LINE 307
EXPRESSION (scramble_req_o && scramble_ack_i)
-------1------ -------2------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T55,T22,T23 |
1 | 0 | Covered | T43,T19,T20 |
1 | 1 | Covered | T43,T19,T20 |
LINE 355
EXPRESSION (ecc_i ? ecc_data : ({{flash_phy_pkg::EccWidth {1'b1}}, ecc_data_in}))
--1--
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 365
EXPRESSION (req_i && ack_o && last_i)
--1-- --2-- ---3--
-1- | -2- | -3- | Status | Tests |
0 | 1 | 1 | Not Covered | |
1 | 0 | 1 | Covered | T43,T19,T20 |
1 | 1 | 0 | Covered | T43,T19,T20 |
1 | 1 | 1 | Covered | T43,T19,T20 |
LINE 366
EXPRESSION (txn_done ? '0 : (done ? ((done_cnt_q + 16'b1)) : done_cnt_q))
----1---
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T43,T19,T20 |
LINE 366
SUB-EXPRESSION (done ? ((done_cnt_q + 16'b1)) : done_cnt_q)
--1-
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T13,T9,T55 |
FSM Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[1].u_core.gen_prog_data.u_prog
Summary for FSM :: state_q
| Total | Covered | Percent | |
States |
11 |
11 |
100.00 |
(Not included in score) |
Transitions |
15 |
15 |
100.00 |
|
Sequences |
0 |
0 |
|
|
State, Transition and Sequence Details for FSM :: state_q
states | Line No. | Covered | Tests |
StCalcEcc |
252 |
Covered |
T43,T19,T20 |
StCalcMask |
237 |
Covered |
T43,T19,T20 |
StCalcPlainEcc |
215 |
Covered |
T43,T19,T20 |
StDisabled |
193 |
Covered |
T7,T8,T15 |
StIdle |
273 |
Covered |
T1,T2,T3 |
StPackData |
197 |
Covered |
T43,T19,T20 |
StPostPack |
218 |
Covered |
T45,T49,T30 |
StPrePack |
195 |
Covered |
T45,T49,T30 |
StReqFlash |
237 |
Covered |
T43,T19,T20 |
StScrambleData |
244 |
Covered |
T43,T19,T20 |
StWaitFlash |
270 |
Covered |
T43,T19,T20 |
transitions | Line No. | Covered | Tests |
StCalcEcc->StReqFlash |
257 |
Covered |
T43,T19,T20 |
StCalcMask->StScrambleData |
244 |
Covered |
T43,T19,T20 |
StCalcPlainEcc->StCalcMask |
237 |
Covered |
T43,T19,T20 |
StCalcPlainEcc->StReqFlash |
237 |
Covered |
T37,T73,T45 |
StIdle->StDisabled |
193 |
Covered |
T7,T8,T15 |
StIdle->StPackData |
197 |
Covered |
T43,T19,T20 |
StIdle->StPrePack |
195 |
Covered |
T45,T49,T30 |
StPackData->StCalcPlainEcc |
215 |
Covered |
T43,T19,T20 |
StPackData->StPostPack |
218 |
Covered |
T45,T49,T30 |
StPostPack->StCalcPlainEcc |
231 |
Covered |
T45,T49,T30 |
StPrePack->StPackData |
205 |
Covered |
T45,T49,T30 |
StReqFlash->StIdle |
273 |
Covered |
T43,T19,T20 |
StReqFlash->StWaitFlash |
270 |
Covered |
T43,T19,T20 |
StScrambleData->StCalcEcc |
252 |
Covered |
T43,T19,T20 |
StWaitFlash->StIdle |
280 |
Covered |
T43,T19,T20 |
Branch Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[1].u_core.gen_prog_data.u_prog
| Line No. | Total | Covered | Percent |
Branches |
|
55 |
55 |
100.00 |
TERNARY |
111 |
2 |
2 |
100.00 |
TERNARY |
148 |
2 |
2 |
100.00 |
TERNARY |
355 |
2 |
2 |
100.00 |
TERNARY |
366 |
3 |
3 |
100.00 |
IF |
130 |
2 |
2 |
100.00 |
IF |
151 |
4 |
4 |
100.00 |
IF |
164 |
2 |
2 |
100.00 |
CASE |
186 |
27 |
27 |
100.00 |
IF |
299 |
6 |
6 |
100.00 |
IF |
323 |
3 |
3 |
100.00 |
IF |
369 |
2 |
2 |
100.00 |
111 assign pack_data = (data_sel == Actual) ? data_i[BusWidth-1:0] : {BusWidth{1'b1}};
-1-
==>
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T43,T19,T20 |
0 |
Covered |
T1,T2,T3 |
148 assign align_next = (idx > '0) ? (idx_sub_one == sel_i) : 1'b0;
-1-
==>
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T43,T19,T20 |
0 |
Covered |
T1,T2,T3 |
355 assign data_o = ecc_i ? ecc_data : {{EccWidth{1'b1}}, ecc_data_in};
-1-
==>
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
366 assign done_cnt_d = txn_done ? '0 : (done ? done_cnt_q + 16'h1 : done_cnt_q);
-1- -2-
==> ==>
==>
Branches:
-1- | -2- | Status | Tests |
1 |
- |
Covered |
T43,T19,T20 |
0 |
1 |
Covered |
T13,T9,T55 |
0 |
0 |
Covered |
T1,T2,T3 |
130 if (!rst_ni) begin
-1-
131 data_invalid_q <= '0;
==>
132 end else begin
133 data_invalid_q <= data_invalid_d;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
151 if (!rst_ni) begin
-1-
152 idx <= '0;
==>
153 end else if (pack_valid && idx == MaxIdx) begin
-2-
154 // when a flash word is packed full, return index to 0
155 idx <= '0;
==>
156 end else if (pack_valid) begin
-3-
157 // increment otherwise
158 idx <= idx + 1'b1;
==>
159 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
1 |
- |
- |
Covered |
T1,T2,T3 |
0 |
1 |
- |
Covered |
T9,T43,T19 |
0 |
0 |
1 |
Covered |
T9,T43,T19 |
0 |
0 |
0 |
Covered |
T1,T2,T3 |
164 `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, StIdle)
-1-
==>
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
186 unique case (state_q)
-1-
187 StIdle: begin
188 // if first beat of a transaction is not aligned, prepack with empty bits
189 if (prim_mubi_pkg::mubi4_test_true_loose(disable_i)) begin
-2-
190 // only disable during idle state to ensure program is able to gracefully complete
191 // this is important as we do not want to accidentally disturb any electrical procedure
192 // internal to the flash macro
193 state_d = StDisabled;
==>
194 end else if (req_i && |sel_i) begin
-3-
195 state_d = StPrePack;
==>
196 end else if (req_i) begin
-4-
197 state_d = StPackData;
==>
198 end
MISSING_ELSE
==>
199 end
200
201 StPrePack: begin
202 // pack until currently supplied data
203 pack_valid = (idx < sel_i);
204 if (idx == align_next) begin
-5-
205 state_d = StPackData;
==>
206 end
MISSING_ELSE
==>
207 end
208
209 StPackData: begin
210 pack_valid = req_i;
211 data_sel = Actual;
212
213 if (req_i && idx == MaxIdx) begin
-6-
214 // last beat of a flash word
215 state_d = StCalcPlainEcc;
==>
216 end else if (req_i && last_i) begin
-7-
217 // last beat is not aligned with the last entry of flash word
218 state_d = StPostPack;
==>
219 end else if (req_i) begin
-8-
220 ack_o = 1'b1;
==>
221 end
MISSING_ELSE
==>
222 end
223
224 StPostPack: begin
225 // supply filler data
226 pack_valid = 1'b1;
227 data_sel = Filler;
228
229 // finish packing remaining entries
230 if (idx == MaxIdx) begin
-9-
231 state_d = StCalcPlainEcc;
==>
232 end
MISSING_ELSE
==>
233 end
234
235 StCalcPlainEcc: begin
236 plain_ecc_en = 1'b1;
237 state_d = scramble_i ? StCalcMask : StReqFlash;
-10-
==>
==>
238 end
239
240 StCalcMask: begin
241 calc_req_o = 1'b1;
242
243 if (calc_ack_i) begin
-11-
244 state_d = StScrambleData;
==>
245 end
MISSING_ELSE
==>
246 end
247
248 StScrambleData: begin
249 scramble_req_o = 1'b1;
250
251 if (scramble_ack_i) begin
-12-
252 state_d = StCalcEcc;
==>
253 end
MISSING_ELSE
==>
254 end
255
256 StCalcEcc: begin
257 state_d = StReqFlash;
==>
258 end
259
260 StReqFlash: begin
261 // only request flash if data integrity was valid
262 req_o = ~data_invalid_q;
263 last_o = last_i;
264
265 // if this is the last beat of the program burst
266 // - wait for done
267 // if this is NOT the last beat
268 // - ack the upstream request and accept more beats
269 if (last_i) begin
-13-
270 state_d = ack ? StWaitFlash : StReqFlash;
-14-
==>
==>
271 end else begin
272 ack_o = ack;
273 state_d = ack ? StIdle : StReqFlash;
-15-
==>
==>
274 end
275 end
276
277 StWaitFlash: begin
278 if (done) begin
-16-
279 ack_o = 1'b1;
==>
280 state_d = StIdle;
281 end
MISSING_ELSE
==>
282 end
283
284 StDisabled: begin
285 state_d = StDisabled;
==>
286 end
287
288 default: begin
289 fsm_err_o = 1'b1;
==>
Branches:
-1- | -2- | -3- | -4- | -5- | -6- | -7- | -8- | -9- | -10- | -11- | -12- | -13- | -14- | -15- | -16- | Status | Tests |
StIdle |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T7,T8,T9 |
StIdle |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T45,T49 |
StIdle |
0 |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T43,T19 |
StIdle |
0 |
0 |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T1,T2,T3 |
StPrePack |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T45,T49 |
StPrePack |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T10 |
StPackData |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T43,T19 |
StPackData |
- |
- |
- |
- |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T45,T49 |
StPackData |
- |
- |
- |
- |
0 |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T43,T19 |
StPackData |
- |
- |
- |
- |
0 |
0 |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T43,T19 |
StPostPack |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T45,T49 |
StPostPack |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T10 |
StCalcPlainEcc |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
Covered |
T43,T19,T20 |
StCalcPlainEcc |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
Covered |
T37,T73,T45 |
StCalcMask |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
Covered |
T43,T19,T20 |
StCalcMask |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
Covered |
T9,T43,T19 |
StScrambleData |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
Covered |
T9,T43,T19 |
StScrambleData |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
Covered |
T9,T43,T19 |
StCalcEcc |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T43,T19 |
StReqFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
1 |
- |
- |
Covered |
T43,T19,T20 |
StReqFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
0 |
- |
- |
Covered |
T43,T19,T20 |
StReqFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
1 |
- |
Covered |
T43,T19,T20 |
StReqFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
0 |
- |
Covered |
T43,T19,T20 |
StWaitFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
Covered |
T9,T43,T19 |
StWaitFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
Covered |
T9,T43,T19 |
StDisabled |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T7,T8,T9 |
default |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T10,T16 |
299 if (!rst_ni) begin
-1-
300 packed_data <= '0;
==>
301 mask_q <= '0;
302 end else if (req_o && ack) begin
-2-
303 packed_data <= '0;
==>
304 end else if (calc_req_o && calc_ack_i) begin
-3-
305 packed_data <= packed_data ^ mask_i;
==>
306 mask_q <= mask_i;
307 end else if (scramble_req_o && scramble_ack_i) begin
-4-
308 packed_data <= scrambled_data_i[DataWidth-1:0] ^ mask_q;
==>
309 end else if (pack_valid) begin
-5-
310 packed_data[idx] <= pack_data;
==>
311 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | -4- | -5- | Status | Tests |
1 |
- |
- |
- |
- |
Covered |
T1,T2,T3 |
0 |
1 |
- |
- |
- |
Covered |
T9,T43,T19 |
0 |
0 |
1 |
- |
- |
Covered |
T43,T19,T20 |
0 |
0 |
0 |
1 |
- |
Covered |
T9,T43,T19 |
0 |
0 |
0 |
0 |
1 |
Covered |
T9,T43,T19 |
0 |
0 |
0 |
0 |
0 |
Covered |
T1,T2,T3 |
323 if (!rst_ni) begin
-1-
324 plain_data_ecc <= '1;
==>
325 end else if (plain_ecc_en) begin
-2-
326 plain_data_ecc <= plain_data_w_ecc[DataWidth +: PlainIntgWidth];
==>
327 end
MISSING_ELSE
==>
Branches:
-1- | -2- | Status | Tests |
1 |
- |
Covered |
T1,T2,T3 |
0 |
1 |
Covered |
T9,T43,T19 |
0 |
0 |
Covered |
T1,T2,T3 |
369 if (!rst_ni) begin
-1-
370 done_cnt_q <= '0;
==>
371 end else begin
372 done_cnt_q <= done_cnt_d;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
Assert Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[1].u_core.gen_prog_data.u_prog
Assertion Details
OneDonePerTxn_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
373795953 |
1194311 |
0 |
0 |
T19 |
1958 |
1 |
0 |
0 |
T20 |
42997 |
152 |
0 |
0 |
T29 |
114745 |
0 |
0 |
0 |
T37 |
35890 |
30 |
0 |
0 |
T38 |
31423 |
76 |
0 |
0 |
T43 |
13318 |
1 |
0 |
0 |
T45 |
0 |
25 |
0 |
0 |
T49 |
0 |
28 |
0 |
0 |
T59 |
3051 |
0 |
0 |
0 |
T64 |
2484 |
0 |
0 |
0 |
T66 |
0 |
288 |
0 |
0 |
T73 |
0 |
45 |
0 |
0 |
T92 |
0 |
50 |
0 |
0 |
T106 |
4279 |
0 |
0 |
0 |
T145 |
1355 |
0 |
0 |
0 |
PostPackRule_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
373795953 |
857 |
0 |
0 |
T30 |
0 |
2 |
0 |
0 |
T39 |
65239 |
0 |
0 |
0 |
T45 |
64670 |
14 |
0 |
0 |
T49 |
0 |
12 |
0 |
0 |
T67 |
7393 |
0 |
0 |
0 |
T68 |
66631 |
0 |
0 |
0 |
T69 |
45342 |
0 |
0 |
0 |
T74 |
70627 |
0 |
0 |
0 |
T78 |
0 |
4 |
0 |
0 |
T79 |
0 |
6 |
0 |
0 |
T80 |
3567 |
0 |
0 |
0 |
T92 |
162267 |
0 |
0 |
0 |
T94 |
0 |
1 |
0 |
0 |
T105 |
0 |
12 |
0 |
0 |
T111 |
53736 |
0 |
0 |
0 |
T143 |
0 |
1 |
0 |
0 |
T173 |
0 |
1 |
0 |
0 |
T224 |
0 |
3 |
0 |
0 |
T230 |
2125 |
0 |
0 |
0 |
PrePackRule_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
373795953 |
616 |
0 |
0 |
T30 |
0 |
3 |
0 |
0 |
T39 |
65239 |
0 |
0 |
0 |
T45 |
64670 |
12 |
0 |
0 |
T49 |
0 |
9 |
0 |
0 |
T67 |
7393 |
0 |
0 |
0 |
T68 |
66631 |
0 |
0 |
0 |
T69 |
45342 |
0 |
0 |
0 |
T74 |
70627 |
0 |
0 |
0 |
T78 |
0 |
2 |
0 |
0 |
T79 |
0 |
1 |
0 |
0 |
T80 |
3567 |
0 |
0 |
0 |
T92 |
162267 |
0 |
0 |
0 |
T94 |
0 |
3 |
0 |
0 |
T105 |
0 |
17 |
0 |
0 |
T111 |
53736 |
0 |
0 |
0 |
T143 |
0 |
2 |
0 |
0 |
T224 |
0 |
4 |
0 |
0 |
T230 |
2125 |
0 |
0 |
0 |
T251 |
0 |
2 |
0 |
0 |
WidthCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
1058 |
1058 |
0 |
0 |
T1 |
1 |
1 |
0 |
0 |
T2 |
1 |
1 |
0 |
0 |
T3 |
1 |
1 |
0 |
0 |
T4 |
1 |
1 |
0 |
0 |
T7 |
1 |
1 |
0 |
0 |
T8 |
1 |
1 |
0 |
0 |
T11 |
1 |
1 |
0 |
0 |
T12 |
1 |
1 |
0 |
0 |
T13 |
1 |
1 |
0 |
0 |
T17 |
1 |
1 |
0 |
0 |
u_state_regs_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
373795953 |
372949494 |
0 |
0 |
T1 |
2320 |
2267 |
0 |
0 |
T2 |
3525 |
3457 |
0 |
0 |
T3 |
1219 |
1156 |
0 |
0 |
T4 |
1433 |
1345 |
0 |
0 |
T7 |
1352 |
1259 |
0 |
0 |
T8 |
4369 |
3903 |
0 |
0 |
T11 |
2053 |
1895 |
0 |
0 |
T12 |
2602 |
2528 |
0 |
0 |
T13 |
34283 |
34207 |
0 |
0 |
T17 |
1829 |
1746 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[0].u_core.gen_prog_data.u_prog
| Line No. | Total | Covered | Percent |
TOTAL | | 96 | 96 | 100.00 |
CONT_ASSIGN | 111 | 1 | 1 | 100.00 |
CONT_ASSIGN | 122 | 1 | 1 | 100.00 |
CONT_ASSIGN | 126 | 1 | 1 | 100.00 |
ALWAYS | 130 | 3 | 3 | 100.00 |
CONT_ASSIGN | 138 | 1 | 1 | 100.00 |
CONT_ASSIGN | 143 | 1 | 1 | 100.00 |
CONT_ASSIGN | 144 | 1 | 1 | 100.00 |
CONT_ASSIGN | 147 | 1 | 1 | 100.00 |
CONT_ASSIGN | 148 | 1 | 1 | 100.00 |
ALWAYS | 151 | 6 | 6 | 100.00 |
ALWAYS | 164 | 3 | 3 | 100.00 |
ALWAYS | 174 | 51 | 51 | 100.00 |
ALWAYS | 299 | 12 | 12 | 100.00 |
CONT_ASSIGN | 314 | 1 | 1 | 100.00 |
ALWAYS | 323 | 4 | 4 | 100.00 |
CONT_ASSIGN | 331 | 1 | 1 | 100.00 |
CONT_ASSIGN | 352 | 1 | 1 | 100.00 |
CONT_ASSIGN | 355 | 1 | 1 | 100.00 |
CONT_ASSIGN | 365 | 1 | 1 | 100.00 |
CONT_ASSIGN | 366 | 1 | 1 | 100.00 |
ALWAYS | 369 | 3 | 3 | 100.00 |
110 // selects empty data or real data
111 1/1 assign pack_data = (data_sel == Actual) ? data_i[BusWidth-1:0] : {BusWidth{1'b1}};
Tests: T1 T2 T3
112
113 logic data_intg_ok;
114 logic data_err;
115
116 // use the tlul integrity module directly for bus integrity
117 // SEC_CM: MEM.BUS.INTEGRITY
118 tlul_data_integ_dec u_data_intg_chk (
119 .data_intg_i(data_i),
120 .data_err_o(data_err)
121 );
122 1/1 assign data_intg_ok = ~data_err;
Tests: T1 T2 T3
123
124 logic data_invalid_q, data_invalid_d;
125 // hold on integrity failure indication until reset
126 1/1 assign data_invalid_d = data_invalid_q |
Tests: T1 T2 T3
127 (pack_valid & ~data_intg_ok);
128
129 always_ff @(posedge clk_i or negedge rst_ni) begin
130 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
131 1/1 data_invalid_q <= '0;
Tests: T1 T2 T3
132 end else begin
133 1/1 data_invalid_q <= data_invalid_d;
Tests: T1 T2 T3
134 end
135 end
136
137 // indication to upper layer presence of error
138 1/1 assign intg_err_o = data_invalid_q;
Tests: T1 T2 T3
139
140 // if integrity failure is seen, fake communication with flash
141 // and simply terminate
142 logic ack, done;
143 1/1 assign ack = ack_i | data_invalid_q;
Tests: T1 T2 T3
144 1/1 assign done = done_i | data_invalid_q;
Tests: T1 T2 T3
145
146 // next idx will be aligned
147 1/1 assign idx_sub_one = idx - 1'b1;
Tests: T1 T2 T3
148 1/1 assign align_next = (idx > '0) ? (idx_sub_one == sel_i) : 1'b0;
Tests: T1 T2 T3
149
150 always_ff @(posedge clk_i or negedge rst_ni) begin
151 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
152 1/1 idx <= '0;
Tests: T1 T2 T3
153 1/1 end else if (pack_valid && idx == MaxIdx) begin
Tests: T1 T2 T3
154 // when a flash word is packed full, return index to 0
155 1/1 idx <= '0;
Tests: T2 T7 T11
156 1/1 end else if (pack_valid) begin
Tests: T1 T2 T3
157 // increment otherwise
158 1/1 idx <= idx + 1'b1;
Tests: T2 T7 T11
159 end
MISSING_ELSE
160 end
161
162
163 // SEC_CM: PHY_PROG.FSM.SPARSE
164 3/3 `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, StIdle)
Tests: T1 T2 T3 | T1 T2 T3 | T1 T2 T3
PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, StIdle):
164.1 `ifdef SIMULATION
164.2 prim_sparse_fsm_flop #(
164.3 .StateEnumT(state_e),
164.4 .Width($bits(state_e)),
164.5 .ResetValue($bits(state_e)'(StIdle)),
164.6 .EnableAlertTriggerSVA(1),
164.7 .CustomForceName("state_q")
164.8 ) u_state_regs (
164.9 .clk_i ( clk_i ),
164.10 .rst_ni ( rst_ni ),
164.11 .state_i ( state_d ),
164.12 .state_o ( )
164.13 );
164.14 always_ff @(posedge clk_i or negedge rst_ni) begin
164.15 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
164.16 1/1 state_q <= StIdle;
Tests: T1 T2 T3
164.17 end else begin
164.18 1/1 state_q <= state_d;
Tests: T1 T2 T3
164.19 end
164.20 end
164.21 u_state_regs_A: assert property (@(posedge clk_i) disable iff ((!rst_ni) !== '0) (state_q === u_state_regs.state_o))
164.22 else begin
164.23 `ifdef UVM
164.24 uvm_pkg::uvm_report_error("ASSERT FAILED", "u_state_regs_A", uvm_pkg::UVM_NONE,
164.25 "../src/lowrisc_opentitan_top_earlgrey_flash_ctrl_0.1/rtl/flash_phy_prog.sv", 164, "", 1);
164.26 `else
164.27 $error("%0t: (%0s:%0d) [%m] [ASSERT FAILED] %0s", $time, `__FILE__, `__LINE__,
164.28 `PRIM_STRINGIFY(u_state_regs_A));
164.29 `endif
164.30 end
164.31 `else
164.32 prim_sparse_fsm_flop #(
164.33 .StateEnumT(state_e),
164.34 .Width($bits(state_e)),
164.35 .ResetValue($bits(state_e)'(StIdle)),
164.36 .EnableAlertTriggerSVA(1)
164.37 ) u_state_regs (
164.38 .clk_i ( `PRIM_FLOP_CLK ),
164.39 .rst_ni ( `PRIM_FLOP_RST ),
164.40 .state_i ( state_d ),
164.41 .state_o ( state_q )
164.42 );
164.43 `endif165
166 // If the first beat of an incoming transaction is not aligned to word boundary (for example
167 // if each flash word is 4 bus words wide, and the first word to program starts at index 1),
168 // the fsm pre-packs the flash word with empty words until the supplied index.
169 // Once at the index, real data supplied from the flash controller is packed until the last
170 // beat of data. At the last beat of data, if it is not also aligned (index 3 in this example),
171 // more empty words are packed at the end to fill out the word.
172 //
173 always_comb begin
174 1/1 state_d = state_q;
Tests: T1 T2 T3
175
176 1/1 pack_valid = 1'b0;
Tests: T1 T2 T3
177 1/1 data_sel = Filler;
Tests: T1 T2 T3
178 1/1 plain_ecc_en = 1'b0;
Tests: T1 T2 T3
179 1/1 req_o = 1'b0;
Tests: T1 T2 T3
180 1/1 ack_o = 1'b0;
Tests: T1 T2 T3
181 1/1 last_o = 1'b0;
Tests: T1 T2 T3
182 1/1 calc_req_o = 1'b0;
Tests: T1 T2 T3
183 1/1 scramble_req_o = 1'b0;
Tests: T1 T2 T3
184 1/1 fsm_err_o = 1'b0;
Tests: T1 T2 T3
185
186 1/1 unique case (state_q)
Tests: T1 T2 T3
187 StIdle: begin
188 // if first beat of a transaction is not aligned, prepack with empty bits
189 1/1 if (prim_mubi_pkg::mubi4_test_true_loose(disable_i)) begin
Tests: T1 T2 T3
190 // only disable during idle state to ensure program is able to gracefully complete
191 // this is important as we do not want to accidentally disturb any electrical procedure
192 // internal to the flash macro
193 1/1 state_d = StDisabled;
Tests: T7 T8 T9
194 1/1 end else if (req_i && |sel_i) begin
Tests: T1 T2 T3
195 1/1 state_d = StPrePack;
Tests: T9 T59 T45
196 1/1 end else if (req_i) begin
Tests: T1 T2 T3
197 1/1 state_d = StPackData;
Tests: T2 T7 T11
198 end
MISSING_ELSE
199 end
200
201 StPrePack: begin
202 // pack until currently supplied data
203 1/1 pack_valid = (idx < sel_i);
Tests: T9 T59 T45
204 1/1 if (idx == align_next) begin
Tests: T9 T59 T45
205 1/1 state_d = StPackData;
Tests: T9 T59 T45
206 end
MISSING_ELSE
207 end
208
209 StPackData: begin
210 1/1 pack_valid = req_i;
Tests: T2 T7 T11
211 1/1 data_sel = Actual;
Tests: T2 T7 T11
212
213 1/1 if (req_i && idx == MaxIdx) begin
Tests: T2 T7 T11
214 // last beat of a flash word
215 1/1 state_d = StCalcPlainEcc;
Tests: T2 T7 T11
216 1/1 end else if (req_i && last_i) begin
Tests: T2 T7 T11
217 // last beat is not aligned with the last entry of flash word
218 1/1 state_d = StPostPack;
Tests: T9 T59 T45
219 1/1 end else if (req_i) begin
Tests: T2 T7 T11
220 1/1 ack_o = 1'b1;
Tests: T2 T7 T11
221 end
MISSING_ELSE
222 end
223
224 StPostPack: begin
225 // supply filler data
226 1/1 pack_valid = 1'b1;
Tests: T9 T59 T45
227 1/1 data_sel = Filler;
Tests: T9 T59 T45
228
229 // finish packing remaining entries
230 1/1 if (idx == MaxIdx) begin
Tests: T9 T59 T45
231 1/1 state_d = StCalcPlainEcc;
Tests: T9 T59 T45
232 end
MISSING_ELSE
233 end
234
235 StCalcPlainEcc: begin
236 1/1 plain_ecc_en = 1'b1;
Tests: T2 T7 T11
237 1/1 state_d = scramble_i ? StCalcMask : StReqFlash;
Tests: T2 T7 T11
238 end
239
240 StCalcMask: begin
241 1/1 calc_req_o = 1'b1;
Tests: T7 T11 T8
242
243 1/1 if (calc_ack_i) begin
Tests: T7 T11 T8
244 1/1 state_d = StScrambleData;
Tests: T7 T11 T8
245 end
MISSING_ELSE
246 end
247
248 StScrambleData: begin
249 1/1 scramble_req_o = 1'b1;
Tests: T7 T11 T8
250
251 1/1 if (scramble_ack_i) begin
Tests: T7 T11 T8
252 1/1 state_d = StCalcEcc;
Tests: T7 T8 T9
253 end
MISSING_ELSE
254 end
255
256 StCalcEcc: begin
257 1/1 state_d = StReqFlash;
Tests: T7 T8 T9
258 end
259
260 StReqFlash: begin
261 // only request flash if data integrity was valid
262 1/1 req_o = ~data_invalid_q;
Tests: T2 T7 T12
263 1/1 last_o = last_i;
Tests: T2 T7 T12
264
265 // if this is the last beat of the program burst
266 // - wait for done
267 // if this is NOT the last beat
268 // - ack the upstream request and accept more beats
269 1/1 if (last_i) begin
Tests: T2 T7 T12
270 1/1 state_d = ack ? StWaitFlash : StReqFlash;
Tests: T2 T7 T12
271 end else begin
272 1/1 ack_o = ack;
Tests: T2 T7 T12
273 1/1 state_d = ack ? StIdle : StReqFlash;
Tests: T2 T7 T12
274 end
275 end
276
277 StWaitFlash: begin
278 1/1 if (done) begin
Tests: T2 T7 T12
279 1/1 ack_o = 1'b1;
Tests: T2 T7 T12
280 1/1 state_d = StIdle;
Tests: T2 T7 T12
281 end
MISSING_ELSE
282 end
283
284 StDisabled: begin
285 1/1 state_d = StDisabled;
Tests: T7 T8 T9
286 end
287
288 default: begin
289 fsm_err_o = 1'b1;
290 end
291
292 endcase // unique case (state_q)
293
294 end
295
296 logic [DataWidth-1:0] mask_q;
297
298 always_ff @(posedge clk_i or negedge rst_ni) begin
299 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
300 1/1 packed_data <= '0;
Tests: T1 T2 T3
301 1/1 mask_q <= '0;
Tests: T1 T2 T3
302 1/1 end else if (req_o && ack) begin
Tests: T1 T2 T3
303 1/1 packed_data <= '0;
Tests: T2 T7 T12
304 1/1 end else if (calc_req_o && calc_ack_i) begin
Tests: T1 T2 T3
305 1/1 packed_data <= packed_data ^ mask_i;
Tests: T7 T11 T8
306 1/1 mask_q <= mask_i;
Tests: T7 T11 T8
307 1/1 end else if (scramble_req_o && scramble_ack_i) begin
Tests: T1 T2 T3
308 1/1 packed_data <= scrambled_data_i[DataWidth-1:0] ^ mask_q;
Tests: T7 T8 T9
309 1/1 end else if (pack_valid) begin
Tests: T1 T2 T3
310 1/1 packed_data[idx] <= pack_data;
Tests: T2 T7 T11
311 end
MISSING_ELSE
312 end
313
314 1/1 assign block_data_o = packed_data;
Tests: T1 T2 T3
315
316 // ECC handling
317 localparam int PlainDataEccWidth = DataWidth + 8;
318
319 logic [FullDataWidth-1:0] ecc_data;
320 logic [PlainDataEccWidth-1:0] plain_data_w_ecc;
321 logic [PlainIntgWidth-1:0] plain_data_ecc;
322 always_ff @(posedge clk_i or negedge rst_ni) begin
323 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
324 1/1 plain_data_ecc <= '1;
Tests: T1 T2 T3
325 1/1 end else if (plain_ecc_en) begin
Tests: T1 T2 T3
326 1/1 plain_data_ecc <= plain_data_w_ecc[DataWidth +: PlainIntgWidth];
Tests: T2 T7 T11
327 end
MISSING_ELSE
328 end
329
330 logic [PlainDataWidth-1:0] ecc_data_in;
331 1/1 assign ecc_data_in = {plain_data_ecc, packed_data};
Tests: T1 T2 T3
332
333 // reliability ECC calculation
334 prim_secded_hamming_76_68_enc u_enc (
335 .data_i(ecc_data_in),
336 .data_o(ecc_data)
337 );
338
339 // integrity ECC calculation
340 // This instance can technically be merged with the instance above, but is
341 // kept separate for the sake of convenience
342 // The plain data ecc is calculated continuously from packed data (which changes
343 // from packed data to masked/scrambled data based on software configuration).
344 // The actual plain data ECC is explicitly captured during this process when
345 // it is required.
346 prim_secded_hamming_72_64_enc u_plain_enc (
347 .data_i(packed_data),
348 .data_o(plain_data_w_ecc)
349 );
350
351 logic unused_data;
352 1/1 assign unused_data = |plain_data_w_ecc;
Tests: T1 T2 T3
353
354 // pad the remaining bits with '1' if ecc is not used.
355 1/1 assign data_o = ecc_i ? ecc_data : {{EccWidth{1'b1}}, ecc_data_in};
Tests: T1 T2 T3
356
357 /////////////////////////////////
358 // Assertions
359 /////////////////////////////////
360
361 `ifdef INC_ASSERT
362 logic txn_done;
363 logic [15:0] done_cnt_d, done_cnt_q;
364
365 1/1 assign txn_done = req_i && ack_o && last_i;
Tests: T1 T2 T3
366 1/1 assign done_cnt_d = txn_done ? '0 : (done ? done_cnt_q + 16'h1 : done_cnt_q);
Tests: T1 T2 T3
367
368 always_ff @(posedge clk_i or negedge rst_ni) begin
369 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
370 1/1 done_cnt_q <= '0;
Tests: T1 T2 T3
371 end else begin
372 1/1 done_cnt_q <= done_cnt_d;
Tests: T1 T2 T3
Cond Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[0].u_core.gen_prog_data.u_prog
| Total | Covered | Percent |
Conditions | 65 | 64 | 98.46 |
Logical | 65 | 64 | 98.46 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 111
EXPRESSION ((data_sel == Actual) ? data_i[(flash_phy_pkg::BusWidth - 1):0] : ({flash_phy_pkg::BusWidth {1'b1}}))
----------1---------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T2,T7,T11 |
LINE 111
SUB-EXPRESSION (data_sel == Actual)
----------1---------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T2,T7,T11 |
LINE 126
EXPRESSION (data_invalid_q | (pack_valid & ((~data_intg_ok))))
-------1------ ----------------2---------------
-1- | -2- | Status | Tests |
0 | 0 | Covered | T1,T2,T3 |
0 | 1 | Covered | T8,T121,T18 |
1 | 0 | Covered | T8,T121,T18 |
LINE 126
SUB-EXPRESSION (pack_valid & ((~data_intg_ok)))
-----1---- --------2--------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T2,T7,T11 |
1 | 1 | Covered | T8,T121,T18 |
LINE 143
EXPRESSION (ack_i | data_invalid_q)
--1-- -------2------
-1- | -2- | Status | Tests |
0 | 0 | Covered | T1,T2,T3 |
0 | 1 | Covered | T249,T93 |
1 | 0 | Covered | T1,T2,T3 |
LINE 144
EXPRESSION (done_i | data_invalid_q)
---1-- -------2------
-1- | -2- | Status | Tests |
0 | 0 | Covered | T1,T2,T3 |
0 | 1 | Covered | T8,T121,T18 |
1 | 0 | Covered | T1,T2,T3 |
LINE 148
EXPRESSION ((idx > '0) ? (idx_sub_one == sel_i) : 1'b0)
-----1----
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T2,T7,T11 |
LINE 148
SUB-EXPRESSION (idx_sub_one == sel_i)
-----------1----------
-1- | Status | Tests |
0 | Covered | T2,T7,T11 |
1 | Covered | T59,T45,T74 |
LINE 153
EXPRESSION (pack_valid && (idx == MaxIdx))
-----1---- -------2-------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T2,T7,T11 |
1 | 0 | Covered | T2,T7,T11 |
1 | 1 | Covered | T2,T7,T11 |
LINE 153
SUB-EXPRESSION (idx == MaxIdx)
-------1-------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T2,T7,T11 |
LINE 194
EXPRESSION (req_i && ((|sel_i)))
--1-- -----2----
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T2,T7,T11 |
1 | 1 | Covered | T59,T45,T74 |
LINE 204
EXPRESSION (idx == align_next)
---------1---------
-1- | Status | Tests |
0 | Covered | T9,T10 |
1 | Covered | T59,T45,T74 |
LINE 213
EXPRESSION (req_i && (idx == MaxIdx))
--1-- -------2-------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T2,T7,T11 |
1 | 0 | Covered | T2,T7,T11 |
1 | 1 | Covered | T2,T7,T11 |
LINE 213
SUB-EXPRESSION (idx == MaxIdx)
-------1-------
-1- | Status | Tests |
0 | Covered | T2,T7,T11 |
1 | Covered | T2,T7,T11 |
LINE 216
EXPRESSION (req_i && last_i)
--1-- ---2--
-1- | -2- | Status | Tests |
0 | 1 | Covered | T2,T7,T12 |
1 | 0 | Covered | T2,T7,T11 |
1 | 1 | Covered | T59,T45,T74 |
LINE 230
EXPRESSION (idx == MaxIdx)
-------1-------
-1- | Status | Tests |
0 | Covered | T9,T10 |
1 | Covered | T59,T45,T74 |
LINE 237
EXPRESSION (scramble_i ? StCalcMask : StReqFlash)
-----1----
-1- | Status | Tests |
0 | Covered | T2,T12,T8 |
1 | Covered | T7,T11,T8 |
LINE 270
EXPRESSION (ack ? StWaitFlash : StReqFlash)
-1-
-1- | Status | Tests |
0 | Covered | T2,T7,T12 |
1 | Covered | T2,T7,T12 |
LINE 273
EXPRESSION (ack ? StIdle : StReqFlash)
-1-
-1- | Status | Tests |
0 | Covered | T2,T7,T12 |
1 | Covered | T2,T7,T12 |
LINE 302
EXPRESSION (req_o && ack)
--1-- -2-
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T2,T7,T12 |
1 | 1 | Covered | T2,T7,T12 |
LINE 304
EXPRESSION (calc_req_o && calc_ack_i)
-----1---- -----2----
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T7,T11,T8 |
1 | 1 | Covered | T7,T11,T8 |
LINE 307
EXPRESSION (scramble_req_o && scramble_ack_i)
-------1------ -------2------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T7,T8,T9 |
1 | 1 | Covered | T7,T8,T9 |
LINE 355
EXPRESSION (ecc_i ? ecc_data : ({{flash_phy_pkg::EccWidth {1'b1}}, ecc_data_in}))
--1--
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 365
EXPRESSION (req_i && ack_o && last_i)
--1-- --2-- ---3--
-1- | -2- | -3- | Status | Tests |
0 | 1 | 1 | Not Covered | |
1 | 0 | 1 | Covered | T2,T7,T12 |
1 | 1 | 0 | Covered | T2,T7,T11 |
1 | 1 | 1 | Covered | T2,T7,T12 |
LINE 366
EXPRESSION (txn_done ? '0 : (done ? ((done_cnt_q + 16'b1)) : done_cnt_q))
----1---
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T2,T7,T12 |
LINE 366
SUB-EXPRESSION (done ? ((done_cnt_q + 16'b1)) : done_cnt_q)
--1-
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
FSM Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[0].u_core.gen_prog_data.u_prog
Summary for FSM :: state_q
| Total | Covered | Percent | |
States |
11 |
11 |
100.00 |
(Not included in score) |
Transitions |
15 |
15 |
100.00 |
|
Sequences |
0 |
0 |
|
|
State, Transition and Sequence Details for FSM :: state_q
states | Line No. | Covered | Tests |
StCalcEcc |
252 |
Covered |
T7,T8,T9 |
StCalcMask |
237 |
Covered |
T7,T11,T8 |
StCalcPlainEcc |
215 |
Covered |
T2,T7,T11 |
StDisabled |
193 |
Covered |
T7,T8,T15 |
StIdle |
273 |
Covered |
T1,T2,T3 |
StPackData |
197 |
Covered |
T2,T7,T11 |
StPostPack |
218 |
Covered |
T59,T45,T74 |
StPrePack |
195 |
Covered |
T59,T45,T74 |
StReqFlash |
237 |
Covered |
T2,T7,T12 |
StScrambleData |
244 |
Covered |
T7,T11,T8 |
StWaitFlash |
270 |
Covered |
T2,T7,T12 |
transitions | Line No. | Covered | Tests |
StCalcEcc->StReqFlash |
257 |
Covered |
T7,T8,T9 |
StCalcMask->StScrambleData |
244 |
Covered |
T7,T11,T8 |
StCalcPlainEcc->StCalcMask |
237 |
Covered |
T7,T11,T8 |
StCalcPlainEcc->StReqFlash |
237 |
Covered |
T2,T12,T8 |
StIdle->StDisabled |
193 |
Covered |
T7,T8,T15 |
StIdle->StPackData |
197 |
Covered |
T2,T7,T11 |
StIdle->StPrePack |
195 |
Covered |
T59,T45,T74 |
StPackData->StCalcPlainEcc |
215 |
Covered |
T2,T7,T11 |
StPackData->StPostPack |
218 |
Covered |
T59,T45,T74 |
StPostPack->StCalcPlainEcc |
231 |
Covered |
T59,T45,T74 |
StPrePack->StPackData |
205 |
Covered |
T59,T45,T74 |
StReqFlash->StIdle |
273 |
Covered |
T2,T7,T12 |
StReqFlash->StWaitFlash |
270 |
Covered |
T2,T7,T12 |
StScrambleData->StCalcEcc |
252 |
Covered |
T7,T8,T9 |
StWaitFlash->StIdle |
280 |
Covered |
T2,T7,T12 |
Branch Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[0].u_core.gen_prog_data.u_prog
| Line No. | Total | Covered | Percent |
Branches |
|
55 |
55 |
100.00 |
TERNARY |
111 |
2 |
2 |
100.00 |
TERNARY |
148 |
2 |
2 |
100.00 |
TERNARY |
355 |
2 |
2 |
100.00 |
TERNARY |
366 |
3 |
3 |
100.00 |
IF |
130 |
2 |
2 |
100.00 |
IF |
151 |
4 |
4 |
100.00 |
IF |
164 |
2 |
2 |
100.00 |
CASE |
186 |
27 |
27 |
100.00 |
IF |
299 |
6 |
6 |
100.00 |
IF |
323 |
3 |
3 |
100.00 |
IF |
369 |
2 |
2 |
100.00 |
111 assign pack_data = (data_sel == Actual) ? data_i[BusWidth-1:0] : {BusWidth{1'b1}};
-1-
==>
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T2,T7,T11 |
0 |
Covered |
T1,T2,T3 |
148 assign align_next = (idx > '0) ? (idx_sub_one == sel_i) : 1'b0;
-1-
==>
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T2,T7,T11 |
0 |
Covered |
T1,T2,T3 |
355 assign data_o = ecc_i ? ecc_data : {{EccWidth{1'b1}}, ecc_data_in};
-1-
==>
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
366 assign done_cnt_d = txn_done ? '0 : (done ? done_cnt_q + 16'h1 : done_cnt_q);
-1- -2-
==> ==>
==>
Branches:
-1- | -2- | Status | Tests |
1 |
- |
Covered |
T2,T7,T12 |
0 |
1 |
Covered |
T1,T2,T3 |
0 |
0 |
Covered |
T1,T2,T3 |
130 if (!rst_ni) begin
-1-
131 data_invalid_q <= '0;
==>
132 end else begin
133 data_invalid_q <= data_invalid_d;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
151 if (!rst_ni) begin
-1-
152 idx <= '0;
==>
153 end else if (pack_valid && idx == MaxIdx) begin
-2-
154 // when a flash word is packed full, return index to 0
155 idx <= '0;
==>
156 end else if (pack_valid) begin
-3-
157 // increment otherwise
158 idx <= idx + 1'b1;
==>
159 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
1 |
- |
- |
Covered |
T1,T2,T3 |
0 |
1 |
- |
Covered |
T2,T7,T11 |
0 |
0 |
1 |
Covered |
T2,T7,T11 |
0 |
0 |
0 |
Covered |
T1,T2,T3 |
164 `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, StIdle)
-1-
==>
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
186 unique case (state_q)
-1-
187 StIdle: begin
188 // if first beat of a transaction is not aligned, prepack with empty bits
189 if (prim_mubi_pkg::mubi4_test_true_loose(disable_i)) begin
-2-
190 // only disable during idle state to ensure program is able to gracefully complete
191 // this is important as we do not want to accidentally disturb any electrical procedure
192 // internal to the flash macro
193 state_d = StDisabled;
==>
194 end else if (req_i && |sel_i) begin
-3-
195 state_d = StPrePack;
==>
196 end else if (req_i) begin
-4-
197 state_d = StPackData;
==>
198 end
MISSING_ELSE
==>
199 end
200
201 StPrePack: begin
202 // pack until currently supplied data
203 pack_valid = (idx < sel_i);
204 if (idx == align_next) begin
-5-
205 state_d = StPackData;
==>
206 end
MISSING_ELSE
==>
207 end
208
209 StPackData: begin
210 pack_valid = req_i;
211 data_sel = Actual;
212
213 if (req_i && idx == MaxIdx) begin
-6-
214 // last beat of a flash word
215 state_d = StCalcPlainEcc;
==>
216 end else if (req_i && last_i) begin
-7-
217 // last beat is not aligned with the last entry of flash word
218 state_d = StPostPack;
==>
219 end else if (req_i) begin
-8-
220 ack_o = 1'b1;
==>
221 end
MISSING_ELSE
==>
222 end
223
224 StPostPack: begin
225 // supply filler data
226 pack_valid = 1'b1;
227 data_sel = Filler;
228
229 // finish packing remaining entries
230 if (idx == MaxIdx) begin
-9-
231 state_d = StCalcPlainEcc;
==>
232 end
MISSING_ELSE
==>
233 end
234
235 StCalcPlainEcc: begin
236 plain_ecc_en = 1'b1;
237 state_d = scramble_i ? StCalcMask : StReqFlash;
-10-
==>
==>
238 end
239
240 StCalcMask: begin
241 calc_req_o = 1'b1;
242
243 if (calc_ack_i) begin
-11-
244 state_d = StScrambleData;
==>
245 end
MISSING_ELSE
==>
246 end
247
248 StScrambleData: begin
249 scramble_req_o = 1'b1;
250
251 if (scramble_ack_i) begin
-12-
252 state_d = StCalcEcc;
==>
253 end
MISSING_ELSE
==>
254 end
255
256 StCalcEcc: begin
257 state_d = StReqFlash;
==>
258 end
259
260 StReqFlash: begin
261 // only request flash if data integrity was valid
262 req_o = ~data_invalid_q;
263 last_o = last_i;
264
265 // if this is the last beat of the program burst
266 // - wait for done
267 // if this is NOT the last beat
268 // - ack the upstream request and accept more beats
269 if (last_i) begin
-13-
270 state_d = ack ? StWaitFlash : StReqFlash;
-14-
==>
==>
271 end else begin
272 ack_o = ack;
273 state_d = ack ? StIdle : StReqFlash;
-15-
==>
==>
274 end
275 end
276
277 StWaitFlash: begin
278 if (done) begin
-16-
279 ack_o = 1'b1;
==>
280 state_d = StIdle;
281 end
MISSING_ELSE
==>
282 end
283
284 StDisabled: begin
285 state_d = StDisabled;
==>
286 end
287
288 default: begin
289 fsm_err_o = 1'b1;
==>
Branches:
-1- | -2- | -3- | -4- | -5- | -6- | -7- | -8- | -9- | -10- | -11- | -12- | -13- | -14- | -15- | -16- | Status | Tests |
StIdle |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T7,T8,T9 |
StIdle |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T59,T45 |
StIdle |
0 |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T2,T7,T11 |
StIdle |
0 |
0 |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T1,T2,T3 |
StPrePack |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T59,T45 |
StPrePack |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T10 |
StPackData |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T2,T7,T11 |
StPackData |
- |
- |
- |
- |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T59,T45 |
StPackData |
- |
- |
- |
- |
0 |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T2,T7,T11 |
StPackData |
- |
- |
- |
- |
0 |
0 |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T2,T7,T11 |
StPostPack |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T59,T45 |
StPostPack |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T10 |
StCalcPlainEcc |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
Covered |
T7,T11,T8 |
StCalcPlainEcc |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
Covered |
T2,T12,T8 |
StCalcMask |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
Covered |
T7,T11,T8 |
StCalcMask |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
Covered |
T7,T11,T8 |
StScrambleData |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
Covered |
T7,T8,T9 |
StScrambleData |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
Covered |
T7,T11,T8 |
StCalcEcc |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T7,T8,T9 |
StReqFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
1 |
- |
- |
Covered |
T2,T7,T12 |
StReqFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
0 |
- |
- |
Covered |
T2,T7,T12 |
StReqFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
1 |
- |
Covered |
T2,T7,T12 |
StReqFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
0 |
- |
Covered |
T2,T7,T12 |
StWaitFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
Covered |
T2,T7,T12 |
StWaitFlash |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
Covered |
T2,T7,T12 |
StDisabled |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T7,T8,T9 |
default |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T9,T10,T16 |
299 if (!rst_ni) begin
-1-
300 packed_data <= '0;
==>
301 mask_q <= '0;
302 end else if (req_o && ack) begin
-2-
303 packed_data <= '0;
==>
304 end else if (calc_req_o && calc_ack_i) begin
-3-
305 packed_data <= packed_data ^ mask_i;
==>
306 mask_q <= mask_i;
307 end else if (scramble_req_o && scramble_ack_i) begin
-4-
308 packed_data <= scrambled_data_i[DataWidth-1:0] ^ mask_q;
==>
309 end else if (pack_valid) begin
-5-
310 packed_data[idx] <= pack_data;
==>
311 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | -4- | -5- | Status | Tests |
1 |
- |
- |
- |
- |
Covered |
T1,T2,T3 |
0 |
1 |
- |
- |
- |
Covered |
T2,T7,T12 |
0 |
0 |
1 |
- |
- |
Covered |
T7,T11,T8 |
0 |
0 |
0 |
1 |
- |
Covered |
T7,T8,T9 |
0 |
0 |
0 |
0 |
1 |
Covered |
T2,T7,T11 |
0 |
0 |
0 |
0 |
0 |
Covered |
T1,T2,T3 |
323 if (!rst_ni) begin
-1-
324 plain_data_ecc <= '1;
==>
325 end else if (plain_ecc_en) begin
-2-
326 plain_data_ecc <= plain_data_w_ecc[DataWidth +: PlainIntgWidth];
==>
327 end
MISSING_ELSE
==>
Branches:
-1- | -2- | Status | Tests |
1 |
- |
Covered |
T1,T2,T3 |
0 |
1 |
Covered |
T2,T7,T11 |
0 |
0 |
Covered |
T1,T2,T3 |
369 if (!rst_ni) begin
-1-
370 done_cnt_q <= '0;
==>
371 end else begin
372 done_cnt_q <= done_cnt_d;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
Assert Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[0].u_core.gen_prog_data.u_prog
Assertion Details
OneDonePerTxn_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
373795953 |
1239375 |
0 |
0 |
T2 |
3525 |
14 |
0 |
0 |
T3 |
1219 |
0 |
0 |
0 |
T4 |
1433 |
0 |
0 |
0 |
T7 |
1352 |
1 |
0 |
0 |
T8 |
4369 |
1 |
0 |
0 |
T9 |
656 |
0 |
0 |
0 |
T11 |
2053 |
0 |
0 |
0 |
T12 |
2602 |
1 |
0 |
0 |
T13 |
34283 |
0 |
0 |
0 |
T15 |
0 |
1 |
0 |
0 |
T17 |
1829 |
0 |
0 |
0 |
T20 |
0 |
102 |
0 |
0 |
T22 |
0 |
1 |
0 |
0 |
T24 |
0 |
1 |
0 |
0 |
T37 |
0 |
124 |
0 |
0 |
T59 |
0 |
3 |
0 |
0 |
PostPackRule_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
373795953 |
910 |
0 |
0 |
T29 |
114745 |
0 |
0 |
0 |
T30 |
0 |
13 |
0 |
0 |
T38 |
31423 |
0 |
0 |
0 |
T44 |
2155 |
0 |
0 |
0 |
T45 |
64670 |
21 |
0 |
0 |
T48 |
0 |
2 |
0 |
0 |
T49 |
0 |
22 |
0 |
0 |
T51 |
28820 |
0 |
0 |
0 |
T56 |
1821 |
0 |
0 |
0 |
T59 |
3051 |
3 |
0 |
0 |
T65 |
1335 |
0 |
0 |
0 |
T73 |
164213 |
0 |
0 |
0 |
T74 |
0 |
2 |
0 |
0 |
T110 |
357218 |
0 |
0 |
0 |
T143 |
0 |
3 |
0 |
0 |
T224 |
0 |
2 |
0 |
0 |
T225 |
0 |
3 |
0 |
0 |
T250 |
0 |
1 |
0 |
0 |
PrePackRule_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
373795953 |
615 |
0 |
0 |
T29 |
114745 |
0 |
0 |
0 |
T30 |
0 |
9 |
0 |
0 |
T38 |
31423 |
0 |
0 |
0 |
T44 |
2155 |
0 |
0 |
0 |
T45 |
64670 |
17 |
0 |
0 |
T48 |
0 |
2 |
0 |
0 |
T49 |
0 |
15 |
0 |
0 |
T51 |
28820 |
0 |
0 |
0 |
T56 |
1821 |
0 |
0 |
0 |
T59 |
3051 |
2 |
0 |
0 |
T65 |
1335 |
0 |
0 |
0 |
T73 |
164213 |
0 |
0 |
0 |
T74 |
0 |
2 |
0 |
0 |
T75 |
0 |
2 |
0 |
0 |
T110 |
357218 |
0 |
0 |
0 |
T143 |
0 |
4 |
0 |
0 |
T224 |
0 |
4 |
0 |
0 |
T225 |
0 |
2 |
0 |
0 |
WidthCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
1058 |
1058 |
0 |
0 |
T1 |
1 |
1 |
0 |
0 |
T2 |
1 |
1 |
0 |
0 |
T3 |
1 |
1 |
0 |
0 |
T4 |
1 |
1 |
0 |
0 |
T7 |
1 |
1 |
0 |
0 |
T8 |
1 |
1 |
0 |
0 |
T11 |
1 |
1 |
0 |
0 |
T12 |
1 |
1 |
0 |
0 |
T13 |
1 |
1 |
0 |
0 |
T17 |
1 |
1 |
0 |
0 |
u_state_regs_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
373795953 |
372949494 |
0 |
0 |
T1 |
2320 |
2267 |
0 |
0 |
T2 |
3525 |
3457 |
0 |
0 |
T3 |
1219 |
1156 |
0 |
0 |
T4 |
1433 |
1345 |
0 |
0 |
T7 |
1352 |
1259 |
0 |
0 |
T8 |
4369 |
3903 |
0 |
0 |
T11 |
2053 |
1895 |
0 |
0 |
T12 |
2602 |
2528 |
0 |
0 |
T13 |
34283 |
34207 |
0 |
0 |
T17 |
1829 |
1746 |
0 |
0 |