Module Definition
dashboard | hierarchy | modlist | groups | tests | asserts



Module Instance : tb.dut.u_eflash.gen_flash_cores[0].u_core.gen_prog_data.u_prog

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
98.04 100.00 93.85 100.00 96.36 100.00


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
98.39 100.00 93.85 100.00 100.00 96.49 100.00


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
98.40 98.88 95.28 100.00 97.83 100.00 gen_flash_cores[0].u_core


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
u_data_intg_chk 100.00 100.00 100.00
u_enc 100.00 100.00
u_plain_enc 100.00 100.00
u_state_regs 100.00 100.00 100.00 100.00



Module Instance : tb.dut.u_eflash.gen_flash_cores[1].u_core.gen_prog_data.u_prog

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
98.04 100.00 93.85 100.00 96.36 100.00


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
97.56 100.00 93.85 95.00 100.00 96.49 100.00


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
94.57 96.63 84.91 100.00 91.30 100.00 gen_flash_cores[1].u_core


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
u_data_intg_chk 97.50 100.00 95.00
u_enc 100.00 100.00
u_plain_enc 100.00 100.00
u_state_regs 100.00 100.00 100.00 100.00

Line Coverage for Module : flash_phy_prog
Line No.TotalCoveredPercent
TOTAL9696100.00
CONT_ASSIGN11111100.00
CONT_ASSIGN12211100.00
CONT_ASSIGN12611100.00
ALWAYS13033100.00
CONT_ASSIGN13811100.00
CONT_ASSIGN14311100.00
CONT_ASSIGN14411100.00
CONT_ASSIGN14711100.00
CONT_ASSIGN14811100.00
ALWAYS15166100.00
ALWAYS16433100.00
ALWAYS1745151100.00
ALWAYS2991212100.00
CONT_ASSIGN31411100.00
ALWAYS32344100.00
CONT_ASSIGN33111100.00
CONT_ASSIGN35211100.00
CONT_ASSIGN35511100.00
CONT_ASSIGN36511100.00
CONT_ASSIGN36611100.00
ALWAYS36933100.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 T10 T18  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 T10 T18  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: T4 T5 T6  194 1/1 end else if (req_i && |sel_i) begin Tests: T1 T2 T3  195 1/1 state_d = StPrePack; Tests: T11 T30 T25  196 1/1 end else if (req_i) begin Tests: T1 T2 T3  197 1/1 state_d = StPackData; Tests: T2 T10 T18  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: T11 T30 T25  204 1/1 if (idx == align_next) begin Tests: T11 T30 T25  205 1/1 state_d = StPackData; Tests: T11 T30 T25  206 end ==> MISSING_ELSE 207 end 208 209 StPackData: begin 210 1/1 pack_valid = req_i; Tests: T2 T10 T18  211 1/1 data_sel = Actual; Tests: T2 T10 T18  212 213 1/1 if (req_i && idx == MaxIdx) begin Tests: T2 T10 T18  214 // last beat of a flash word 215 1/1 state_d = StCalcPlainEcc; Tests: T2 T10 T18  216 1/1 end else if (req_i && last_i) begin Tests: T2 T10 T18  217 // last beat is not aligned with the last entry of flash word 218 1/1 state_d = StPostPack; Tests: T11 T30 T25  219 1/1 end else if (req_i) begin Tests: T2 T10 T18  220 1/1 ack_o = 1'b1; Tests: T2 T10 T18  221 end MISSING_ELSE 222 end 223 224 StPostPack: begin 225 // supply filler data 226 1/1 pack_valid = 1'b1; Tests: T11 T30 T25  227 1/1 data_sel = Filler; Tests: T11 T30 T25  228 229 // finish packing remaining entries 230 1/1 if (idx == MaxIdx) begin Tests: T11 T30 T25  231 1/1 state_d = StCalcPlainEcc; Tests: T11 T30 T25  232 end ==> MISSING_ELSE 233 end 234 235 StCalcPlainEcc: begin 236 1/1 plain_ecc_en = 1'b1; Tests: T2 T10 T18  237 1/1 state_d = scramble_i ? StCalcMask : StReqFlash; Tests: T2 T10 T18  238 end 239 240 StCalcMask: begin 241 1/1 calc_req_o = 1'b1; Tests: T18 T29 T33  242 243 1/1 if (calc_ack_i) begin Tests: T18 T29 T33  244 1/1 state_d = StScrambleData; Tests: T18 T29 T33  245 end MISSING_ELSE 246 end 247 248 StScrambleData: begin 249 1/1 scramble_req_o = 1'b1; Tests: T18 T29 T33  250 251 1/1 if (scramble_ack_i) begin Tests: T18 T29 T33  252 1/1 state_d = StCalcEcc; Tests: T18 T29 T33  253 end MISSING_ELSE 254 end 255 256 StCalcEcc: begin 257 1/1 state_d = StReqFlash; Tests: T18 T29 T33  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 T10 T18  263 1/1 last_o = last_i; Tests: T2 T10 T18  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 T10 T18  270 1/1 state_d = ack ? StWaitFlash : StReqFlash; Tests: T2 T10 T18  271 end else begin 272 1/1 ack_o = ack; Tests: T2 T10 T18  273 1/1 state_d = ack ? StIdle : StReqFlash; Tests: T2 T10 T18  274 end 275 end 276 277 StWaitFlash: begin 278 1/1 if (done) begin Tests: T2 T10 T18  279 1/1 ack_o = 1'b1; Tests: T2 T10 T18  280 1/1 state_d = StIdle; Tests: T2 T10 T18  281 end MISSING_ELSE 282 end 283 284 StDisabled: begin 285 1/1 state_d = StDisabled; Tests: T4 T5 T6  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 T10 T18  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: T18 T29 T33  306 1/1 mask_q <= mask_i; Tests: T18 T29 T33  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: T18 T29 T33  309 1/1 end else if (pack_valid) begin Tests: T1 T2 T3  310 1/1 packed_data[idx] <= pack_data; Tests: T2 T10 T18  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 T10 T18  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
TotalCoveredPercent
Conditions656193.85
Logical656193.85
Non-Logical00
Event00

 LINE       111
 EXPRESSION ((data_sel == Actual) ? data_i[(flash_phy_pkg::BusWidth - 1):0] : ({flash_phy_pkg::BusWidth {1'b1}}))
             ----------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT2,T10,T18

 LINE       111
 SUB-EXPRESSION (data_sel == Actual)
                ----------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT2,T10,T18

 LINE       126
 EXPRESSION (data_invalid_q | (pack_valid & ((~data_intg_ok))))
             -------1------   ----------------2---------------
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT7,T118,T8
10CoveredT7,T118,T8

 LINE       126
 SUB-EXPRESSION (pack_valid & ((~data_intg_ok)))
                 -----1----   --------2--------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT2,T10,T18
11CoveredT7,T118,T8

 LINE       143
 EXPRESSION (ack_i | data_invalid_q)
             --1--   -------2------
-1--2-StatusTests
00CoveredT1,T2,T3
01Not Covered
10CoveredT1,T2,T3

 LINE       144
 EXPRESSION (done_i | data_invalid_q)
             ---1--   -------2------
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT7,T118,T8
10CoveredT1,T2,T3

 LINE       148
 EXPRESSION ((idx > '0) ? (idx_sub_one == sel_i) : 1'b0)
             -----1----
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT2,T10,T18

 LINE       148
 SUB-EXPRESSION (idx_sub_one == sel_i)
                -----------1----------
-1-StatusTests
0CoveredT2,T10,T18
1CoveredT11,T30,T25

 LINE       153
 EXPRESSION (pack_valid && (idx == MaxIdx))
             -----1----    -------2-------
-1--2-StatusTests
01CoveredT2,T10,T18
10CoveredT2,T10,T18
11CoveredT2,T10,T18

 LINE       153
 SUB-EXPRESSION (idx == MaxIdx)
                -------1-------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT2,T10,T18

 LINE       194
 EXPRESSION (req_i && ((|sel_i)))
             --1--    -----2----
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT2,T10,T18
11CoveredT11,T30,T25

 LINE       204
 EXPRESSION (idx == align_next)
            ---------1---------
-1-StatusTests
0Not Covered
1CoveredT11,T30,T25

 LINE       213
 EXPRESSION (req_i && (idx == MaxIdx))
             --1--    -------2-------
-1--2-StatusTests
01CoveredT2,T10,T18
10CoveredT2,T10,T18
11CoveredT2,T10,T18

 LINE       213
 SUB-EXPRESSION (idx == MaxIdx)
                -------1-------
-1-StatusTests
0CoveredT2,T10,T18
1CoveredT2,T10,T18

 LINE       216
 EXPRESSION (req_i && last_i)
             --1--    ---2--
-1--2-StatusTests
01CoveredT2,T10,T18
10CoveredT2,T10,T18
11CoveredT11,T30,T25

 LINE       230
 EXPRESSION (idx == MaxIdx)
            -------1-------
-1-StatusTests
0Not Covered
1CoveredT11,T30,T25

 LINE       237
 EXPRESSION (scramble_i ? StCalcMask : StReqFlash)
             -----1----
-1-StatusTests
0CoveredT2,T10,T18
1CoveredT18,T29,T33

 LINE       270
 EXPRESSION (ack ? StWaitFlash : StReqFlash)
             -1-
-1-StatusTests
0CoveredT2,T10,T18
1CoveredT2,T10,T18

 LINE       273
 EXPRESSION (ack ? StIdle : StReqFlash)
             -1-
-1-StatusTests
0CoveredT2,T10,T18
1CoveredT2,T10,T18

 LINE       302
 EXPRESSION (req_o && ack)
             --1--    -2-
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT2,T10,T18
11CoveredT2,T10,T18

 LINE       304
 EXPRESSION (calc_req_o && calc_ack_i)
             -----1----    -----2----
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT18,T29,T33
11CoveredT18,T29,T33

 LINE       307
 EXPRESSION (scramble_req_o && scramble_ack_i)
             -------1------    -------2------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT18,T29,T33
11CoveredT18,T29,T33

 LINE       355
 EXPRESSION (ecc_i ? ecc_data : ({{flash_phy_pkg::EccWidth {1'b1}}, ecc_data_in}))
             --1--
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       365
 EXPRESSION (req_i && ack_o && last_i)
             --1--    --2--    ---3--
-1--2--3-StatusTests
011Not Covered
101CoveredT2,T10,T18
110CoveredT2,T10,T18
111CoveredT2,T10,T18

 LINE       366
 EXPRESSION (txn_done ? '0 : (done ? ((done_cnt_q + 16'b1)) : done_cnt_q))
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT2,T10,T18

 LINE       366
 SUB-EXPRESSION (done ? ((done_cnt_q + 16'b1)) : done_cnt_q)
                 --1-
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

FSM Coverage for Module : flash_phy_prog
Summary for FSM :: state_q
TotalCoveredPercent
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
statesLine No.CoveredTests
StCalcEcc 252 Covered T18,T29,T33
StCalcMask 237 Covered T18,T29,T33
StCalcPlainEcc 215 Covered T2,T10,T18
StDisabled 193 Covered T4,T5,T6
StIdle 273 Covered T1,T2,T3
StPackData 197 Covered T2,T10,T18
StPostPack 218 Covered T11,T30,T25
StPrePack 195 Covered T11,T30,T25
StReqFlash 237 Covered T2,T10,T18
StScrambleData 244 Covered T18,T29,T33
StWaitFlash 270 Covered T2,T10,T18


transitionsLine No.CoveredTests
StCalcEcc->StReqFlash 257 Covered T18,T29,T33
StCalcMask->StScrambleData 244 Covered T18,T29,T33
StCalcPlainEcc->StCalcMask 237 Covered T18,T29,T33
StCalcPlainEcc->StReqFlash 237 Covered T2,T10,T18
StIdle->StDisabled 193 Covered T4,T5,T6
StIdle->StPackData 197 Covered T2,T10,T18
StIdle->StPrePack 195 Covered T11,T30,T25
StPackData->StCalcPlainEcc 215 Covered T2,T10,T18
StPackData->StPostPack 218 Covered T11,T30,T25
StPostPack->StCalcPlainEcc 231 Covered T11,T30,T25
StPrePack->StPackData 205 Covered T11,T30,T25
StReqFlash->StIdle 273 Covered T2,T10,T18
StReqFlash->StWaitFlash 270 Covered T2,T10,T18
StScrambleData->StCalcEcc 252 Covered T18,T29,T33
StWaitFlash->StIdle 280 Covered T2,T10,T18



Branch Coverage for Module : flash_phy_prog
Line No.TotalCoveredPercent
Branches 55 53 96.36
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 25 92.59
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-StatusTests
1 Covered T2,T10,T18
0 Covered T1,T2,T3


148 assign align_next = (idx > '0) ? (idx_sub_one == sel_i) : 1'b0; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T2,T10,T18
0 Covered T1,T2,T3


355 assign data_o = ecc_i ? ecc_data : {{EccWidth{1'b1}}, ecc_data_in}; -1- ==> ==>

Branches:
-1-StatusTests
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-StatusTests
1 - Covered T2,T10,T18
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-StatusTests
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-StatusTests
1 - - Covered T1,T2,T3
0 1 - Covered T2,T10,T18
0 0 1 Covered T2,T10,T18
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-StatusTests
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-StatusTests
StIdle 1 - - - - - - - - - - - - - - Covered T4,T5,T6
StIdle 0 1 - - - - - - - - - - - - - Covered T11,T30,T25
StIdle 0 0 1 - - - - - - - - - - - - Covered T2,T10,T18
StIdle 0 0 0 - - - - - - - - - - - - Covered T1,T2,T3
StPrePack - - - 1 - - - - - - - - - - - Covered T11,T30,T25
StPrePack - - - 0 - - - - - - - - - - - Not Covered
StPackData - - - - 1 - - - - - - - - - - Covered T2,T10,T18
StPackData - - - - 0 1 - - - - - - - - - Covered T11,T30,T25
StPackData - - - - 0 0 1 - - - - - - - - Covered T2,T10,T18
StPackData - - - - 0 0 0 - - - - - - - - Covered T2,T10,T18
StPostPack - - - - - - - 1 - - - - - - - Covered T11,T30,T25
StPostPack - - - - - - - 0 - - - - - - - Not Covered
StCalcPlainEcc - - - - - - - - 1 - - - - - - Covered T18,T29,T33
StCalcPlainEcc - - - - - - - - 0 - - - - - - Covered T2,T10,T18
StCalcMask - - - - - - - - - 1 - - - - - Covered T18,T29,T33
StCalcMask - - - - - - - - - 0 - - - - - Covered T18,T29,T33
StScrambleData - - - - - - - - - - 1 - - - - Covered T18,T29,T33
StScrambleData - - - - - - - - - - 0 - - - - Covered T18,T29,T33
StCalcEcc - - - - - - - - - - - - - - - Covered T18,T29,T33
StReqFlash - - - - - - - - - - - 1 1 - - Covered T2,T10,T18
StReqFlash - - - - - - - - - - - 1 0 - - Covered T2,T10,T18
StReqFlash - - - - - - - - - - - 0 - 1 - Covered T2,T10,T18
StReqFlash - - - - - - - - - - - 0 - 0 - Covered T2,T10,T18
StWaitFlash - - - - - - - - - - - - - - 1 Covered T2,T10,T18
StWaitFlash - - - - - - - - - - - - - - 0 Covered T2,T10,T18
StDisabled - - - - - - - - - - - - - - - Covered T4,T5,T6
default - - - - - - - - - - - - - - - Covered T13,T14,T15


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-StatusTests
1 - - - - Covered T1,T2,T3
0 1 - - - Covered T2,T10,T18
0 0 1 - - Covered T18,T29,T33
0 0 0 1 - Covered T18,T29,T33
0 0 0 0 1 Covered T2,T10,T18
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-StatusTests
1 - Covered T1,T2,T3
0 1 Covered T2,T10,T18
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-StatusTests
1 Covered T1,T2,T3
0 Covered T1,T2,T3


Assert Coverage for Module : flash_phy_prog
TotalAttemptedPercentSucceeded/MatchedPercent
Assertions 5 5 100.00 5 100.00
Cover properties 0 0 0
Cover sequences 0 0 0
Total 5 5 100.00 5 100.00




Assertion Details

NameAttemptsReal SuccessesFailuresIncomplete
OneDonePerTxn_A 799309318 2432241 0 0
PostPackRule_A 799309318 1680 0 0
PrePackRule_A 799309318 1135 0 0
WidthCheck_A 2106 2106 0 0
u_state_regs_A 799309318 797773680 0 0


OneDonePerTxn_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 799309318 2432241 0 0
T2 2364 1 0 0
T3 9069 0 0 0
T4 7000 0 0 0
T5 0 1 0 0
T6 0 1 0 0
T10 3756 14 0 0
T11 9216 6 0 0
T12 53469 0 0 0
T16 2282 0 0 0
T17 1864 0 0 0
T18 311206 89 0 0
T19 3674 0 0 0
T25 0 4 0 0
T29 341014 1146 0 0
T30 95166 61 0 0
T33 194745 1268 0 0
T34 0 1 0 0
T58 0 117 0 0
T63 100229 527 0 0
T69 1511 0 0 0
T108 0 289 0 0

PostPackRule_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 799309318 1680 0 0
T11 9216 5 0 0
T12 106938 0 0 0
T25 145548 4 0 0
T26 0 3 0 0
T27 0 4 0 0
T29 341014 0 0 0
T30 190332 32 0 0
T33 389490 0 0 0
T34 3892 0 0 0
T48 125328 0 0 0
T63 200458 0 0 0
T64 0 28 0 0
T69 3022 0 0 0
T88 0 5 0 0
T133 0 3 0 0
T145 0 3 0 0
T221 0 4 0 0
T222 0 3 0 0
T223 0 5 0 0

PrePackRule_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 799309318 1135 0 0
T5 798 0 0 0
T11 4608 1 0 0
T12 106938 0 0 0
T25 145548 2 0 0
T26 0 6 0 0
T27 0 2 0 0
T29 170507 0 0 0
T30 190332 26 0 0
T31 6217 0 0 0
T33 194745 0 0 0
T34 3892 0 0 0
T48 125328 0 0 0
T63 200458 0 0 0
T64 0 32 0 0
T69 3022 0 0 0
T88 0 3 0 0
T108 241322 0 0 0
T133 0 4 0 0
T145 0 3 0 0
T221 0 3 0 0
T222 0 2 0 0
T223 0 1 0 0

WidthCheck_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 2106 2106 0 0
T1 2 2 0 0
T2 2 2 0 0
T3 2 2 0 0
T4 2 2 0 0
T10 2 2 0 0
T11 2 2 0 0
T16 2 2 0 0
T17 2 2 0 0
T18 2 2 0 0
T19 2 2 0 0

u_state_regs_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 799309318 797773680 0 0
T1 2860 2708 0 0
T2 4728 4550 0 0
T3 18138 18036 0 0
T4 7000 5652 0 0
T10 7512 7330 0 0
T11 9216 9046 0 0
T16 4564 4436 0 0
T17 3728 3574 0 0
T18 311206 311096 0 0
T19 3674 3492 0 0

Line Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[0].u_core.gen_prog_data.u_prog
Line No.TotalCoveredPercent
TOTAL9696100.00
CONT_ASSIGN11111100.00
CONT_ASSIGN12211100.00
CONT_ASSIGN12611100.00
ALWAYS13033100.00
CONT_ASSIGN13811100.00
CONT_ASSIGN14311100.00
CONT_ASSIGN14411100.00
CONT_ASSIGN14711100.00
CONT_ASSIGN14811100.00
ALWAYS15166100.00
ALWAYS16433100.00
ALWAYS1745151100.00
ALWAYS2991212100.00
CONT_ASSIGN31411100.00
ALWAYS32344100.00
CONT_ASSIGN33111100.00
CONT_ASSIGN35211100.00
CONT_ASSIGN35511100.00
CONT_ASSIGN36511100.00
CONT_ASSIGN36611100.00
ALWAYS36933100.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 T10 T18  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 T10 T18  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: T4 T5 T6  194 1/1 end else if (req_i && |sel_i) begin Tests: T1 T2 T3  195 1/1 state_d = StPrePack; Tests: T30 T25 T133  196 1/1 end else if (req_i) begin Tests: T1 T2 T3  197 1/1 state_d = StPackData; Tests: T2 T10 T18  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: T30 T25 T133  204 1/1 if (idx == align_next) begin Tests: T30 T25 T133  205 1/1 state_d = StPackData; Tests: T30 T25 T133  206 end ==> MISSING_ELSE 207 end 208 209 StPackData: begin 210 1/1 pack_valid = req_i; Tests: T2 T10 T18  211 1/1 data_sel = Actual; Tests: T2 T10 T18  212 213 1/1 if (req_i && idx == MaxIdx) begin Tests: T2 T10 T18  214 // last beat of a flash word 215 1/1 state_d = StCalcPlainEcc; Tests: T2 T10 T18  216 1/1 end else if (req_i && last_i) begin Tests: T2 T10 T18  217 // last beat is not aligned with the last entry of flash word 218 1/1 state_d = StPostPack; Tests: T11 T30 T25  219 1/1 end else if (req_i) begin Tests: T2 T10 T18  220 1/1 ack_o = 1'b1; Tests: T2 T10 T18  221 end MISSING_ELSE 222 end 223 224 StPostPack: begin 225 // supply filler data 226 1/1 pack_valid = 1'b1; Tests: T11 T30 T25  227 1/1 data_sel = Filler; Tests: T11 T30 T25  228 229 // finish packing remaining entries 230 1/1 if (idx == MaxIdx) begin Tests: T11 T30 T25  231 1/1 state_d = StCalcPlainEcc; Tests: T11 T30 T25  232 end ==> MISSING_ELSE 233 end 234 235 StCalcPlainEcc: begin 236 1/1 plain_ecc_en = 1'b1; Tests: T2 T10 T18  237 1/1 state_d = scramble_i ? StCalcMask : StReqFlash; Tests: T2 T10 T18  238 end 239 240 StCalcMask: begin 241 1/1 calc_req_o = 1'b1; Tests: T18 T29 T33  242 243 1/1 if (calc_ack_i) begin Tests: T18 T29 T33  244 1/1 state_d = StScrambleData; Tests: T18 T29 T33  245 end MISSING_ELSE 246 end 247 248 StScrambleData: begin 249 1/1 scramble_req_o = 1'b1; Tests: T18 T29 T33  250 251 1/1 if (scramble_ack_i) begin Tests: T18 T29 T33  252 1/1 state_d = StCalcEcc; Tests: T18 T29 T33  253 end MISSING_ELSE 254 end 255 256 StCalcEcc: begin 257 1/1 state_d = StReqFlash; Tests: T18 T29 T33  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 T10 T18  263 1/1 last_o = last_i; Tests: T2 T10 T18  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 T10 T18  270 1/1 state_d = ack ? StWaitFlash : StReqFlash; Tests: T2 T10 T18  271 end else begin 272 1/1 ack_o = ack; Tests: T2 T10 T18  273 1/1 state_d = ack ? StIdle : StReqFlash; Tests: T2 T10 T18  274 end 275 end 276 277 StWaitFlash: begin 278 1/1 if (done) begin Tests: T2 T10 T18  279 1/1 ack_o = 1'b1; Tests: T2 T10 T18  280 1/1 state_d = StIdle; Tests: T2 T10 T18  281 end MISSING_ELSE 282 end 283 284 StDisabled: begin 285 1/1 state_d = StDisabled; Tests: T4 T5 T6  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 T10 T18  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: T18 T29 T33  306 1/1 mask_q <= mask_i; Tests: T18 T29 T33  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: T18 T29 T33  309 1/1 end else if (pack_valid) begin Tests: T1 T2 T3  310 1/1 packed_data[idx] <= pack_data; Tests: T2 T10 T18  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 T10 T18  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
TotalCoveredPercent
Conditions656193.85
Logical656193.85
Non-Logical00
Event00

 LINE       111
 EXPRESSION ((data_sel == Actual) ? data_i[(flash_phy_pkg::BusWidth - 1):0] : ({flash_phy_pkg::BusWidth {1'b1}}))
             ----------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT2,T10,T18

 LINE       111
 SUB-EXPRESSION (data_sel == Actual)
                ----------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT2,T10,T18

 LINE       126
 EXPRESSION (data_invalid_q | (pack_valid & ((~data_intg_ok))))
             -------1------   ----------------2---------------
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT7,T118,T8
10CoveredT7,T118,T8

 LINE       126
 SUB-EXPRESSION (pack_valid & ((~data_intg_ok)))
                 -----1----   --------2--------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT2,T10,T18
11CoveredT7,T118,T8

 LINE       143
 EXPRESSION (ack_i | data_invalid_q)
             --1--   -------2------
-1--2-StatusTests
00CoveredT1,T2,T3
01Not Covered
10CoveredT1,T2,T3

 LINE       144
 EXPRESSION (done_i | data_invalid_q)
             ---1--   -------2------
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT7,T118,T8
10CoveredT1,T2,T3

 LINE       148
 EXPRESSION ((idx > '0) ? (idx_sub_one == sel_i) : 1'b0)
             -----1----
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT2,T10,T18

 LINE       148
 SUB-EXPRESSION (idx_sub_one == sel_i)
                -----------1----------
-1-StatusTests
0CoveredT2,T10,T18
1CoveredT11,T30,T25

 LINE       153
 EXPRESSION (pack_valid && (idx == MaxIdx))
             -----1----    -------2-------
-1--2-StatusTests
01CoveredT2,T10,T18
10CoveredT2,T10,T18
11CoveredT2,T10,T18

 LINE       153
 SUB-EXPRESSION (idx == MaxIdx)
                -------1-------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT2,T10,T18

 LINE       194
 EXPRESSION (req_i && ((|sel_i)))
             --1--    -----2----
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT2,T10,T18
11CoveredT30,T25,T133

 LINE       204
 EXPRESSION (idx == align_next)
            ---------1---------
-1-StatusTests
0Not Covered
1CoveredT30,T25,T133

 LINE       213
 EXPRESSION (req_i && (idx == MaxIdx))
             --1--    -------2-------
-1--2-StatusTests
01CoveredT2,T10,T18
10CoveredT2,T10,T18
11CoveredT2,T10,T18

 LINE       213
 SUB-EXPRESSION (idx == MaxIdx)
                -------1-------
-1-StatusTests
0CoveredT2,T10,T18
1CoveredT2,T10,T18

 LINE       216
 EXPRESSION (req_i && last_i)
             --1--    ---2--
-1--2-StatusTests
01CoveredT2,T10,T18
10CoveredT2,T10,T18
11CoveredT11,T30,T25

 LINE       230
 EXPRESSION (idx == MaxIdx)
            -------1-------
-1-StatusTests
0Not Covered
1CoveredT11,T30,T25

 LINE       237
 EXPRESSION (scramble_i ? StCalcMask : StReqFlash)
             -----1----
-1-StatusTests
0CoveredT2,T10,T18
1CoveredT18,T29,T33

 LINE       270
 EXPRESSION (ack ? StWaitFlash : StReqFlash)
             -1-
-1-StatusTests
0CoveredT2,T10,T18
1CoveredT2,T10,T18

 LINE       273
 EXPRESSION (ack ? StIdle : StReqFlash)
             -1-
-1-StatusTests
0CoveredT2,T10,T18
1CoveredT2,T10,T18

 LINE       302
 EXPRESSION (req_o && ack)
             --1--    -2-
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT2,T10,T18
11CoveredT2,T10,T18

 LINE       304
 EXPRESSION (calc_req_o && calc_ack_i)
             -----1----    -----2----
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT18,T29,T33
11CoveredT18,T29,T33

 LINE       307
 EXPRESSION (scramble_req_o && scramble_ack_i)
             -------1------    -------2------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT18,T29,T33
11CoveredT18,T29,T33

 LINE       355
 EXPRESSION (ecc_i ? ecc_data : ({{flash_phy_pkg::EccWidth {1'b1}}, ecc_data_in}))
             --1--
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       365
 EXPRESSION (req_i && ack_o && last_i)
             --1--    --2--    ---3--
-1--2--3-StatusTests
011Not Covered
101CoveredT2,T10,T18
110CoveredT2,T10,T18
111CoveredT2,T10,T18

 LINE       366
 EXPRESSION (txn_done ? '0 : (done ? ((done_cnt_q + 16'b1)) : done_cnt_q))
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT2,T10,T18

 LINE       366
 SUB-EXPRESSION (done ? ((done_cnt_q + 16'b1)) : done_cnt_q)
                 --1-
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,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
TotalCoveredPercent
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
statesLine No.CoveredTests
StCalcEcc 252 Covered T18,T29,T33
StCalcMask 237 Covered T18,T29,T33
StCalcPlainEcc 215 Covered T2,T10,T18
StDisabled 193 Covered T4,T5,T6
StIdle 273 Covered T1,T2,T3
StPackData 197 Covered T2,T10,T18
StPostPack 218 Covered T11,T30,T25
StPrePack 195 Covered T30,T25,T133
StReqFlash 237 Covered T2,T10,T18
StScrambleData 244 Covered T18,T29,T33
StWaitFlash 270 Covered T2,T10,T18


transitionsLine No.CoveredTests
StCalcEcc->StReqFlash 257 Covered T18,T29,T33
StCalcMask->StScrambleData 244 Covered T18,T29,T33
StCalcPlainEcc->StCalcMask 237 Covered T18,T29,T33
StCalcPlainEcc->StReqFlash 237 Covered T2,T10,T18
StIdle->StDisabled 193 Covered T4,T5,T6
StIdle->StPackData 197 Covered T2,T10,T18
StIdle->StPrePack 195 Covered T30,T25,T133
StPackData->StCalcPlainEcc 215 Covered T2,T10,T18
StPackData->StPostPack 218 Covered T11,T30,T25
StPostPack->StCalcPlainEcc 231 Covered T11,T30,T25
StPrePack->StPackData 205 Covered T30,T25,T133
StReqFlash->StIdle 273 Covered T2,T10,T18
StReqFlash->StWaitFlash 270 Covered T2,T10,T18
StScrambleData->StCalcEcc 252 Covered T18,T29,T33
StWaitFlash->StIdle 280 Covered T2,T10,T18



Branch Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[0].u_core.gen_prog_data.u_prog
Line No.TotalCoveredPercent
Branches 55 53 96.36
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 25 92.59
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-StatusTests
1 Covered T2,T10,T18
0 Covered T1,T2,T3


148 assign align_next = (idx > '0) ? (idx_sub_one == sel_i) : 1'b0; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T2,T10,T18
0 Covered T1,T2,T3


355 assign data_o = ecc_i ? ecc_data : {{EccWidth{1'b1}}, ecc_data_in}; -1- ==> ==>

Branches:
-1-StatusTests
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-StatusTests
1 - Covered T2,T10,T18
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-StatusTests
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-StatusTests
1 - - Covered T1,T2,T3
0 1 - Covered T2,T10,T18
0 0 1 Covered T2,T10,T18
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-StatusTests
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-StatusTests
StIdle 1 - - - - - - - - - - - - - - Covered T4,T5,T6
StIdle 0 1 - - - - - - - - - - - - - Covered T30,T25,T133
StIdle 0 0 1 - - - - - - - - - - - - Covered T2,T10,T18
StIdle 0 0 0 - - - - - - - - - - - - Covered T1,T2,T3
StPrePack - - - 1 - - - - - - - - - - - Covered T30,T25,T133
StPrePack - - - 0 - - - - - - - - - - - Not Covered
StPackData - - - - 1 - - - - - - - - - - Covered T2,T10,T18
StPackData - - - - 0 1 - - - - - - - - - Covered T11,T30,T25
StPackData - - - - 0 0 1 - - - - - - - - Covered T2,T10,T18
StPackData - - - - 0 0 0 - - - - - - - - Covered T2,T10,T18
StPostPack - - - - - - - 1 - - - - - - - Covered T11,T30,T25
StPostPack - - - - - - - 0 - - - - - - - Not Covered
StCalcPlainEcc - - - - - - - - 1 - - - - - - Covered T18,T29,T33
StCalcPlainEcc - - - - - - - - 0 - - - - - - Covered T2,T10,T18
StCalcMask - - - - - - - - - 1 - - - - - Covered T18,T29,T33
StCalcMask - - - - - - - - - 0 - - - - - Covered T18,T29,T33
StScrambleData - - - - - - - - - - 1 - - - - Covered T18,T29,T33
StScrambleData - - - - - - - - - - 0 - - - - Covered T18,T29,T33
StCalcEcc - - - - - - - - - - - - - - - Covered T18,T29,T33
StReqFlash - - - - - - - - - - - 1 1 - - Covered T2,T10,T18
StReqFlash - - - - - - - - - - - 1 0 - - Covered T2,T10,T18
StReqFlash - - - - - - - - - - - 0 - 1 - Covered T2,T10,T18
StReqFlash - - - - - - - - - - - 0 - 0 - Covered T2,T10,T18
StWaitFlash - - - - - - - - - - - - - - 1 Covered T2,T10,T18
StWaitFlash - - - - - - - - - - - - - - 0 Covered T2,T10,T18
StDisabled - - - - - - - - - - - - - - - Covered T4,T5,T6
default - - - - - - - - - - - - - - - Covered T13,T14,T15


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-StatusTests
1 - - - - Covered T1,T2,T3
0 1 - - - Covered T2,T10,T18
0 0 1 - - Covered T18,T29,T33
0 0 0 1 - Covered T18,T29,T33
0 0 0 0 1 Covered T2,T10,T18
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-StatusTests
1 - Covered T1,T2,T3
0 1 Covered T2,T10,T18
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-StatusTests
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
TotalAttemptedPercentSucceeded/MatchedPercent
Assertions 5 5 100.00 5 100.00
Cover properties 0 0 0
Cover sequences 0 0 0
Total 5 5 100.00 5 100.00




Assertion Details

NameAttemptsReal SuccessesFailuresIncomplete
OneDonePerTxn_A 399654659 1231163 0 0
PostPackRule_A 399654659 862 0 0
PrePackRule_A 399654659 585 0 0
WidthCheck_A 1053 1053 0 0
u_state_regs_A 399654659 398886840 0 0


OneDonePerTxn_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 399654659 1231163 0 0
T2 2364 1 0 0
T3 9069 0 0 0
T4 3500 0 0 0
T10 3756 14 0 0
T11 4608 1 0 0
T16 2282 0 0 0
T17 1864 0 0 0
T18 155603 47 0 0
T19 1837 0 0 0
T25 0 4 0 0
T29 170507 558 0 0
T30 0 25 0 0
T33 0 743 0 0
T63 0 302 0 0
T108 0 289 0 0

PostPackRule_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 399654659 862 0 0
T11 4608 1 0 0
T12 53469 0 0 0
T25 72774 4 0 0
T26 0 1 0 0
T29 170507 0 0 0
T30 95166 13 0 0
T33 194745 0 0 0
T34 1946 0 0 0
T48 62664 0 0 0
T63 100229 0 0 0
T64 0 14 0 0
T69 1511 0 0 0
T88 0 2 0 0
T133 0 3 0 0
T145 0 1 0 0
T221 0 1 0 0
T222 0 2 0 0

PrePackRule_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 399654659 585 0 0
T5 798 0 0 0
T12 53469 0 0 0
T25 72774 2 0 0
T26 0 1 0 0
T30 95166 11 0 0
T31 6217 0 0 0
T34 1946 0 0 0
T48 62664 0 0 0
T63 100229 0 0 0
T64 0 18 0 0
T69 1511 0 0 0
T88 0 2 0 0
T108 241322 0 0 0
T133 0 3 0 0
T145 0 1 0 0
T221 0 1 0 0
T222 0 1 0 0
T223 0 1 0 0

WidthCheck_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 1053 1053 0 0
T1 1 1 0 0
T2 1 1 0 0
T3 1 1 0 0
T4 1 1 0 0
T10 1 1 0 0
T11 1 1 0 0
T16 1 1 0 0
T17 1 1 0 0
T18 1 1 0 0
T19 1 1 0 0

u_state_regs_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 399654659 398886840 0 0
T1 1430 1354 0 0
T2 2364 2275 0 0
T3 9069 9018 0 0
T4 3500 2826 0 0
T10 3756 3665 0 0
T11 4608 4523 0 0
T16 2282 2218 0 0
T17 1864 1787 0 0
T18 155603 155548 0 0
T19 1837 1746 0 0

Line Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[1].u_core.gen_prog_data.u_prog
Line No.TotalCoveredPercent
TOTAL9696100.00
CONT_ASSIGN11111100.00
CONT_ASSIGN12211100.00
CONT_ASSIGN12611100.00
ALWAYS13033100.00
CONT_ASSIGN13811100.00
CONT_ASSIGN14311100.00
CONT_ASSIGN14411100.00
CONT_ASSIGN14711100.00
CONT_ASSIGN14811100.00
ALWAYS15166100.00
ALWAYS16433100.00
ALWAYS1745151100.00
ALWAYS2991212100.00
CONT_ASSIGN31411100.00
ALWAYS32344100.00
CONT_ASSIGN33111100.00
CONT_ASSIGN35211100.00
CONT_ASSIGN35511100.00
CONT_ASSIGN36511100.00
CONT_ASSIGN36611100.00
ALWAYS36933100.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: T18 T11 T29  156 1/1 end else if (pack_valid) begin Tests: T1 T2 T3  157 // increment otherwise 158 1/1 idx <= idx + 1'b1; Tests: T18 T11 T29  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: T4 T5 T6  194 1/1 end else if (req_i && |sel_i) begin Tests: T1 T2 T3  195 1/1 state_d = StPrePack; Tests: T11 T30 T133  196 1/1 end else if (req_i) begin Tests: T1 T2 T3  197 1/1 state_d = StPackData; Tests: T18 T11 T29  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: T11 T30 T133  204 1/1 if (idx == align_next) begin Tests: T11 T30 T133  205 1/1 state_d = StPackData; Tests: T11 T30 T133  206 end ==> MISSING_ELSE 207 end 208 209 StPackData: begin 210 1/1 pack_valid = req_i; Tests: T18 T11 T29  211 1/1 data_sel = Actual; Tests: T18 T11 T29  212 213 1/1 if (req_i && idx == MaxIdx) begin Tests: T18 T11 T29  214 // last beat of a flash word 215 1/1 state_d = StCalcPlainEcc; Tests: T18 T11 T29  216 1/1 end else if (req_i && last_i) begin Tests: T18 T11 T29  217 // last beat is not aligned with the last entry of flash word 218 1/1 state_d = StPostPack; Tests: T11 T30 T221  219 1/1 end else if (req_i) begin Tests: T18 T11 T29  220 1/1 ack_o = 1'b1; Tests: T18 T11 T29  221 end MISSING_ELSE 222 end 223 224 StPostPack: begin 225 // supply filler data 226 1/1 pack_valid = 1'b1; Tests: T11 T30 T221  227 1/1 data_sel = Filler; Tests: T11 T30 T221  228 229 // finish packing remaining entries 230 1/1 if (idx == MaxIdx) begin Tests: T11 T30 T221  231 1/1 state_d = StCalcPlainEcc; Tests: T11 T30 T221  232 end ==> MISSING_ELSE 233 end 234 235 StCalcPlainEcc: begin 236 1/1 plain_ecc_en = 1'b1; Tests: T18 T11 T29  237 1/1 state_d = scramble_i ? StCalcMask : StReqFlash; Tests: T18 T11 T29  238 end 239 240 StCalcMask: begin 241 1/1 calc_req_o = 1'b1; Tests: T29 T33 T34  242 243 1/1 if (calc_ack_i) begin Tests: T29 T33 T34  244 1/1 state_d = StScrambleData; Tests: T29 T33 T34  245 end MISSING_ELSE 246 end 247 248 StScrambleData: begin 249 1/1 scramble_req_o = 1'b1; Tests: T29 T33 T34  250 251 1/1 if (scramble_ack_i) begin Tests: T29 T33 T34  252 1/1 state_d = StCalcEcc; Tests: T29 T33 T34  253 end MISSING_ELSE 254 end 255 256 StCalcEcc: begin 257 1/1 state_d = StReqFlash; Tests: T29 T33 T34  258 end 259 260 StReqFlash: begin 261 // only request flash if data integrity was valid 262 1/1 req_o = ~data_invalid_q; Tests: T18 T11 T29  263 1/1 last_o = last_i; Tests: T18 T11 T29  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: T18 T11 T29  270 1/1 state_d = ack ? StWaitFlash : StReqFlash; Tests: T18 T11 T29  271 end else begin 272 1/1 ack_o = ack; Tests: T18 T11 T29  273 1/1 state_d = ack ? StIdle : StReqFlash; Tests: T18 T11 T29  274 end 275 end 276 277 StWaitFlash: begin 278 1/1 if (done) begin Tests: T18 T11 T29  279 1/1 ack_o = 1'b1; Tests: T18 T11 T29  280 1/1 state_d = StIdle; Tests: T18 T11 T29  281 end MISSING_ELSE 282 end 283 284 StDisabled: begin 285 1/1 state_d = StDisabled; Tests: T4 T5 T6  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: T18 T11 T29  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: T29 T33 T34  306 1/1 mask_q <= mask_i; Tests: T29 T33 T34  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: T29 T33 T34  309 1/1 end else if (pack_valid) begin Tests: T1 T2 T3  310 1/1 packed_data[idx] <= pack_data; Tests: T18 T11 T29  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: T18 T11 T29  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
TotalCoveredPercent
Conditions656193.85
Logical656193.85
Non-Logical00
Event00

 LINE       111
 EXPRESSION ((data_sel == Actual) ? data_i[(flash_phy_pkg::BusWidth - 1):0] : ({flash_phy_pkg::BusWidth {1'b1}}))
             ----------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT18,T11,T29

 LINE       111
 SUB-EXPRESSION (data_sel == Actual)
                ----------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT18,T11,T29

 LINE       126
 EXPRESSION (data_invalid_q | (pack_valid & ((~data_intg_ok))))
             -------1------   ----------------2---------------
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT7,T8,T20
10CoveredT7,T8,T20

 LINE       126
 SUB-EXPRESSION (pack_valid & ((~data_intg_ok)))
                 -----1----   --------2--------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT18,T11,T29
11CoveredT7,T8,T20

 LINE       143
 EXPRESSION (ack_i | data_invalid_q)
             --1--   -------2------
-1--2-StatusTests
00CoveredT1,T2,T3
01Not Covered
10CoveredT1,T2,T3

 LINE       144
 EXPRESSION (done_i | data_invalid_q)
             ---1--   -------2------
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT7,T8,T20
10CoveredT3,T16,T17

 LINE       148
 EXPRESSION ((idx > '0) ? (idx_sub_one == sel_i) : 1'b0)
             -----1----
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT18,T11,T29

 LINE       148
 SUB-EXPRESSION (idx_sub_one == sel_i)
                -----------1----------
-1-StatusTests
0CoveredT18,T11,T29
1CoveredT11,T30,T221

 LINE       153
 EXPRESSION (pack_valid && (idx == MaxIdx))
             -----1----    -------2-------
-1--2-StatusTests
01CoveredT18,T11,T29
10CoveredT18,T11,T29
11CoveredT18,T11,T29

 LINE       153
 SUB-EXPRESSION (idx == MaxIdx)
                -------1-------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT18,T11,T29

 LINE       194
 EXPRESSION (req_i && ((|sel_i)))
             --1--    -----2----
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT18,T11,T29
11CoveredT11,T30,T133

 LINE       204
 EXPRESSION (idx == align_next)
            ---------1---------
-1-StatusTests
0Not Covered
1CoveredT11,T30,T133

 LINE       213
 EXPRESSION (req_i && (idx == MaxIdx))
             --1--    -------2-------
-1--2-StatusTests
01CoveredT18,T11,T29
10CoveredT18,T11,T29
11CoveredT18,T11,T29

 LINE       213
 SUB-EXPRESSION (idx == MaxIdx)
                -------1-------
-1-StatusTests
0CoveredT18,T11,T29
1CoveredT18,T11,T29

 LINE       216
 EXPRESSION (req_i && last_i)
             --1--    ---2--
-1--2-StatusTests
01CoveredT18,T11,T29
10CoveredT18,T11,T29
11CoveredT11,T30,T221

 LINE       230
 EXPRESSION (idx == MaxIdx)
            -------1-------
-1-StatusTests
0Not Covered
1CoveredT11,T30,T221

 LINE       237
 EXPRESSION (scramble_i ? StCalcMask : StReqFlash)
             -----1----
-1-StatusTests
0CoveredT18,T11,T29
1CoveredT29,T33,T34

 LINE       270
 EXPRESSION (ack ? StWaitFlash : StReqFlash)
             -1-
-1-StatusTests
0CoveredT18,T11,T29
1CoveredT18,T11,T29

 LINE       273
 EXPRESSION (ack ? StIdle : StReqFlash)
             -1-
-1-StatusTests
0CoveredT18,T11,T29
1CoveredT18,T11,T29

 LINE       302
 EXPRESSION (req_o && ack)
             --1--    -2-
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT18,T11,T29
11CoveredT18,T11,T29

 LINE       304
 EXPRESSION (calc_req_o && calc_ack_i)
             -----1----    -----2----
-1--2-StatusTests
01CoveredT16,T12,T34
10CoveredT29,T33,T34
11CoveredT29,T33,T34

 LINE       307
 EXPRESSION (scramble_req_o && scramble_ack_i)
             -------1------    -------2------
-1--2-StatusTests
01CoveredT16,T34,T48
10CoveredT29,T33,T34
11CoveredT29,T33,T34

 LINE       355
 EXPRESSION (ecc_i ? ecc_data : ({{flash_phy_pkg::EccWidth {1'b1}}, ecc_data_in}))
             --1--
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       365
 EXPRESSION (req_i && ack_o && last_i)
             --1--    --2--    ---3--
-1--2--3-StatusTests
011Not Covered
101CoveredT18,T11,T29
110CoveredT18,T11,T29
111CoveredT18,T11,T29

 LINE       366
 EXPRESSION (txn_done ? '0 : (done ? ((done_cnt_q + 16'b1)) : done_cnt_q))
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT18,T11,T29

 LINE       366
 SUB-EXPRESSION (done ? ((done_cnt_q + 16'b1)) : done_cnt_q)
                 --1-
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT3,T16,T17

FSM Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[1].u_core.gen_prog_data.u_prog
Summary for FSM :: state_q
TotalCoveredPercent
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
statesLine No.CoveredTests
StCalcEcc 252 Covered T29,T33,T34
StCalcMask 237 Covered T29,T33,T34
StCalcPlainEcc 215 Covered T18,T11,T29
StDisabled 193 Covered T4,T5,T6
StIdle 273 Covered T1,T2,T3
StPackData 197 Covered T18,T11,T29
StPostPack 218 Covered T11,T30,T221
StPrePack 195 Covered T11,T30,T133
StReqFlash 237 Covered T18,T11,T29
StScrambleData 244 Covered T29,T33,T34
StWaitFlash 270 Covered T18,T11,T29


transitionsLine No.CoveredTests
StCalcEcc->StReqFlash 257 Covered T29,T33,T34
StCalcMask->StScrambleData 244 Covered T29,T33,T34
StCalcPlainEcc->StCalcMask 237 Covered T29,T33,T34
StCalcPlainEcc->StReqFlash 237 Covered T18,T11,T29
StIdle->StDisabled 193 Covered T4,T5,T6
StIdle->StPackData 197 Covered T18,T11,T29
StIdle->StPrePack 195 Covered T11,T30,T133
StPackData->StCalcPlainEcc 215 Covered T18,T11,T29
StPackData->StPostPack 218 Covered T11,T30,T221
StPostPack->StCalcPlainEcc 231 Covered T11,T30,T221
StPrePack->StPackData 205 Covered T11,T30,T133
StReqFlash->StIdle 273 Covered T18,T11,T29
StReqFlash->StWaitFlash 270 Covered T18,T11,T29
StScrambleData->StCalcEcc 252 Covered T29,T33,T34
StWaitFlash->StIdle 280 Covered T18,T11,T29



Branch Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[1].u_core.gen_prog_data.u_prog
Line No.TotalCoveredPercent
Branches 55 53 96.36
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 25 92.59
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-StatusTests
1 Covered T18,T11,T29
0 Covered T1,T2,T3


148 assign align_next = (idx > '0) ? (idx_sub_one == sel_i) : 1'b0; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T18,T11,T29
0 Covered T1,T2,T3


355 assign data_o = ecc_i ? ecc_data : {{EccWidth{1'b1}}, ecc_data_in}; -1- ==> ==>

Branches:
-1-StatusTests
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-StatusTests
1 - Covered T18,T11,T29
0 1 Covered T3,T16,T17
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-StatusTests
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-StatusTests
1 - - Covered T1,T2,T3
0 1 - Covered T18,T11,T29
0 0 1 Covered T18,T11,T29
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-StatusTests
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-StatusTests
StIdle 1 - - - - - - - - - - - - - - Covered T4,T5,T6
StIdle 0 1 - - - - - - - - - - - - - Covered T11,T30,T133
StIdle 0 0 1 - - - - - - - - - - - - Covered T18,T11,T29
StIdle 0 0 0 - - - - - - - - - - - - Covered T1,T2,T3
StPrePack - - - 1 - - - - - - - - - - - Covered T11,T30,T133
StPrePack - - - 0 - - - - - - - - - - - Not Covered
StPackData - - - - 1 - - - - - - - - - - Covered T18,T11,T29
StPackData - - - - 0 1 - - - - - - - - - Covered T11,T30,T221
StPackData - - - - 0 0 1 - - - - - - - - Covered T18,T11,T29
StPackData - - - - 0 0 0 - - - - - - - - Covered T18,T11,T29
StPostPack - - - - - - - 1 - - - - - - - Covered T11,T30,T221
StPostPack - - - - - - - 0 - - - - - - - Not Covered
StCalcPlainEcc - - - - - - - - 1 - - - - - - Covered T29,T33,T34
StCalcPlainEcc - - - - - - - - 0 - - - - - - Covered T18,T11,T29
StCalcMask - - - - - - - - - 1 - - - - - Covered T29,T33,T34
StCalcMask - - - - - - - - - 0 - - - - - Covered T29,T33,T34
StScrambleData - - - - - - - - - - 1 - - - - Covered T29,T33,T34
StScrambleData - - - - - - - - - - 0 - - - - Covered T29,T33,T34
StCalcEcc - - - - - - - - - - - - - - - Covered T29,T33,T34
StReqFlash - - - - - - - - - - - 1 1 - - Covered T18,T11,T29
StReqFlash - - - - - - - - - - - 1 0 - - Covered T18,T11,T29
StReqFlash - - - - - - - - - - - 0 - 1 - Covered T18,T11,T29
StReqFlash - - - - - - - - - - - 0 - 0 - Covered T18,T11,T29
StWaitFlash - - - - - - - - - - - - - - 1 Covered T18,T11,T29
StWaitFlash - - - - - - - - - - - - - - 0 Covered T18,T11,T29
StDisabled - - - - - - - - - - - - - - - Covered T4,T5,T6
default - - - - - - - - - - - - - - - Covered T13,T14,T15


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-StatusTests
1 - - - - Covered T1,T2,T3
0 1 - - - Covered T18,T11,T29
0 0 1 - - Covered T29,T33,T34
0 0 0 1 - Covered T29,T33,T34
0 0 0 0 1 Covered T18,T11,T29
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-StatusTests
1 - Covered T1,T2,T3
0 1 Covered T18,T11,T29
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-StatusTests
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
TotalAttemptedPercentSucceeded/MatchedPercent
Assertions 5 5 100.00 5 100.00
Cover properties 0 0 0
Cover sequences 0 0 0
Total 5 5 100.00 5 100.00




Assertion Details

NameAttemptsReal SuccessesFailuresIncomplete
OneDonePerTxn_A 399654659 1201078 0 0
PostPackRule_A 399654659 818 0 0
PrePackRule_A 399654659 550 0 0
WidthCheck_A 1053 1053 0 0
u_state_regs_A 399654659 398886840 0 0


OneDonePerTxn_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 399654659 1201078 0 0
T4 3500 0 0 0
T5 0 1 0 0
T6 0 1 0 0
T11 4608 5 0 0
T12 53469 0 0 0
T18 155603 42 0 0
T19 1837 0 0 0
T29 170507 588 0 0
T30 95166 36 0 0
T33 194745 525 0 0
T34 0 1 0 0
T58 0 117 0 0
T63 100229 225 0 0
T69 1511 0 0 0

PostPackRule_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 399654659 818 0 0
T11 4608 4 0 0
T12 53469 0 0 0
T25 72774 0 0 0
T26 0 2 0 0
T27 0 4 0 0
T29 170507 0 0 0
T30 95166 19 0 0
T33 194745 0 0 0
T34 1946 0 0 0
T48 62664 0 0 0
T63 100229 0 0 0
T64 0 14 0 0
T69 1511 0 0 0
T88 0 3 0 0
T145 0 2 0 0
T221 0 3 0 0
T222 0 1 0 0
T223 0 5 0 0

PrePackRule_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 399654659 550 0 0
T11 4608 1 0 0
T12 53469 0 0 0
T25 72774 0 0 0
T26 0 5 0 0
T27 0 2 0 0
T29 170507 0 0 0
T30 95166 15 0 0
T33 194745 0 0 0
T34 1946 0 0 0
T48 62664 0 0 0
T63 100229 0 0 0
T64 0 14 0 0
T69 1511 0 0 0
T88 0 1 0 0
T133 0 1 0 0
T145 0 2 0 0
T221 0 2 0 0
T222 0 1 0 0

WidthCheck_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 1053 1053 0 0
T1 1 1 0 0
T2 1 1 0 0
T3 1 1 0 0
T4 1 1 0 0
T10 1 1 0 0
T11 1 1 0 0
T16 1 1 0 0
T17 1 1 0 0
T18 1 1 0 0
T19 1 1 0 0

u_state_regs_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 399654659 398886840 0 0
T1 1430 1354 0 0
T2 2364 2275 0 0
T3 9069 9018 0 0
T4 3500 2826 0 0
T10 3756 3665 0 0
T11 4608 4523 0 0
T16 2282 2218 0 0
T17 1864 1787 0 0
T18 155603 155548 0 0
T19 1837 1746 0 0

0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%