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



Module Instance : tb.dut.u_otp_ctrl_scrmbl

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
98.33 91.67 100.00 100.00 100.00 100.00


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
96.92 81.50 100.00 100.00 100.00 100.00 100.00


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
96.19 94.16 96.15 97.04 96.43 97.18 dut


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
gen_anchor_digests[0].u_const_anchor_buf 0.00 0.00
gen_anchor_digests[0].u_iv_anchor_buf 0.00 0.00
gen_anchor_digests[1].u_const_anchor_buf 0.00 0.00
gen_anchor_digests[1].u_iv_anchor_buf 0.00 0.00
gen_anchor_digests[2].u_const_anchor_buf 0.00 0.00
gen_anchor_digests[2].u_iv_anchor_buf 0.00 0.00
gen_anchor_digests[3].u_const_anchor_buf 0.00 0.00
gen_anchor_digests[3].u_iv_anchor_buf 0.00 0.00
gen_anchor_keys[0].u_key_anchor_buf 0.00 0.00
gen_anchor_keys[1].u_key_anchor_buf 0.00 0.00
gen_anchor_keys[2].u_key_anchor_buf 0.00 0.00
u_prim_count 100.00 100.00
u_prim_present_dec 100.00 100.00 100.00 100.00 100.00
u_prim_present_enc 100.00 100.00 100.00 100.00 100.00
u_state_regs 100.00 100.00 100.00 100.00

Line Coverage for Module : otp_ctrl_scrmbl
Line No.TotalCoveredPercent
TOTAL12011091.67
ALWAYS1411000.00
CONT_ASSIGN19911100.00
CONT_ASSIGN20011100.00
CONT_ASSIGN20111100.00
CONT_ASSIGN20211100.00
CONT_ASSIGN20911100.00
CONT_ASSIGN21511100.00
CONT_ASSIGN22411100.00
CONT_ASSIGN23011100.00
CONT_ASSIGN23111100.00
CONT_ASSIGN23411100.00
CONT_ASSIGN28111100.00
ALWAYS3027575100.00
ALWAYS47633100.00
ALWAYS4792121100.00

140 always_comb begin : p_luts 141 0/1 ==> otp_enc_key_lut = '0; 142 0/1 ==> otp_dec_key_lut = '0; 143 0/1 ==> digest_const_lut = '0; 144 0/1 ==> digest_iv_lut = '0; 145 146 0/1 ==> for (int k = 0; k < NumScrmblKeys; k++) begin 147 localparam logic [4:0] NumRounds = 5'(unsigned'(NumPresentRounds)); 148 0/1 ==> otp_enc_key_lut[k] = rnd_cnst_key_anchor[k]; 149 // Due to the PRESENT key schedule, we have to step the key schedule function by 150 // NumPresentRounds forwards to get the decryption key. 151 0/1 ==> otp_dec_key_lut[k] = 152 prim_cipher_pkg::present_get_dec_key128(rnd_cnst_key_anchor[k], NumRounds); 153 end 154 155 0/1 ==> for (int k = 0; k < NumDigestSets; k++) begin 156 0/1 ==> digest_const_lut[k] = rnd_cnst_digest_anchor[k]; 157 0/1 ==> digest_iv_lut[k] = rnd_cnst_digest_iv_anchor[k]; 158 end 159 end 160 `ASSERT_KNOWN(EncKeyLutKnown_A, otp_enc_key_lut) 161 `ASSERT_KNOWN(DecKeyLutKnown_A, otp_dec_key_lut) 162 `ASSERT_KNOWN(DigestConstLutKnown_A, digest_const_lut) 163 `ASSERT_KNOWN(DigestIvLutKnown_A, digest_iv_lut) 164 165 ////////////// 166 // Datapath // 167 ////////////// 168 169 logic [4:0] idx_state_d, idx_state_q; 170 logic [ScrmblKeyWidth-1:0] key_state_d, key_state_q; 171 logic [ScrmblBlockWidth-1:0] data_state_d, data_state_q, data_shadow_q; 172 logic [ScrmblBlockWidth-1:0] digest_state_d, digest_state_q; 173 logic [ScrmblBlockWidth-1:0] enc_data_out, enc_data_out_xor, dec_data_out; 174 logic [ScrmblKeyWidth-1:0] dec_key_out, enc_key_out; 175 logic [4:0] dec_idx_out, enc_idx_out; 176 logic [ScrmblKeyWidth-1:0] otp_digest_const_mux, otp_enc_key_mux, otp_dec_key_mux; 177 logic [ScrmblBlockWidth-1:0] otp_digest_iv_mux; 178 179 typedef enum logic [2:0] {SelEncDataOut, 180 SelDecDataOut, 181 SelDigestState, 182 SelEncDataOutXor, 183 SelDataInput} data_state_sel_e; 184 185 typedef enum logic [2:0] {SelDecKeyOut, 186 SelEncKeyOut, 187 SelDecKeyInit, 188 SelEncKeyInit, 189 SelDigestConst, 190 SelDigestInput, 191 SelDigestChained} key_state_sel_e; 192 193 logic digest_init; 194 data_state_sel_e data_state_sel; 195 key_state_sel_e key_state_sel; 196 logic data_state_en, data_shadow_copy, data_shadow_load, digest_state_en, key_state_en; 197 digest_mode_e digest_mode_d, digest_mode_q; 198 199 1/1 assign otp_enc_key_mux = otp_enc_key_lut[ScrmblKeySelWidth'(sel_i)]; Tests: T1 T2 T3  200 1/1 assign otp_dec_key_mux = otp_dec_key_lut[ScrmblKeySelWidth'(sel_i)]; Tests: T1 T2 T3  201 1/1 assign otp_digest_const_mux = digest_const_lut[DigestSetSelWidth'(sel_i)]; Tests: T1 T2 T3  202 1/1 assign otp_digest_iv_mux = digest_iv_lut[DigestSetSelWidth'(sel_i)]; Tests: T1 T2 T3  203 204 // Make sure we always select a valid key / digest constant. 205 `ASSERT(CheckNumEncKeys_A, key_state_sel == SelEncKeyInit |-> sel_i < NumScrmblKeys) 206 `ASSERT(CheckNumDecKeys_A, key_state_sel == SelDecKeyInit |-> sel_i < NumScrmblKeys) 207 `ASSERT(CheckNumDigest1_A, key_state_sel == SelDigestConst |-> sel_i < NumDigestSets) 208 209 1/1 assign data_state_d = (data_state_sel == SelEncDataOut) ? enc_data_out : Tests: T1 T2 T3  210 (data_state_sel == SelDecDataOut) ? dec_data_out : 211 (data_state_sel == SelDigestState) ? digest_state_q : 212 (data_state_sel == SelEncDataOutXor) ? enc_data_out_xor : 213 data_i; 214 215 1/1 assign key_state_d = (key_state_sel == SelDecKeyOut) ? dec_key_out : Tests: T1 T2 T3  216 (key_state_sel == SelEncKeyOut) ? enc_key_out : 217 (key_state_sel == SelDecKeyInit) ? otp_dec_key_mux : 218 (key_state_sel == SelEncKeyInit) ? otp_enc_key_mux : 219 (key_state_sel == SelDigestConst) ? otp_digest_const_mux : 220 (key_state_sel == SelDigestChained) ? {data_state_q, data_shadow_q} : 221 {data_i, data_shadow_q}; 222 223 // Initialize the round index state with 1 in all cases, except for the decrypt operation. 224 1/1 assign idx_state_d = (key_state_sel == SelDecKeyOut) ? dec_idx_out : Tests: T1 T2 T3  225 (key_state_sel == SelEncKeyOut) ? enc_idx_out : 226 (key_state_sel == SelDecKeyInit) ? unsigned'(5'(NumPresentRounds)) : 227 5'd1; 228 229 // The XOR is for the Davies-Mayer one-way function construction. 230 1/1 assign enc_data_out_xor = enc_data_out ^ digest_state_q; Tests: T1 T2 T3  231 1/1 assign digest_state_d = (digest_init) ? otp_digest_iv_mux : enc_data_out_xor; Tests: T1 T2 T3  232 233 logic valid_q; //valid_d defined below 234 1/1 assign data_o = (valid_q) ? data_state_q : 0; Tests: T1 T2 T3  235 236 ///////// 237 // FSM // 238 ///////// 239 240 // SEC_CM: SCRMBL.FSM.SPARSE 241 // Encoding generated with: 242 // $ ./util/design/sparse-fsm-encode.py -d 5 -m 5 -n 9 \ 243 // -s 2193087944 --language=sv 244 // 245 // Hamming distance histogram: 246 // 247 // 0: -- 248 // 1: -- 249 // 2: -- 250 // 3: -- 251 // 4: -- 252 // 5: |||||||||||||||||||| (60.00%) 253 // 6: ||||||||||||| (40.00%) 254 // 7: -- 255 // 8: -- 256 // 9: -- 257 // 258 // Minimum Hamming distance: 5 259 // Maximum Hamming distance: 6 260 // Minimum Hamming weight: 4 261 // Maximum Hamming weight: 7 262 // 263 localparam int StateWidth = 9; 264 typedef enum logic [StateWidth-1:0] { 265 IdleSt = 9'b100011001, 266 DecryptSt = 9'b101101111, 267 EncryptSt = 9'b010010111, 268 DigestSt = 9'b111000010, 269 ErrorSt = 9'b011111000 270 } state_e; 271 272 localparam int CntWidth = $clog2(NumPresentRounds+1); 273 localparam int unsigned LastPresentRoundInt = NumPresentRounds - 1; 274 localparam bit [CntWidth-1:0] LastPresentRound = LastPresentRoundInt[CntWidth-1:0]; 275 276 state_e state_d, state_q; 277 logic [CntWidth-1:0] cnt; 278 logic cnt_clr, cnt_en, cnt_err; 279 logic valid_d; //valid_q defined above 280 281 1/1 assign valid_o = valid_q; Tests: T1 T2 T3  282 283 // SEC_CM: SCRMBL.CTR.REDUN 284 prim_count #( 285 .Width(CntWidth) 286 ) u_prim_count ( 287 .clk_i, 288 .rst_ni, 289 .clr_i(cnt_clr), 290 .set_i(1'b0), 291 .set_cnt_i('0), 292 .incr_en_i(cnt_en), 293 .decr_en_i(1'b0), 294 .step_i(CntWidth'(1)), 295 .commit_i(1'b1), 296 .cnt_o(cnt), 297 .cnt_after_commit_o(), 298 .err_o(cnt_err) 299 ); 300 301 always_comb begin : p_fsm 302 1/1 state_d = state_q; Tests: T1 T2 T3  303 1/1 digest_mode_d = digest_mode_q; Tests: T1 T2 T3  304 1/1 data_state_sel = SelDataInput; Tests: T1 T2 T3  305 1/1 key_state_sel = SelDigestInput; Tests: T1 T2 T3  306 1/1 digest_init = 1'b0; Tests: T1 T2 T3  307 1/1 data_state_en = 1'b0; Tests: T1 T2 T3  308 1/1 data_shadow_copy = 1'b0; Tests: T1 T2 T3  309 1/1 data_shadow_load = 1'b0; Tests: T1 T2 T3  310 1/1 key_state_en = 1'b0; Tests: T1 T2 T3  311 1/1 digest_state_en = 1'b0; Tests: T1 T2 T3  312 1/1 cnt_en = 1'b0; Tests: T1 T2 T3  313 1/1 cnt_clr = 1'b0; Tests: T1 T2 T3  314 1/1 valid_d = 1'b0; Tests: T1 T2 T3  315 1/1 ready_o = 1'b0; Tests: T1 T2 T3  316 1/1 fsm_err_o = 1'b0; Tests: T1 T2 T3  317 318 1/1 unique case (state_q) Tests: T1 T2 T3  319 /////////////////////////////////////////////////////////////////// 320 // Idle State: decode command and 321 // load working regs accordingly 322 IdleSt: begin 323 1/1 cnt_clr = 1'b1; Tests: T1 T2 T3  324 1/1 ready_o = 1'b1; Tests: T1 T2 T3  325 326 1/1 if (valid_i) begin Tests: T1 T2 T3  327 1/1 unique case (cmd_i) Tests: T1 T2 T3  328 Decrypt: begin 329 1/1 state_d = DecryptSt; Tests: T1 T2 T3  330 1/1 key_state_sel = SelDecKeyInit; Tests: T1 T2 T3  331 1/1 data_state_en = 1'b1; Tests: T1 T2 T3  332 1/1 key_state_en = 1'b1; Tests: T1 T2 T3  333 end 334 Encrypt: begin 335 1/1 state_d = EncryptSt; Tests: T1 T2 T3  336 1/1 key_state_sel = SelEncKeyInit; Tests: T1 T2 T3  337 1/1 data_state_en = 1'b1; Tests: T1 T2 T3  338 1/1 key_state_en = 1'b1; Tests: T1 T2 T3  339 end 340 LoadShadow: begin 341 1/1 if (digest_mode_q == ChainedMode) begin Tests: T1 T2 T3  342 1/1 data_shadow_copy = 1'b1; Tests: T1 T2 T3  343 end else begin 344 1/1 data_shadow_load = 1'b1; Tests: T1 T2 T3  345 end 346 end 347 Digest: begin 348 1/1 state_d = DigestSt; Tests: T1 T2 T3  349 1/1 data_state_sel = SelDigestState; Tests: T1 T2 T3  350 1/1 key_state_sel = (digest_mode_q == ChainedMode) ? SelDigestChained : SelDigestInput; Tests: T1 T2 T3  351 1/1 data_state_en = 1'b1; Tests: T1 T2 T3  352 1/1 key_state_en = 1'b1; Tests: T1 T2 T3  353 end 354 DigestInit: begin 355 1/1 digest_mode_d = mode_i; Tests: T1 T2 T3  356 1/1 digest_init = 1'b1; Tests: T1 T2 T3  357 1/1 digest_state_en = 1'b1; Tests: T1 T2 T3  358 end 359 DigestFinalize: begin 360 1/1 state_d = DigestSt; Tests: T1 T2 T3  361 1/1 data_state_sel = SelDigestState; Tests: T1 T2 T3  362 1/1 key_state_sel = SelDigestConst; Tests: T1 T2 T3  363 1/1 data_state_en = 1'b1; Tests: T1 T2 T3  364 1/1 key_state_en = 1'b1; Tests: T1 T2 T3  365 1/1 digest_mode_d = StandardMode; Tests: T1 T2 T3  366 end 367 default: ; // ignore 368 endcase // cmd_i 369 end MISSING_ELSE 370 end 371 /////////////////////////////////////////////////////////////////// 372 // Perform decrypt rounds. 373 DecryptSt: begin 374 1/1 data_state_sel = SelDecDataOut; Tests: T1 T2 T3  375 1/1 key_state_sel = SelDecKeyOut; Tests: T1 T2 T3  376 1/1 data_state_en = 1'b1; Tests: T1 T2 T3  377 1/1 key_state_en = 1'b1; Tests: T1 T2 T3  378 1/1 cnt_en = 1'b1; Tests: T1 T2 T3  379 1/1 if (cnt == LastPresentRound) begin Tests: T1 T2 T3  380 1/1 state_d = IdleSt; Tests: T1 T2 T3  381 1/1 valid_d = 1'b1; Tests: T1 T2 T3  382 end MISSING_ELSE 383 end 384 /////////////////////////////////////////////////////////////////// 385 // Perform encrypt rounds. 386 EncryptSt: begin 387 1/1 data_state_sel = SelEncDataOut; Tests: T1 T2 T3  388 1/1 key_state_sel = SelEncKeyOut; Tests: T1 T2 T3  389 1/1 data_state_en = 1'b1; Tests: T1 T2 T3  390 1/1 key_state_en = 1'b1; Tests: T1 T2 T3  391 1/1 cnt_en = 1'b1; Tests: T1 T2 T3  392 1/1 if (cnt == LastPresentRound) begin Tests: T1 T2 T3  393 1/1 state_d = IdleSt; Tests: T1 T2 T3  394 1/1 valid_d = 1'b1; Tests: T1 T2 T3  395 end MISSING_ELSE 396 end 397 /////////////////////////////////////////////////////////////////// 398 // The digest is calculated with a Merkle-Damgard construction that 399 // employs the PRESENT encryption datapath. 400 DigestSt: begin 401 1/1 data_state_sel = SelEncDataOut; Tests: T1 T2 T3  402 1/1 key_state_sel = SelEncKeyOut; Tests: T1 T2 T3  403 1/1 data_state_en = 1'b1; Tests: T1 T2 T3  404 1/1 key_state_en = 1'b1; Tests: T1 T2 T3  405 1/1 cnt_en = 1'b1; Tests: T1 T2 T3  406 1/1 if (cnt == LastPresentRound) begin Tests: T1 T2 T3  407 1/1 state_d = IdleSt; Tests: T1 T2 T3  408 1/1 valid_d = 1'b1; Tests: T1 T2 T3  409 // Apply XOR for Davies-Meyer construction. 410 1/1 data_state_sel = SelEncDataOutXor; Tests: T1 T2 T3  411 // Backup digest state for next round of updates. We can't keep this state in the 412 // data state register as a digest may be calculated together with encryption 413 // operations in an interleaved way. 414 1/1 digest_state_en = 1'b1; Tests: T1 T2 T3  415 end MISSING_ELSE 416 end 417 /////////////////////////////////////////////////////////////////// 418 // Terminal error state. This raises an alert. 419 ErrorSt: begin 420 1/1 fsm_err_o = 1'b1; Tests: T12 T94 T128  421 end 422 /////////////////////////////////////////////////////////////////// 423 // This should never happen, hence we directly jump into the 424 // error state, where an alert will be triggered. 425 default: begin 426 state_d = ErrorSt; 427 fsm_err_o = 1'b1; 428 end 429 /////////////////////////////////////////////////////////////////// 430 endcase // state_q 431 432 // Unconditionally jump into the terminal error state in case of escalation. 433 // SEC_CM: SCRMBL.FSM.LOCAL_ESC, SCRMBL.FSM.GLOBAL_ESC 434 1/1 if (lc_ctrl_pkg::lc_tx_test_true_loose(escalate_en_i) || cnt_err) begin Tests: T1 T2 T3  435 1/1 state_d = ErrorSt; Tests: T12 T94 T128  436 1/1 fsm_err_o = 1'b1; Tests: T12 T94 T128  437 end MISSING_ELSE 438 end 439 440 ///////////////////////////// 441 // PRESENT DEC/ENC Modules // 442 ///////////////////////////// 443 444 prim_present #( 445 .KeyWidth(128), 446 .NumRounds(NumPresentRounds), 447 .NumPhysRounds(1) 448 ) u_prim_present_enc ( 449 .data_i ( data_state_q ), 450 .key_i ( key_state_q ), 451 .idx_i ( idx_state_q ), 452 .data_o ( enc_data_out ), 453 .key_o ( enc_key_out ), 454 .idx_o ( enc_idx_out ) 455 ); 456 457 prim_present #( 458 .KeyWidth(128), 459 // We are using an iterative full-round implementation here. 460 .NumRounds(NumPresentRounds), 461 .NumPhysRounds(1), 462 .Decrypt(1) 463 ) u_prim_present_dec ( 464 .data_i ( data_state_q ), 465 .key_i ( key_state_q ), 466 .idx_i ( idx_state_q ), 467 .data_o ( dec_data_out ), 468 .key_o ( dec_key_out ), 469 .idx_o ( dec_idx_out ) 470 ); 471 472 /////////////// 473 // Registers // 474 /////////////// 475 476 3/3 `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, IdleSt) Tests: T1 T2 T3  | T1 T2 T3  | T1 T2 T3 
PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, IdleSt): 476.1 `ifdef SIMULATION 476.2 prim_sparse_fsm_flop #( 476.3 .StateEnumT(state_e), 476.4 .Width($bits(state_e)), 476.5 .ResetValue($bits(state_e)'(IdleSt)), 476.6 .EnableAlertTriggerSVA(1), 476.7 .CustomForceName("state_q") 476.8 ) u_state_regs ( 476.9 .clk_i ( clk_i ), 476.10 .rst_ni ( rst_ni ), 476.11 .state_i ( state_d ), 476.12 .state_o ( ) 476.13 ); 476.14 always_ff @(posedge clk_i or negedge rst_ni) begin 476.15 1/1 if (!rst_ni) begin Tests: T1 T2 T3  476.16 1/1 state_q <= IdleSt; Tests: T1 T2 T3  476.17 end else begin 476.18 1/1 state_q <= state_d; Tests: T1 T2 T3  476.19 end 476.20 end 476.21 u_state_regs_A: assert property (@(posedge clk_i) disable iff ((!rst_ni) !== '0) (state_q === u_state_regs.state_o)) 476.22 else begin 476.23 `ifdef UVM 476.24 uvm_pkg::uvm_report_error("ASSERT FAILED", "u_state_regs_A", uvm_pkg::UVM_NONE, 476.25 "../src/lowrisc_ip_otp_ctrl_1.0/rtl/otp_ctrl_scrmbl.sv", 476, "", 1); 476.26 `else 476.27 $error("%0t: (%0s:%0d) [%m] [ASSERT FAILED] %0s", $time, `__FILE__, `__LINE__, 476.28 `PRIM_STRINGIFY(u_state_regs_A)); 476.29 `endif 476.30 end 476.31 `else 476.32 prim_sparse_fsm_flop #( 476.33 .StateEnumT(state_e), 476.34 .Width($bits(state_e)), 476.35 .ResetValue($bits(state_e)'(IdleSt)), 476.36 .EnableAlertTriggerSVA(1) 476.37 ) u_state_regs ( 476.38 .clk_i ( `PRIM_FLOP_CLK ), 476.39 .rst_ni ( `PRIM_FLOP_RST ), 476.40 .state_i ( state_d ), 476.41 .state_o ( state_q ) 476.42 ); 476.43 `endif477 478 always_ff @(posedge clk_i or negedge rst_ni) begin : p_regs 479 1/1 if (!rst_ni) begin Tests: T1 T2 T3  480 1/1 key_state_q <= '0; Tests: T1 T2 T3  481 1/1 idx_state_q <= '0; Tests: T1 T2 T3  482 1/1 data_state_q <= '0; Tests: T1 T2 T3  483 1/1 data_shadow_q <= '0; Tests: T1 T2 T3  484 1/1 digest_state_q <= '0; Tests: T1 T2 T3  485 1/1 valid_q <= 1'b0; Tests: T1 T2 T3  486 1/1 digest_mode_q <= StandardMode; Tests: T1 T2 T3  487 end else begin 488 1/1 valid_q <= valid_d; Tests: T1 T2 T3  489 1/1 digest_mode_q <= digest_mode_d; Tests: T1 T2 T3  490 491 // enable regs 492 1/1 if (key_state_en) begin Tests: T1 T2 T3  493 1/1 key_state_q <= key_state_d; Tests: T1 T2 T3  494 1/1 idx_state_q <= idx_state_d; Tests: T1 T2 T3  495 end MISSING_ELSE 496 1/1 if (data_state_en) begin Tests: T1 T2 T3  497 1/1 data_state_q <= data_state_d; Tests: T1 T2 T3  498 end MISSING_ELSE 499 1/1 if (data_shadow_copy) begin Tests: T1 T2 T3  500 1/1 data_shadow_q <= data_state_q; Tests: T1 T2 T3  501 1/1 end else if (data_shadow_load) begin Tests: T1 T2 T3  502 1/1 data_shadow_q <= data_state_d; Tests: T1 T2 T3  503 end MISSING_ELSE 504 1/1 if (digest_state_en) begin Tests: T1 T2 T3  505 1/1 digest_state_q <= digest_state_d; Tests: T1 T2 T3  506 end MISSING_ELSE

Cond Coverage for Module : otp_ctrl_scrmbl
TotalCoveredPercent
Conditions6868100.00
Logical6868100.00
Non-Logical00
Event00

 LINE       209
 EXPRESSION 
 Number  Term
      1  (data_state_sel == SelEncDataOut) ? enc_data_out : ((data_state_sel == SelDecDataOut) ? dec_data_out : ((data_state_sel == SelDigestState) ? digest_state_q : ((data_state_sel == SelEncDataOutXor) ? enc_data_out_xor : data_i))))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       209
 SUB-EXPRESSION (data_state_sel == SelEncDataOut)
                ----------------1----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       209
 SUB-EXPRESSION 
 Number  Term
      1  (data_state_sel == SelDecDataOut) ? dec_data_out : ((data_state_sel == SelDigestState) ? digest_state_q : ((data_state_sel == SelEncDataOutXor) ? enc_data_out_xor : data_i)))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       209
 SUB-EXPRESSION (data_state_sel == SelDecDataOut)
                ----------------1----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       209
 SUB-EXPRESSION ((data_state_sel == SelDigestState) ? digest_state_q : ((data_state_sel == SelEncDataOutXor) ? enc_data_out_xor : data_i))
                 -----------------1----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       209
 SUB-EXPRESSION (data_state_sel == SelDigestState)
                -----------------1----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       209
 SUB-EXPRESSION ((data_state_sel == SelEncDataOutXor) ? enc_data_out_xor : data_i)
                 ------------------1-----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       209
 SUB-EXPRESSION (data_state_sel == SelEncDataOutXor)
                ------------------1-----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 EXPRESSION 
 Number  Term
      1  (key_state_sel == SelDecKeyOut) ? dec_key_out : ((key_state_sel == SelEncKeyOut) ? enc_key_out : ((key_state_sel == SelDecKeyInit) ? otp_dec_key_mux : ((key_state_sel == SelEncKeyInit) ? otp_enc_key_mux : ((key_state_sel == SelDigestConst) ? otp_digest_const_mux : ((key_state_sel == SelDigestChained) ? ({data_state_q, data_shadow_q}) : ({data_i, data_shadow_q})))))))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION (key_state_sel == SelDecKeyOut)
                ---------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION 
 Number  Term
      1  (key_state_sel == SelEncKeyOut) ? enc_key_out : ((key_state_sel == SelDecKeyInit) ? otp_dec_key_mux : ((key_state_sel == SelEncKeyInit) ? otp_enc_key_mux : ((key_state_sel == SelDigestConst) ? otp_digest_const_mux : ((key_state_sel == SelDigestChained) ? ({data_state_q, data_shadow_q}) : ({data_i, data_shadow_q}))))))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION (key_state_sel == SelEncKeyOut)
                ---------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION 
 Number  Term
      1  (key_state_sel == SelDecKeyInit) ? otp_dec_key_mux : ((key_state_sel == SelEncKeyInit) ? otp_enc_key_mux : ((key_state_sel == SelDigestConst) ? otp_digest_const_mux : ((key_state_sel == SelDigestChained) ? ({data_state_q, data_shadow_q}) : ({data_i, data_shadow_q})))))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION (key_state_sel == SelDecKeyInit)
                ----------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION 
 Number  Term
      1  (key_state_sel == SelEncKeyInit) ? otp_enc_key_mux : ((key_state_sel == SelDigestConst) ? otp_digest_const_mux : ((key_state_sel == SelDigestChained) ? ({data_state_q, data_shadow_q}) : ({data_i, data_shadow_q}))))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION (key_state_sel == SelEncKeyInit)
                ----------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION 
 Number  Term
      1  (key_state_sel == SelDigestConst) ? otp_digest_const_mux : ((key_state_sel == SelDigestChained) ? ({data_state_q, data_shadow_q}) : ({data_i, data_shadow_q})))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION (key_state_sel == SelDigestConst)
                ----------------1----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION ((key_state_sel == SelDigestChained) ? ({data_state_q, data_shadow_q}) : ({data_i, data_shadow_q}))
                 -----------------1-----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION (key_state_sel == SelDigestChained)
                -----------------1-----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       224
 EXPRESSION 
 Number  Term
      1  (key_state_sel == SelDecKeyOut) ? dec_idx_out : ((key_state_sel == SelEncKeyOut) ? enc_idx_out : ((key_state_sel == SelDecKeyInit) ? ((unsigned'(5'(otp_ctrl_pkg::NumPresentRounds)))) : 5'b1)))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       224
 SUB-EXPRESSION (key_state_sel == SelDecKeyOut)
                ---------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       224
 SUB-EXPRESSION ((key_state_sel == SelEncKeyOut) ? enc_idx_out : ((key_state_sel == SelDecKeyInit) ? ((unsigned'(5'(otp_ctrl_pkg::NumPresentRounds)))) : 5'b1))
                 ---------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       224
 SUB-EXPRESSION (key_state_sel == SelEncKeyOut)
                ---------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       224
 SUB-EXPRESSION ((key_state_sel == SelDecKeyInit) ? ((unsigned'(5'(otp_ctrl_pkg::NumPresentRounds)))) : 5'b1)
                 ----------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       224
 SUB-EXPRESSION (key_state_sel == SelDecKeyInit)
                ----------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       231
 EXPRESSION (digest_init ? otp_digest_iv_mux : enc_data_out_xor)
             -----1-----
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       234
 EXPRESSION (valid_q ? data_state_q : 0)
             ---1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       341
 EXPRESSION (digest_mode_q == ChainedMode)
            ---------------1--------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       350
 EXPRESSION ((digest_mode_q == ChainedMode) ? SelDigestChained : SelDigestInput)
             ---------------1--------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       350
 SUB-EXPRESSION (digest_mode_q == ChainedMode)
                ---------------1--------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       379
 EXPRESSION (cnt == LastPresentRound)
            ------------1------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       392
 EXPRESSION (cnt == LastPresentRound)
            ------------1------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       406
 EXPRESSION (cnt == LastPresentRound)
            ------------1------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

FSM Coverage for Module : otp_ctrl_scrmbl
Summary for FSM :: state_q
TotalCoveredPercent
States 5 5 100.00 (Not included in score)
Transitions 10 10 100.00
Sequences 0 0

State, Transition and Sequence Details for FSM :: state_q
statesLine No.CoveredTests
DecryptSt 329 Covered T1,T2,T3
DigestSt 348 Covered T1,T2,T3
EncryptSt 335 Covered T1,T2,T3
ErrorSt 435 Covered T12,T94,T128
IdleSt 380 Covered T1,T2,T3


transitionsLine No.CoveredTests
DecryptSt->ErrorSt 435 Covered T97,T297,T143
DecryptSt->IdleSt 380 Covered T1,T2,T3
DigestSt->ErrorSt 435 Covered T155,T263,T152
DigestSt->IdleSt 407 Covered T1,T2,T3
EncryptSt->ErrorSt 435 Covered T281,T139,T136
EncryptSt->IdleSt 393 Covered T1,T2,T3
IdleSt->DecryptSt 329 Covered T1,T2,T3
IdleSt->DigestSt 348 Covered T1,T2,T3
IdleSt->EncryptSt 335 Covered T1,T2,T3
IdleSt->ErrorSt 435 Covered T12,T94,T128



Branch Coverage for Module : otp_ctrl_scrmbl
Line No.TotalCoveredPercent
Branches 52 51 98.08
TERNARY 209 5 5 100.00
TERNARY 215 7 7 100.00
TERNARY 224 4 4 100.00
TERNARY 231 2 2 100.00
TERNARY 234 2 2 100.00
CASE 318 18 17 94.44
IF 434 2 2 100.00
IF 476 2 2 100.00
IF 479 10 10 100.00


209 assign data_state_d = (data_state_sel == SelEncDataOut) ? enc_data_out : -1- ==> 210 (data_state_sel == SelDecDataOut) ? dec_data_out : -2- ==> 211 (data_state_sel == SelDigestState) ? digest_state_q : -3- ==> 212 (data_state_sel == SelEncDataOutXor) ? enc_data_out_xor : -4- ==> ==>

Branches:
-1--2--3--4-StatusTests
1 - - - Covered T1,T2,T3
0 1 - - Covered T1,T2,T3
0 0 1 - Covered T1,T2,T3
0 0 0 1 Covered T1,T2,T3
0 0 0 0 Covered T1,T2,T3


215 assign key_state_d = (key_state_sel == SelDecKeyOut) ? dec_key_out : -1- ==> 216 (key_state_sel == SelEncKeyOut) ? enc_key_out : -2- ==> 217 (key_state_sel == SelDecKeyInit) ? otp_dec_key_mux : -3- ==> 218 (key_state_sel == SelEncKeyInit) ? otp_enc_key_mux : -4- ==> 219 (key_state_sel == SelDigestConst) ? otp_digest_const_mux : -5- ==> 220 (key_state_sel == SelDigestChained) ? {data_state_q, data_shadow_q} : -6- ==> ==>

Branches:
-1--2--3--4--5--6-StatusTests
1 - - - - - Covered T1,T2,T3
0 1 - - - - Covered T1,T2,T3
0 0 1 - - - Covered T1,T2,T3
0 0 0 1 - - Covered T1,T2,T3
0 0 0 0 1 - Covered T1,T2,T3
0 0 0 0 0 1 Covered T1,T2,T3
0 0 0 0 0 0 Covered T1,T2,T3


224 assign idx_state_d = (key_state_sel == SelDecKeyOut) ? dec_idx_out : -1- ==> 225 (key_state_sel == SelEncKeyOut) ? enc_idx_out : -2- ==> 226 (key_state_sel == SelDecKeyInit) ? unsigned'(5'(NumPresentRounds)) : -3- ==> ==>

Branches:
-1--2--3-StatusTests
1 - - Covered T1,T2,T3
0 1 - Covered T1,T2,T3
0 0 1 Covered T1,T2,T3
0 0 0 Covered T1,T2,T3


231 assign digest_state_d = (digest_init) ? otp_digest_iv_mux : enc_data_out_xor; -1- ==> ==>

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


234 assign data_o = (valid_q) ? data_state_q : 0; -1- ==> ==>

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


318 unique case (state_q) -1- 319 /////////////////////////////////////////////////////////////////// 320 // Idle State: decode command and 321 // load working regs accordingly 322 IdleSt: begin 323 cnt_clr = 1'b1; 324 ready_o = 1'b1; 325 326 if (valid_i) begin -2- 327 unique case (cmd_i) -3- 328 Decrypt: begin 329 state_d = DecryptSt; ==> 330 key_state_sel = SelDecKeyInit; 331 data_state_en = 1'b1; 332 key_state_en = 1'b1; 333 end 334 Encrypt: begin 335 state_d = EncryptSt; ==> 336 key_state_sel = SelEncKeyInit; 337 data_state_en = 1'b1; 338 key_state_en = 1'b1; 339 end 340 LoadShadow: begin 341 if (digest_mode_q == ChainedMode) begin -4- 342 data_shadow_copy = 1'b1; ==> 343 end else begin 344 data_shadow_load = 1'b1; ==> 345 end 346 end 347 Digest: begin 348 state_d = DigestSt; 349 data_state_sel = SelDigestState; 350 key_state_sel = (digest_mode_q == ChainedMode) ? SelDigestChained : SelDigestInput; -5- ==> ==> 351 data_state_en = 1'b1; 352 key_state_en = 1'b1; 353 end 354 DigestInit: begin 355 digest_mode_d = mode_i; ==> 356 digest_init = 1'b1; 357 digest_state_en = 1'b1; 358 end 359 DigestFinalize: begin 360 state_d = DigestSt; ==> 361 data_state_sel = SelDigestState; 362 key_state_sel = SelDigestConst; 363 data_state_en = 1'b1; 364 key_state_en = 1'b1; 365 digest_mode_d = StandardMode; 366 end 367 default: ; // ignore ==> 368 endcase // cmd_i 369 end MISSING_ELSE ==> 370 end 371 /////////////////////////////////////////////////////////////////// 372 // Perform decrypt rounds. 373 DecryptSt: begin 374 data_state_sel = SelDecDataOut; 375 key_state_sel = SelDecKeyOut; 376 data_state_en = 1'b1; 377 key_state_en = 1'b1; 378 cnt_en = 1'b1; 379 if (cnt == LastPresentRound) begin -6- 380 state_d = IdleSt; ==> 381 valid_d = 1'b1; 382 end MISSING_ELSE ==> 383 end 384 /////////////////////////////////////////////////////////////////// 385 // Perform encrypt rounds. 386 EncryptSt: begin 387 data_state_sel = SelEncDataOut; 388 key_state_sel = SelEncKeyOut; 389 data_state_en = 1'b1; 390 key_state_en = 1'b1; 391 cnt_en = 1'b1; 392 if (cnt == LastPresentRound) begin -7- 393 state_d = IdleSt; ==> 394 valid_d = 1'b1; 395 end MISSING_ELSE ==> 396 end 397 /////////////////////////////////////////////////////////////////// 398 // The digest is calculated with a Merkle-Damgard construction that 399 // employs the PRESENT encryption datapath. 400 DigestSt: begin 401 data_state_sel = SelEncDataOut; 402 key_state_sel = SelEncKeyOut; 403 data_state_en = 1'b1; 404 key_state_en = 1'b1; 405 cnt_en = 1'b1; 406 if (cnt == LastPresentRound) begin -8- 407 state_d = IdleSt; ==> 408 valid_d = 1'b1; 409 // Apply XOR for Davies-Meyer construction. 410 data_state_sel = SelEncDataOutXor; 411 // Backup digest state for next round of updates. We can't keep this state in the 412 // data state register as a digest may be calculated together with encryption 413 // operations in an interleaved way. 414 digest_state_en = 1'b1; 415 end MISSING_ELSE ==> 416 end 417 /////////////////////////////////////////////////////////////////// 418 // Terminal error state. This raises an alert. 419 ErrorSt: begin 420 fsm_err_o = 1'b1; ==> 421 end 422 /////////////////////////////////////////////////////////////////// 423 // This should never happen, hence we directly jump into the 424 // error state, where an alert will be triggered. 425 default: begin 426 state_d = ErrorSt; ==>

Branches:
-1--2--3--4--5--6--7--8-StatusTests
IdleSt 1 Decrypt - - - - - Covered T1,T2,T3
IdleSt 1 Encrypt - - - - - Covered T1,T2,T3
IdleSt 1 LoadShadow 1 - - - - Covered T1,T2,T3
IdleSt 1 LoadShadow 0 - - - - Covered T1,T2,T3
IdleSt 1 Digest - 1 - - - Covered T1,T2,T3
IdleSt 1 Digest - 0 - - - Covered T1,T2,T3
IdleSt 1 DigestInit - - - - - Covered T1,T2,T3
IdleSt 1 DigestFinalize - - - - - Covered T1,T2,T3
IdleSt 1 default - - - - - Not Covered
IdleSt 0 - - - - - - Covered T1,T2,T3
DecryptSt - - - - 1 - - Covered T1,T2,T3
DecryptSt - - - - 0 - - Covered T1,T2,T3
EncryptSt - - - - - 1 - Covered T1,T2,T3
EncryptSt - - - - - 0 - Covered T1,T2,T3
DigestSt - - - - - - 1 Covered T1,T2,T3
DigestSt - - - - - - 0 Covered T1,T2,T3
ErrorSt - - - - - - - Covered T12,T94,T128
default - - - - - - - Covered T22,T23,T24


434 if (lc_ctrl_pkg::lc_tx_test_true_loose(escalate_en_i) || cnt_err) begin -1- 435 state_d = ErrorSt; ==> 436 fsm_err_o = 1'b1; 437 end MISSING_ELSE ==>

Branches:
-1-StatusTests
1 Covered T12,T94,T128
0 Covered T1,T2,T3


476 `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, IdleSt) -1- ==> ==>

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


479 if (!rst_ni) begin -1- 480 key_state_q <= '0; ==> 481 idx_state_q <= '0; 482 data_state_q <= '0; 483 data_shadow_q <= '0; 484 digest_state_q <= '0; 485 valid_q <= 1'b0; 486 digest_mode_q <= StandardMode; 487 end else begin 488 valid_q <= valid_d; 489 digest_mode_q <= digest_mode_d; 490 491 // enable regs 492 if (key_state_en) begin -2- 493 key_state_q <= key_state_d; ==> 494 idx_state_q <= idx_state_d; 495 end MISSING_ELSE ==> 496 if (data_state_en) begin -3- 497 data_state_q <= data_state_d; ==> 498 end MISSING_ELSE ==> 499 if (data_shadow_copy) begin -4- 500 data_shadow_q <= data_state_q; ==> 501 end else if (data_shadow_load) begin -5- 502 data_shadow_q <= data_state_d; ==> 503 end MISSING_ELSE ==> 504 if (digest_state_en) begin -6- 505 digest_state_q <= digest_state_d; ==> 506 end MISSING_ELSE ==>

Branches:
-1--2--3--4--5--6-StatusTests
1 - - - - - Covered T1,T2,T3
0 1 - - - - Covered T1,T2,T3
0 0 - - - - Covered T1,T2,T3
0 - 1 - - - Covered T1,T2,T3
0 - 0 - - - Covered T1,T2,T3
0 - - 1 - - Covered T1,T2,T3
0 - - 0 1 - Covered T1,T2,T3
0 - - 0 0 - Covered T1,T2,T3
0 - - - - 1 Covered T1,T2,T3
0 - - - - 0 Covered T1,T2,T3


Assert Coverage for Module : otp_ctrl_scrmbl
TotalAttemptedPercentSucceeded/MatchedPercent
Assertions 9 9 100.00 9 100.00
Cover properties 0 0 0
Cover sequences 0 0 0
Total 9 9 100.00 9 100.00




Assertion Details

NameAttemptsReal SuccessesFailuresIncomplete
CheckNumDecKeys_A 87543204 237398 0 0
CheckNumDigest1_A 87543204 120391 0 0
CheckNumEncKeys_A 87543204 252150 0 0
DecKeyLutKnown_A 87543204 86701732 0 0
DigestConstLutKnown_A 87543204 86701732 0 0
DigestIvLutKnown_A 87543204 86701732 0 0
EncKeyLutKnown_A 87543204 86701732 0 0
NumMaxPresentRounds_A 1124 1124 0 0
u_state_regs_A 87543204 86701732 0 0


CheckNumDecKeys_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 87543204 237398 0 0
T1 5432 24 0 0
T2 10698 46 0 0
T3 25481 107 0 0
T4 10281 35 0 0
T5 4680 24 0 0
T6 40011 196 0 0
T7 36446 240 0 0
T11 6282 24 0 0
T12 98597 51 0 0
T13 28315 114 0 0

CheckNumDigest1_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 87543204 120391 0 0
T1 5432 5 0 0
T2 10698 12 0 0
T3 25481 71 0 0
T4 10281 5 0 0
T5 4680 7 0 0
T6 40011 129 0 0
T7 36446 101 0 0
T11 6282 5 0 0
T12 98597 10 0 0
T13 28315 58 0 0

CheckNumEncKeys_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 87543204 252150 0 0
T1 5432 24 0 0
T2 10698 32 0 0
T3 25481 102 0 0
T4 10281 32 0 0
T5 4680 24 0 0
T6 40011 264 0 0
T7 36446 238 0 0
T11 6282 24 0 0
T12 98597 55 0 0
T13 28315 101 0 0

DecKeyLutKnown_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 87543204 86701732 0 0
T1 5432 5382 0 0
T2 10698 10452 0 0
T3 25481 25010 0 0
T4 10281 10014 0 0
T5 4680 4619 0 0
T6 40011 39222 0 0
T7 36446 35679 0 0
T11 6282 6220 0 0
T12 98597 98413 0 0
T13 28315 27844 0 0

DigestConstLutKnown_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 87543204 86701732 0 0
T1 5432 5382 0 0
T2 10698 10452 0 0
T3 25481 25010 0 0
T4 10281 10014 0 0
T5 4680 4619 0 0
T6 40011 39222 0 0
T7 36446 35679 0 0
T11 6282 6220 0 0
T12 98597 98413 0 0
T13 28315 27844 0 0

DigestIvLutKnown_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 87543204 86701732 0 0
T1 5432 5382 0 0
T2 10698 10452 0 0
T3 25481 25010 0 0
T4 10281 10014 0 0
T5 4680 4619 0 0
T6 40011 39222 0 0
T7 36446 35679 0 0
T11 6282 6220 0 0
T12 98597 98413 0 0
T13 28315 27844 0 0

EncKeyLutKnown_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 87543204 86701732 0 0
T1 5432 5382 0 0
T2 10698 10452 0 0
T3 25481 25010 0 0
T4 10281 10014 0 0
T5 4680 4619 0 0
T6 40011 39222 0 0
T7 36446 35679 0 0
T11 6282 6220 0 0
T12 98597 98413 0 0
T13 28315 27844 0 0

NumMaxPresentRounds_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 1124 1124 0 0
T1 1 1 0 0
T2 1 1 0 0
T3 1 1 0 0
T4 1 1 0 0
T5 1 1 0 0
T6 1 1 0 0
T7 1 1 0 0
T11 1 1 0 0
T12 1 1 0 0
T13 1 1 0 0

u_state_regs_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 87543204 86701732 0 0
T1 5432 5382 0 0
T2 10698 10452 0 0
T3 25481 25010 0 0
T4 10281 10014 0 0
T5 4680 4619 0 0
T6 40011 39222 0 0
T7 36446 35679 0 0
T11 6282 6220 0 0
T12 98597 98413 0 0
T13 28315 27844 0 0

Line Coverage for Instance : tb.dut.u_otp_ctrl_scrmbl
Line No.TotalCoveredPercent
TOTAL12011091.67
ALWAYS1411000.00
CONT_ASSIGN19911100.00
CONT_ASSIGN20011100.00
CONT_ASSIGN20111100.00
CONT_ASSIGN20211100.00
CONT_ASSIGN20911100.00
CONT_ASSIGN21511100.00
CONT_ASSIGN22411100.00
CONT_ASSIGN23011100.00
CONT_ASSIGN23111100.00
CONT_ASSIGN23411100.00
CONT_ASSIGN28111100.00
ALWAYS3027575100.00
ALWAYS47633100.00
ALWAYS4792121100.00

140 always_comb begin : p_luts 141 0/1 ==> otp_enc_key_lut = '0; 142 0/1 ==> otp_dec_key_lut = '0; 143 0/1 ==> digest_const_lut = '0; 144 0/1 ==> digest_iv_lut = '0; 145 146 0/1 ==> for (int k = 0; k < NumScrmblKeys; k++) begin 147 localparam logic [4:0] NumRounds = 5'(unsigned'(NumPresentRounds)); 148 0/1 ==> otp_enc_key_lut[k] = rnd_cnst_key_anchor[k]; 149 // Due to the PRESENT key schedule, we have to step the key schedule function by 150 // NumPresentRounds forwards to get the decryption key. 151 0/1 ==> otp_dec_key_lut[k] = 152 prim_cipher_pkg::present_get_dec_key128(rnd_cnst_key_anchor[k], NumRounds); 153 end 154 155 0/1 ==> for (int k = 0; k < NumDigestSets; k++) begin 156 0/1 ==> digest_const_lut[k] = rnd_cnst_digest_anchor[k]; 157 0/1 ==> digest_iv_lut[k] = rnd_cnst_digest_iv_anchor[k]; 158 end 159 end 160 `ASSERT_KNOWN(EncKeyLutKnown_A, otp_enc_key_lut) 161 `ASSERT_KNOWN(DecKeyLutKnown_A, otp_dec_key_lut) 162 `ASSERT_KNOWN(DigestConstLutKnown_A, digest_const_lut) 163 `ASSERT_KNOWN(DigestIvLutKnown_A, digest_iv_lut) 164 165 ////////////// 166 // Datapath // 167 ////////////// 168 169 logic [4:0] idx_state_d, idx_state_q; 170 logic [ScrmblKeyWidth-1:0] key_state_d, key_state_q; 171 logic [ScrmblBlockWidth-1:0] data_state_d, data_state_q, data_shadow_q; 172 logic [ScrmblBlockWidth-1:0] digest_state_d, digest_state_q; 173 logic [ScrmblBlockWidth-1:0] enc_data_out, enc_data_out_xor, dec_data_out; 174 logic [ScrmblKeyWidth-1:0] dec_key_out, enc_key_out; 175 logic [4:0] dec_idx_out, enc_idx_out; 176 logic [ScrmblKeyWidth-1:0] otp_digest_const_mux, otp_enc_key_mux, otp_dec_key_mux; 177 logic [ScrmblBlockWidth-1:0] otp_digest_iv_mux; 178 179 typedef enum logic [2:0] {SelEncDataOut, 180 SelDecDataOut, 181 SelDigestState, 182 SelEncDataOutXor, 183 SelDataInput} data_state_sel_e; 184 185 typedef enum logic [2:0] {SelDecKeyOut, 186 SelEncKeyOut, 187 SelDecKeyInit, 188 SelEncKeyInit, 189 SelDigestConst, 190 SelDigestInput, 191 SelDigestChained} key_state_sel_e; 192 193 logic digest_init; 194 data_state_sel_e data_state_sel; 195 key_state_sel_e key_state_sel; 196 logic data_state_en, data_shadow_copy, data_shadow_load, digest_state_en, key_state_en; 197 digest_mode_e digest_mode_d, digest_mode_q; 198 199 1/1 assign otp_enc_key_mux = otp_enc_key_lut[ScrmblKeySelWidth'(sel_i)]; Tests: T1 T2 T3  200 1/1 assign otp_dec_key_mux = otp_dec_key_lut[ScrmblKeySelWidth'(sel_i)]; Tests: T1 T2 T3  201 1/1 assign otp_digest_const_mux = digest_const_lut[DigestSetSelWidth'(sel_i)]; Tests: T1 T2 T3  202 1/1 assign otp_digest_iv_mux = digest_iv_lut[DigestSetSelWidth'(sel_i)]; Tests: T1 T2 T3  203 204 // Make sure we always select a valid key / digest constant. 205 `ASSERT(CheckNumEncKeys_A, key_state_sel == SelEncKeyInit |-> sel_i < NumScrmblKeys) 206 `ASSERT(CheckNumDecKeys_A, key_state_sel == SelDecKeyInit |-> sel_i < NumScrmblKeys) 207 `ASSERT(CheckNumDigest1_A, key_state_sel == SelDigestConst |-> sel_i < NumDigestSets) 208 209 1/1 assign data_state_d = (data_state_sel == SelEncDataOut) ? enc_data_out : Tests: T1 T2 T3  210 (data_state_sel == SelDecDataOut) ? dec_data_out : 211 (data_state_sel == SelDigestState) ? digest_state_q : 212 (data_state_sel == SelEncDataOutXor) ? enc_data_out_xor : 213 data_i; 214 215 1/1 assign key_state_d = (key_state_sel == SelDecKeyOut) ? dec_key_out : Tests: T1 T2 T3  216 (key_state_sel == SelEncKeyOut) ? enc_key_out : 217 (key_state_sel == SelDecKeyInit) ? otp_dec_key_mux : 218 (key_state_sel == SelEncKeyInit) ? otp_enc_key_mux : 219 (key_state_sel == SelDigestConst) ? otp_digest_const_mux : 220 (key_state_sel == SelDigestChained) ? {data_state_q, data_shadow_q} : 221 {data_i, data_shadow_q}; 222 223 // Initialize the round index state with 1 in all cases, except for the decrypt operation. 224 1/1 assign idx_state_d = (key_state_sel == SelDecKeyOut) ? dec_idx_out : Tests: T1 T2 T3  225 (key_state_sel == SelEncKeyOut) ? enc_idx_out : 226 (key_state_sel == SelDecKeyInit) ? unsigned'(5'(NumPresentRounds)) : 227 5'd1; 228 229 // The XOR is for the Davies-Mayer one-way function construction. 230 1/1 assign enc_data_out_xor = enc_data_out ^ digest_state_q; Tests: T1 T2 T3  231 1/1 assign digest_state_d = (digest_init) ? otp_digest_iv_mux : enc_data_out_xor; Tests: T1 T2 T3  232 233 logic valid_q; //valid_d defined below 234 1/1 assign data_o = (valid_q) ? data_state_q : 0; Tests: T1 T2 T3  235 236 ///////// 237 // FSM // 238 ///////// 239 240 // SEC_CM: SCRMBL.FSM.SPARSE 241 // Encoding generated with: 242 // $ ./util/design/sparse-fsm-encode.py -d 5 -m 5 -n 9 \ 243 // -s 2193087944 --language=sv 244 // 245 // Hamming distance histogram: 246 // 247 // 0: -- 248 // 1: -- 249 // 2: -- 250 // 3: -- 251 // 4: -- 252 // 5: |||||||||||||||||||| (60.00%) 253 // 6: ||||||||||||| (40.00%) 254 // 7: -- 255 // 8: -- 256 // 9: -- 257 // 258 // Minimum Hamming distance: 5 259 // Maximum Hamming distance: 6 260 // Minimum Hamming weight: 4 261 // Maximum Hamming weight: 7 262 // 263 localparam int StateWidth = 9; 264 typedef enum logic [StateWidth-1:0] { 265 IdleSt = 9'b100011001, 266 DecryptSt = 9'b101101111, 267 EncryptSt = 9'b010010111, 268 DigestSt = 9'b111000010, 269 ErrorSt = 9'b011111000 270 } state_e; 271 272 localparam int CntWidth = $clog2(NumPresentRounds+1); 273 localparam int unsigned LastPresentRoundInt = NumPresentRounds - 1; 274 localparam bit [CntWidth-1:0] LastPresentRound = LastPresentRoundInt[CntWidth-1:0]; 275 276 state_e state_d, state_q; 277 logic [CntWidth-1:0] cnt; 278 logic cnt_clr, cnt_en, cnt_err; 279 logic valid_d; //valid_q defined above 280 281 1/1 assign valid_o = valid_q; Tests: T1 T2 T3  282 283 // SEC_CM: SCRMBL.CTR.REDUN 284 prim_count #( 285 .Width(CntWidth) 286 ) u_prim_count ( 287 .clk_i, 288 .rst_ni, 289 .clr_i(cnt_clr), 290 .set_i(1'b0), 291 .set_cnt_i('0), 292 .incr_en_i(cnt_en), 293 .decr_en_i(1'b0), 294 .step_i(CntWidth'(1)), 295 .commit_i(1'b1), 296 .cnt_o(cnt), 297 .cnt_after_commit_o(), 298 .err_o(cnt_err) 299 ); 300 301 always_comb begin : p_fsm 302 1/1 state_d = state_q; Tests: T1 T2 T3  303 1/1 digest_mode_d = digest_mode_q; Tests: T1 T2 T3  304 1/1 data_state_sel = SelDataInput; Tests: T1 T2 T3  305 1/1 key_state_sel = SelDigestInput; Tests: T1 T2 T3  306 1/1 digest_init = 1'b0; Tests: T1 T2 T3  307 1/1 data_state_en = 1'b0; Tests: T1 T2 T3  308 1/1 data_shadow_copy = 1'b0; Tests: T1 T2 T3  309 1/1 data_shadow_load = 1'b0; Tests: T1 T2 T3  310 1/1 key_state_en = 1'b0; Tests: T1 T2 T3  311 1/1 digest_state_en = 1'b0; Tests: T1 T2 T3  312 1/1 cnt_en = 1'b0; Tests: T1 T2 T3  313 1/1 cnt_clr = 1'b0; Tests: T1 T2 T3  314 1/1 valid_d = 1'b0; Tests: T1 T2 T3  315 1/1 ready_o = 1'b0; Tests: T1 T2 T3  316 1/1 fsm_err_o = 1'b0; Tests: T1 T2 T3  317 318 1/1 unique case (state_q) Tests: T1 T2 T3  319 /////////////////////////////////////////////////////////////////// 320 // Idle State: decode command and 321 // load working regs accordingly 322 IdleSt: begin 323 1/1 cnt_clr = 1'b1; Tests: T1 T2 T3  324 1/1 ready_o = 1'b1; Tests: T1 T2 T3  325 326 1/1 if (valid_i) begin Tests: T1 T2 T3  327 1/1 unique case (cmd_i) Tests: T1 T2 T3  328 Decrypt: begin 329 1/1 state_d = DecryptSt; Tests: T1 T2 T3  330 1/1 key_state_sel = SelDecKeyInit; Tests: T1 T2 T3  331 1/1 data_state_en = 1'b1; Tests: T1 T2 T3  332 1/1 key_state_en = 1'b1; Tests: T1 T2 T3  333 end 334 Encrypt: begin 335 1/1 state_d = EncryptSt; Tests: T1 T2 T3  336 1/1 key_state_sel = SelEncKeyInit; Tests: T1 T2 T3  337 1/1 data_state_en = 1'b1; Tests: T1 T2 T3  338 1/1 key_state_en = 1'b1; Tests: T1 T2 T3  339 end 340 LoadShadow: begin 341 1/1 if (digest_mode_q == ChainedMode) begin Tests: T1 T2 T3  342 1/1 data_shadow_copy = 1'b1; Tests: T1 T2 T3  343 end else begin 344 1/1 data_shadow_load = 1'b1; Tests: T1 T2 T3  345 end 346 end 347 Digest: begin 348 1/1 state_d = DigestSt; Tests: T1 T2 T3  349 1/1 data_state_sel = SelDigestState; Tests: T1 T2 T3  350 1/1 key_state_sel = (digest_mode_q == ChainedMode) ? SelDigestChained : SelDigestInput; Tests: T1 T2 T3  351 1/1 data_state_en = 1'b1; Tests: T1 T2 T3  352 1/1 key_state_en = 1'b1; Tests: T1 T2 T3  353 end 354 DigestInit: begin 355 1/1 digest_mode_d = mode_i; Tests: T1 T2 T3  356 1/1 digest_init = 1'b1; Tests: T1 T2 T3  357 1/1 digest_state_en = 1'b1; Tests: T1 T2 T3  358 end 359 DigestFinalize: begin 360 1/1 state_d = DigestSt; Tests: T1 T2 T3  361 1/1 data_state_sel = SelDigestState; Tests: T1 T2 T3  362 1/1 key_state_sel = SelDigestConst; Tests: T1 T2 T3  363 1/1 data_state_en = 1'b1; Tests: T1 T2 T3  364 1/1 key_state_en = 1'b1; Tests: T1 T2 T3  365 1/1 digest_mode_d = StandardMode; Tests: T1 T2 T3  366 end 367 default: ; // ignore Exclude Annotation: VC_COV_UNR 368 endcase // cmd_i 369 end MISSING_ELSE 370 end 371 /////////////////////////////////////////////////////////////////// 372 // Perform decrypt rounds. 373 DecryptSt: begin 374 1/1 data_state_sel = SelDecDataOut; Tests: T1 T2 T3  375 1/1 key_state_sel = SelDecKeyOut; Tests: T1 T2 T3  376 1/1 data_state_en = 1'b1; Tests: T1 T2 T3  377 1/1 key_state_en = 1'b1; Tests: T1 T2 T3  378 1/1 cnt_en = 1'b1; Tests: T1 T2 T3  379 1/1 if (cnt == LastPresentRound) begin Tests: T1 T2 T3  380 1/1 state_d = IdleSt; Tests: T1 T2 T3  381 1/1 valid_d = 1'b1; Tests: T1 T2 T3  382 end MISSING_ELSE 383 end 384 /////////////////////////////////////////////////////////////////// 385 // Perform encrypt rounds. 386 EncryptSt: begin 387 1/1 data_state_sel = SelEncDataOut; Tests: T1 T2 T3  388 1/1 key_state_sel = SelEncKeyOut; Tests: T1 T2 T3  389 1/1 data_state_en = 1'b1; Tests: T1 T2 T3  390 1/1 key_state_en = 1'b1; Tests: T1 T2 T3  391 1/1 cnt_en = 1'b1; Tests: T1 T2 T3  392 1/1 if (cnt == LastPresentRound) begin Tests: T1 T2 T3  393 1/1 state_d = IdleSt; Tests: T1 T2 T3  394 1/1 valid_d = 1'b1; Tests: T1 T2 T3  395 end MISSING_ELSE 396 end 397 /////////////////////////////////////////////////////////////////// 398 // The digest is calculated with a Merkle-Damgard construction that 399 // employs the PRESENT encryption datapath. 400 DigestSt: begin 401 1/1 data_state_sel = SelEncDataOut; Tests: T1 T2 T3  402 1/1 key_state_sel = SelEncKeyOut; Tests: T1 T2 T3  403 1/1 data_state_en = 1'b1; Tests: T1 T2 T3  404 1/1 key_state_en = 1'b1; Tests: T1 T2 T3  405 1/1 cnt_en = 1'b1; Tests: T1 T2 T3  406 1/1 if (cnt == LastPresentRound) begin Tests: T1 T2 T3  407 1/1 state_d = IdleSt; Tests: T1 T2 T3  408 1/1 valid_d = 1'b1; Tests: T1 T2 T3  409 // Apply XOR for Davies-Meyer construction. 410 1/1 data_state_sel = SelEncDataOutXor; Tests: T1 T2 T3  411 // Backup digest state for next round of updates. We can't keep this state in the 412 // data state register as a digest may be calculated together with encryption 413 // operations in an interleaved way. 414 1/1 digest_state_en = 1'b1; Tests: T1 T2 T3  415 end MISSING_ELSE 416 end 417 /////////////////////////////////////////////////////////////////// 418 // Terminal error state. This raises an alert. 419 ErrorSt: begin 420 1/1 fsm_err_o = 1'b1; Tests: T12 T94 T128  421 end 422 /////////////////////////////////////////////////////////////////// 423 // This should never happen, hence we directly jump into the 424 // error state, where an alert will be triggered. 425 default: begin 426 state_d = ErrorSt; 427 fsm_err_o = 1'b1; 428 end 429 /////////////////////////////////////////////////////////////////// 430 endcase // state_q 431 432 // Unconditionally jump into the terminal error state in case of escalation. 433 // SEC_CM: SCRMBL.FSM.LOCAL_ESC, SCRMBL.FSM.GLOBAL_ESC 434 1/1 if (lc_ctrl_pkg::lc_tx_test_true_loose(escalate_en_i) || cnt_err) begin Tests: T1 T2 T3  435 1/1 state_d = ErrorSt; Tests: T12 T94 T128  436 1/1 fsm_err_o = 1'b1; Tests: T12 T94 T128  437 end MISSING_ELSE 438 end 439 440 ///////////////////////////// 441 // PRESENT DEC/ENC Modules // 442 ///////////////////////////// 443 444 prim_present #( 445 .KeyWidth(128), 446 .NumRounds(NumPresentRounds), 447 .NumPhysRounds(1) 448 ) u_prim_present_enc ( 449 .data_i ( data_state_q ), 450 .key_i ( key_state_q ), 451 .idx_i ( idx_state_q ), 452 .data_o ( enc_data_out ), 453 .key_o ( enc_key_out ), 454 .idx_o ( enc_idx_out ) 455 ); 456 457 prim_present #( 458 .KeyWidth(128), 459 // We are using an iterative full-round implementation here. 460 .NumRounds(NumPresentRounds), 461 .NumPhysRounds(1), 462 .Decrypt(1) 463 ) u_prim_present_dec ( 464 .data_i ( data_state_q ), 465 .key_i ( key_state_q ), 466 .idx_i ( idx_state_q ), 467 .data_o ( dec_data_out ), 468 .key_o ( dec_key_out ), 469 .idx_o ( dec_idx_out ) 470 ); 471 472 /////////////// 473 // Registers // 474 /////////////// 475 476 3/3 `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, IdleSt) Tests: T1 T2 T3  | T1 T2 T3  | T1 T2 T3 
PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, IdleSt): 476.1 `ifdef SIMULATION 476.2 prim_sparse_fsm_flop #( 476.3 .StateEnumT(state_e), 476.4 .Width($bits(state_e)), 476.5 .ResetValue($bits(state_e)'(IdleSt)), 476.6 .EnableAlertTriggerSVA(1), 476.7 .CustomForceName("state_q") 476.8 ) u_state_regs ( 476.9 .clk_i ( clk_i ), 476.10 .rst_ni ( rst_ni ), 476.11 .state_i ( state_d ), 476.12 .state_o ( ) 476.13 ); 476.14 always_ff @(posedge clk_i or negedge rst_ni) begin 476.15 1/1 if (!rst_ni) begin Tests: T1 T2 T3  476.16 1/1 state_q <= IdleSt; Tests: T1 T2 T3  476.17 end else begin 476.18 1/1 state_q <= state_d; Tests: T1 T2 T3  476.19 end 476.20 end 476.21 u_state_regs_A: assert property (@(posedge clk_i) disable iff ((!rst_ni) !== '0) (state_q === u_state_regs.state_o)) 476.22 else begin 476.23 `ifdef UVM 476.24 uvm_pkg::uvm_report_error("ASSERT FAILED", "u_state_regs_A", uvm_pkg::UVM_NONE, 476.25 "../src/lowrisc_ip_otp_ctrl_1.0/rtl/otp_ctrl_scrmbl.sv", 476, "", 1); 476.26 `else 476.27 $error("%0t: (%0s:%0d) [%m] [ASSERT FAILED] %0s", $time, `__FILE__, `__LINE__, 476.28 `PRIM_STRINGIFY(u_state_regs_A)); 476.29 `endif 476.30 end 476.31 `else 476.32 prim_sparse_fsm_flop #( 476.33 .StateEnumT(state_e), 476.34 .Width($bits(state_e)), 476.35 .ResetValue($bits(state_e)'(IdleSt)), 476.36 .EnableAlertTriggerSVA(1) 476.37 ) u_state_regs ( 476.38 .clk_i ( `PRIM_FLOP_CLK ), 476.39 .rst_ni ( `PRIM_FLOP_RST ), 476.40 .state_i ( state_d ), 476.41 .state_o ( state_q ) 476.42 ); 476.43 `endif477 478 always_ff @(posedge clk_i or negedge rst_ni) begin : p_regs 479 1/1 if (!rst_ni) begin Tests: T1 T2 T3  480 1/1 key_state_q <= '0; Tests: T1 T2 T3  481 1/1 idx_state_q <= '0; Tests: T1 T2 T3  482 1/1 data_state_q <= '0; Tests: T1 T2 T3  483 1/1 data_shadow_q <= '0; Tests: T1 T2 T3  484 1/1 digest_state_q <= '0; Tests: T1 T2 T3  485 1/1 valid_q <= 1'b0; Tests: T1 T2 T3  486 1/1 digest_mode_q <= StandardMode; Tests: T1 T2 T3  487 end else begin 488 1/1 valid_q <= valid_d; Tests: T1 T2 T3  489 1/1 digest_mode_q <= digest_mode_d; Tests: T1 T2 T3  490 491 // enable regs 492 1/1 if (key_state_en) begin Tests: T1 T2 T3  493 1/1 key_state_q <= key_state_d; Tests: T1 T2 T3  494 1/1 idx_state_q <= idx_state_d; Tests: T1 T2 T3  495 end MISSING_ELSE 496 1/1 if (data_state_en) begin Tests: T1 T2 T3  497 1/1 data_state_q <= data_state_d; Tests: T1 T2 T3  498 end MISSING_ELSE 499 1/1 if (data_shadow_copy) begin Tests: T1 T2 T3  500 1/1 data_shadow_q <= data_state_q; Tests: T1 T2 T3  501 1/1 end else if (data_shadow_load) begin Tests: T1 T2 T3  502 1/1 data_shadow_q <= data_state_d; Tests: T1 T2 T3  503 end MISSING_ELSE 504 1/1 if (digest_state_en) begin Tests: T1 T2 T3  505 1/1 digest_state_q <= digest_state_d; Tests: T1 T2 T3  506 end MISSING_ELSE

Cond Coverage for Instance : tb.dut.u_otp_ctrl_scrmbl
TotalCoveredPercent
Conditions6868100.00
Logical6868100.00
Non-Logical00
Event00

 LINE       209
 EXPRESSION 
 Number  Term
      1  (data_state_sel == SelEncDataOut) ? enc_data_out : ((data_state_sel == SelDecDataOut) ? dec_data_out : ((data_state_sel == SelDigestState) ? digest_state_q : ((data_state_sel == SelEncDataOutXor) ? enc_data_out_xor : data_i))))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       209
 SUB-EXPRESSION (data_state_sel == SelEncDataOut)
                ----------------1----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       209
 SUB-EXPRESSION 
 Number  Term
      1  (data_state_sel == SelDecDataOut) ? dec_data_out : ((data_state_sel == SelDigestState) ? digest_state_q : ((data_state_sel == SelEncDataOutXor) ? enc_data_out_xor : data_i)))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       209
 SUB-EXPRESSION (data_state_sel == SelDecDataOut)
                ----------------1----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       209
 SUB-EXPRESSION ((data_state_sel == SelDigestState) ? digest_state_q : ((data_state_sel == SelEncDataOutXor) ? enc_data_out_xor : data_i))
                 -----------------1----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       209
 SUB-EXPRESSION (data_state_sel == SelDigestState)
                -----------------1----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       209
 SUB-EXPRESSION ((data_state_sel == SelEncDataOutXor) ? enc_data_out_xor : data_i)
                 ------------------1-----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       209
 SUB-EXPRESSION (data_state_sel == SelEncDataOutXor)
                ------------------1-----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 EXPRESSION 
 Number  Term
      1  (key_state_sel == SelDecKeyOut) ? dec_key_out : ((key_state_sel == SelEncKeyOut) ? enc_key_out : ((key_state_sel == SelDecKeyInit) ? otp_dec_key_mux : ((key_state_sel == SelEncKeyInit) ? otp_enc_key_mux : ((key_state_sel == SelDigestConst) ? otp_digest_const_mux : ((key_state_sel == SelDigestChained) ? ({data_state_q, data_shadow_q}) : ({data_i, data_shadow_q})))))))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION (key_state_sel == SelDecKeyOut)
                ---------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION 
 Number  Term
      1  (key_state_sel == SelEncKeyOut) ? enc_key_out : ((key_state_sel == SelDecKeyInit) ? otp_dec_key_mux : ((key_state_sel == SelEncKeyInit) ? otp_enc_key_mux : ((key_state_sel == SelDigestConst) ? otp_digest_const_mux : ((key_state_sel == SelDigestChained) ? ({data_state_q, data_shadow_q}) : ({data_i, data_shadow_q}))))))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION (key_state_sel == SelEncKeyOut)
                ---------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION 
 Number  Term
      1  (key_state_sel == SelDecKeyInit) ? otp_dec_key_mux : ((key_state_sel == SelEncKeyInit) ? otp_enc_key_mux : ((key_state_sel == SelDigestConst) ? otp_digest_const_mux : ((key_state_sel == SelDigestChained) ? ({data_state_q, data_shadow_q}) : ({data_i, data_shadow_q})))))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION (key_state_sel == SelDecKeyInit)
                ----------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION 
 Number  Term
      1  (key_state_sel == SelEncKeyInit) ? otp_enc_key_mux : ((key_state_sel == SelDigestConst) ? otp_digest_const_mux : ((key_state_sel == SelDigestChained) ? ({data_state_q, data_shadow_q}) : ({data_i, data_shadow_q}))))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION (key_state_sel == SelEncKeyInit)
                ----------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION 
 Number  Term
      1  (key_state_sel == SelDigestConst) ? otp_digest_const_mux : ((key_state_sel == SelDigestChained) ? ({data_state_q, data_shadow_q}) : ({data_i, data_shadow_q})))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION (key_state_sel == SelDigestConst)
                ----------------1----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION ((key_state_sel == SelDigestChained) ? ({data_state_q, data_shadow_q}) : ({data_i, data_shadow_q}))
                 -----------------1-----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       215
 SUB-EXPRESSION (key_state_sel == SelDigestChained)
                -----------------1-----------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       224
 EXPRESSION 
 Number  Term
      1  (key_state_sel == SelDecKeyOut) ? dec_idx_out : ((key_state_sel == SelEncKeyOut) ? enc_idx_out : ((key_state_sel == SelDecKeyInit) ? ((unsigned'(5'(otp_ctrl_pkg::NumPresentRounds)))) : 5'b1)))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       224
 SUB-EXPRESSION (key_state_sel == SelDecKeyOut)
                ---------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       224
 SUB-EXPRESSION ((key_state_sel == SelEncKeyOut) ? enc_idx_out : ((key_state_sel == SelDecKeyInit) ? ((unsigned'(5'(otp_ctrl_pkg::NumPresentRounds)))) : 5'b1))
                 ---------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       224
 SUB-EXPRESSION (key_state_sel == SelEncKeyOut)
                ---------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       224
 SUB-EXPRESSION ((key_state_sel == SelDecKeyInit) ? ((unsigned'(5'(otp_ctrl_pkg::NumPresentRounds)))) : 5'b1)
                 ----------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       224
 SUB-EXPRESSION (key_state_sel == SelDecKeyInit)
                ----------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       231
 EXPRESSION (digest_init ? otp_digest_iv_mux : enc_data_out_xor)
             -----1-----
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       234
 EXPRESSION (valid_q ? data_state_q : 0)
             ---1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       341
 EXPRESSION (digest_mode_q == ChainedMode)
            ---------------1--------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       350
 EXPRESSION ((digest_mode_q == ChainedMode) ? SelDigestChained : SelDigestInput)
             ---------------1--------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       350
 SUB-EXPRESSION (digest_mode_q == ChainedMode)
                ---------------1--------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       379
 EXPRESSION (cnt == LastPresentRound)
            ------------1------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       392
 EXPRESSION (cnt == LastPresentRound)
            ------------1------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       406
 EXPRESSION (cnt == LastPresentRound)
            ------------1------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

FSM Coverage for Instance : tb.dut.u_otp_ctrl_scrmbl
Summary for FSM :: state_q
TotalCoveredPercent
States 5 5 100.00 (Not included in score)
Transitions 10 10 100.00
Sequences 0 0

State, Transition and Sequence Details for FSM :: state_q
statesLine No.CoveredTests
DecryptSt 329 Covered T1,T2,T3
DigestSt 348 Covered T1,T2,T3
EncryptSt 335 Covered T1,T2,T3
ErrorSt 435 Covered T12,T94,T128
IdleSt 380 Covered T1,T2,T3


transitionsLine No.CoveredTests
DecryptSt->ErrorSt 435 Covered T97,T297,T143
DecryptSt->IdleSt 380 Covered T1,T2,T3
DigestSt->ErrorSt 435 Covered T155,T263,T152
DigestSt->IdleSt 407 Covered T1,T2,T3
EncryptSt->ErrorSt 435 Covered T281,T139,T136
EncryptSt->IdleSt 393 Covered T1,T2,T3
IdleSt->DecryptSt 329 Covered T1,T2,T3
IdleSt->DigestSt 348 Covered T1,T2,T3
IdleSt->EncryptSt 335 Covered T1,T2,T3
IdleSt->ErrorSt 435 Covered T12,T94,T128



Branch Coverage for Instance : tb.dut.u_otp_ctrl_scrmbl
Line No.TotalCoveredPercent
Branches 51 51 100.00
TERNARY 209 5 5 100.00
TERNARY 215 7 7 100.00
TERNARY 224 4 4 100.00
TERNARY 231 2 2 100.00
TERNARY 234 2 2 100.00
CASE 318 17 17 100.00
IF 434 2 2 100.00
IF 476 2 2 100.00
IF 479 10 10 100.00


209 assign data_state_d = (data_state_sel == SelEncDataOut) ? enc_data_out : -1- ==> 210 (data_state_sel == SelDecDataOut) ? dec_data_out : -2- ==> 211 (data_state_sel == SelDigestState) ? digest_state_q : -3- ==> 212 (data_state_sel == SelEncDataOutXor) ? enc_data_out_xor : -4- ==> ==>

Branches:
-1--2--3--4-StatusTests
1 - - - Covered T1,T2,T3
0 1 - - Covered T1,T2,T3
0 0 1 - Covered T1,T2,T3
0 0 0 1 Covered T1,T2,T3
0 0 0 0 Covered T1,T2,T3


215 assign key_state_d = (key_state_sel == SelDecKeyOut) ? dec_key_out : -1- ==> 216 (key_state_sel == SelEncKeyOut) ? enc_key_out : -2- ==> 217 (key_state_sel == SelDecKeyInit) ? otp_dec_key_mux : -3- ==> 218 (key_state_sel == SelEncKeyInit) ? otp_enc_key_mux : -4- ==> 219 (key_state_sel == SelDigestConst) ? otp_digest_const_mux : -5- ==> 220 (key_state_sel == SelDigestChained) ? {data_state_q, data_shadow_q} : -6- ==> ==>

Branches:
-1--2--3--4--5--6-StatusTests
1 - - - - - Covered T1,T2,T3
0 1 - - - - Covered T1,T2,T3
0 0 1 - - - Covered T1,T2,T3
0 0 0 1 - - Covered T1,T2,T3
0 0 0 0 1 - Covered T1,T2,T3
0 0 0 0 0 1 Covered T1,T2,T3
0 0 0 0 0 0 Covered T1,T2,T3


224 assign idx_state_d = (key_state_sel == SelDecKeyOut) ? dec_idx_out : -1- ==> 225 (key_state_sel == SelEncKeyOut) ? enc_idx_out : -2- ==> 226 (key_state_sel == SelDecKeyInit) ? unsigned'(5'(NumPresentRounds)) : -3- ==> ==>

Branches:
-1--2--3-StatusTests
1 - - Covered T1,T2,T3
0 1 - Covered T1,T2,T3
0 0 1 Covered T1,T2,T3
0 0 0 Covered T1,T2,T3


231 assign digest_state_d = (digest_init) ? otp_digest_iv_mux : enc_data_out_xor; -1- ==> ==>

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


234 assign data_o = (valid_q) ? data_state_q : 0; -1- ==> ==>

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


318 unique case (state_q) -1- 319 /////////////////////////////////////////////////////////////////// 320 // Idle State: decode command and 321 // load working regs accordingly 322 IdleSt: begin 323 cnt_clr = 1'b1; 324 ready_o = 1'b1; 325 326 if (valid_i) begin -2- 327 unique case (cmd_i) -3- 328 Decrypt: begin 329 state_d = DecryptSt; ==> 330 key_state_sel = SelDecKeyInit; 331 data_state_en = 1'b1; 332 key_state_en = 1'b1; 333 end 334 Encrypt: begin 335 state_d = EncryptSt; ==> 336 key_state_sel = SelEncKeyInit; 337 data_state_en = 1'b1; 338 key_state_en = 1'b1; 339 end 340 LoadShadow: begin 341 if (digest_mode_q == ChainedMode) begin -4- 342 data_shadow_copy = 1'b1; ==> 343 end else begin 344 data_shadow_load = 1'b1; ==> 345 end 346 end 347 Digest: begin 348 state_d = DigestSt; 349 data_state_sel = SelDigestState; 350 key_state_sel = (digest_mode_q == ChainedMode) ? SelDigestChained : SelDigestInput; -5- ==> ==> 351 data_state_en = 1'b1; 352 key_state_en = 1'b1; 353 end 354 DigestInit: begin 355 digest_mode_d = mode_i; ==> 356 digest_init = 1'b1; 357 digest_state_en = 1'b1; 358 end 359 DigestFinalize: begin 360 state_d = DigestSt; ==> 361 data_state_sel = SelDigestState; 362 key_state_sel = SelDigestConst; 363 data_state_en = 1'b1; 364 key_state_en = 1'b1; 365 digest_mode_d = StandardMode; 366 end 367 default: ; // ignore ==> (Excluded) Exclude Annotation: VC_COV_UNR 368 endcase // cmd_i 369 end MISSING_ELSE ==> 370 end 371 /////////////////////////////////////////////////////////////////// 372 // Perform decrypt rounds. 373 DecryptSt: begin 374 data_state_sel = SelDecDataOut; 375 key_state_sel = SelDecKeyOut; 376 data_state_en = 1'b1; 377 key_state_en = 1'b1; 378 cnt_en = 1'b1; 379 if (cnt == LastPresentRound) begin -6- 380 state_d = IdleSt; ==> 381 valid_d = 1'b1; 382 end MISSING_ELSE ==> 383 end 384 /////////////////////////////////////////////////////////////////// 385 // Perform encrypt rounds. 386 EncryptSt: begin 387 data_state_sel = SelEncDataOut; 388 key_state_sel = SelEncKeyOut; 389 data_state_en = 1'b1; 390 key_state_en = 1'b1; 391 cnt_en = 1'b1; 392 if (cnt == LastPresentRound) begin -7- 393 state_d = IdleSt; ==> 394 valid_d = 1'b1; 395 end MISSING_ELSE ==> 396 end 397 /////////////////////////////////////////////////////////////////// 398 // The digest is calculated with a Merkle-Damgard construction that 399 // employs the PRESENT encryption datapath. 400 DigestSt: begin 401 data_state_sel = SelEncDataOut; 402 key_state_sel = SelEncKeyOut; 403 data_state_en = 1'b1; 404 key_state_en = 1'b1; 405 cnt_en = 1'b1; 406 if (cnt == LastPresentRound) begin -8- 407 state_d = IdleSt; ==> 408 valid_d = 1'b1; 409 // Apply XOR for Davies-Meyer construction. 410 data_state_sel = SelEncDataOutXor; 411 // Backup digest state for next round of updates. We can't keep this state in the 412 // data state register as a digest may be calculated together with encryption 413 // operations in an interleaved way. 414 digest_state_en = 1'b1; 415 end MISSING_ELSE ==> 416 end 417 /////////////////////////////////////////////////////////////////// 418 // Terminal error state. This raises an alert. 419 ErrorSt: begin 420 fsm_err_o = 1'b1; ==> 421 end 422 /////////////////////////////////////////////////////////////////// 423 // This should never happen, hence we directly jump into the 424 // error state, where an alert will be triggered. 425 default: begin 426 state_d = ErrorSt; ==>

Branches:
-1--2--3--4--5--6--7--8-StatusTestsExclude Annotation
IdleSt 1 Decrypt - - - - - Covered T1,T2,T3
IdleSt 1 Encrypt - - - - - Covered T1,T2,T3
IdleSt 1 LoadShadow 1 - - - - Covered T1,T2,T3
IdleSt 1 LoadShadow 0 - - - - Covered T1,T2,T3
IdleSt 1 Digest - 1 - - - Covered T1,T2,T3
IdleSt 1 Digest - 0 - - - Covered T1,T2,T3
IdleSt 1 DigestInit - - - - - Covered T1,T2,T3
IdleSt 1 DigestFinalize - - - - - Covered T1,T2,T3
IdleSt 1 default - - - - - Excluded VC_COV_UNR
IdleSt 0 - - - - - - Covered T1,T2,T3
DecryptSt - - - - 1 - - Covered T1,T2,T3
DecryptSt - - - - 0 - - Covered T1,T2,T3
EncryptSt - - - - - 1 - Covered T1,T2,T3
EncryptSt - - - - - 0 - Covered T1,T2,T3
DigestSt - - - - - - 1 Covered T1,T2,T3
DigestSt - - - - - - 0 Covered T1,T2,T3
ErrorSt - - - - - - - Covered T12,T94,T128
default - - - - - - - Covered T22,T23,T24


434 if (lc_ctrl_pkg::lc_tx_test_true_loose(escalate_en_i) || cnt_err) begin -1- 435 state_d = ErrorSt; ==> 436 fsm_err_o = 1'b1; 437 end MISSING_ELSE ==>

Branches:
-1-StatusTests
1 Covered T12,T94,T128
0 Covered T1,T2,T3


476 `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, IdleSt) -1- ==> ==>

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


479 if (!rst_ni) begin -1- 480 key_state_q <= '0; ==> 481 idx_state_q <= '0; 482 data_state_q <= '0; 483 data_shadow_q <= '0; 484 digest_state_q <= '0; 485 valid_q <= 1'b0; 486 digest_mode_q <= StandardMode; 487 end else begin 488 valid_q <= valid_d; 489 digest_mode_q <= digest_mode_d; 490 491 // enable regs 492 if (key_state_en) begin -2- 493 key_state_q <= key_state_d; ==> 494 idx_state_q <= idx_state_d; 495 end MISSING_ELSE ==> 496 if (data_state_en) begin -3- 497 data_state_q <= data_state_d; ==> 498 end MISSING_ELSE ==> 499 if (data_shadow_copy) begin -4- 500 data_shadow_q <= data_state_q; ==> 501 end else if (data_shadow_load) begin -5- 502 data_shadow_q <= data_state_d; ==> 503 end MISSING_ELSE ==> 504 if (digest_state_en) begin -6- 505 digest_state_q <= digest_state_d; ==> 506 end MISSING_ELSE ==>

Branches:
-1--2--3--4--5--6-StatusTests
1 - - - - - Covered T1,T2,T3
0 1 - - - - Covered T1,T2,T3
0 0 - - - - Covered T1,T2,T3
0 - 1 - - - Covered T1,T2,T3
0 - 0 - - - Covered T1,T2,T3
0 - - 1 - - Covered T1,T2,T3
0 - - 0 1 - Covered T1,T2,T3
0 - - 0 0 - Covered T1,T2,T3
0 - - - - 1 Covered T1,T2,T3
0 - - - - 0 Covered T1,T2,T3


Assert Coverage for Instance : tb.dut.u_otp_ctrl_scrmbl
TotalAttemptedPercentSucceeded/MatchedPercent
Assertions 9 9 100.00 9 100.00
Cover properties 0 0 0
Cover sequences 0 0 0
Total 9 9 100.00 9 100.00




Assertion Details

NameAttemptsReal SuccessesFailuresIncomplete
CheckNumDecKeys_A 87543204 237398 0 0
CheckNumDigest1_A 87543204 120391 0 0
CheckNumEncKeys_A 87543204 252150 0 0
DecKeyLutKnown_A 87543204 86701732 0 0
DigestConstLutKnown_A 87543204 86701732 0 0
DigestIvLutKnown_A 87543204 86701732 0 0
EncKeyLutKnown_A 87543204 86701732 0 0
NumMaxPresentRounds_A 1124 1124 0 0
u_state_regs_A 87543204 86701732 0 0


CheckNumDecKeys_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 87543204 237398 0 0
T1 5432 24 0 0
T2 10698 46 0 0
T3 25481 107 0 0
T4 10281 35 0 0
T5 4680 24 0 0
T6 40011 196 0 0
T7 36446 240 0 0
T11 6282 24 0 0
T12 98597 51 0 0
T13 28315 114 0 0

CheckNumDigest1_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 87543204 120391 0 0
T1 5432 5 0 0
T2 10698 12 0 0
T3 25481 71 0 0
T4 10281 5 0 0
T5 4680 7 0 0
T6 40011 129 0 0
T7 36446 101 0 0
T11 6282 5 0 0
T12 98597 10 0 0
T13 28315 58 0 0

CheckNumEncKeys_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 87543204 252150 0 0
T1 5432 24 0 0
T2 10698 32 0 0
T3 25481 102 0 0
T4 10281 32 0 0
T5 4680 24 0 0
T6 40011 264 0 0
T7 36446 238 0 0
T11 6282 24 0 0
T12 98597 55 0 0
T13 28315 101 0 0

DecKeyLutKnown_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 87543204 86701732 0 0
T1 5432 5382 0 0
T2 10698 10452 0 0
T3 25481 25010 0 0
T4 10281 10014 0 0
T5 4680 4619 0 0
T6 40011 39222 0 0
T7 36446 35679 0 0
T11 6282 6220 0 0
T12 98597 98413 0 0
T13 28315 27844 0 0

DigestConstLutKnown_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 87543204 86701732 0 0
T1 5432 5382 0 0
T2 10698 10452 0 0
T3 25481 25010 0 0
T4 10281 10014 0 0
T5 4680 4619 0 0
T6 40011 39222 0 0
T7 36446 35679 0 0
T11 6282 6220 0 0
T12 98597 98413 0 0
T13 28315 27844 0 0

DigestIvLutKnown_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 87543204 86701732 0 0
T1 5432 5382 0 0
T2 10698 10452 0 0
T3 25481 25010 0 0
T4 10281 10014 0 0
T5 4680 4619 0 0
T6 40011 39222 0 0
T7 36446 35679 0 0
T11 6282 6220 0 0
T12 98597 98413 0 0
T13 28315 27844 0 0

EncKeyLutKnown_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 87543204 86701732 0 0
T1 5432 5382 0 0
T2 10698 10452 0 0
T3 25481 25010 0 0
T4 10281 10014 0 0
T5 4680 4619 0 0
T6 40011 39222 0 0
T7 36446 35679 0 0
T11 6282 6220 0 0
T12 98597 98413 0 0
T13 28315 27844 0 0

NumMaxPresentRounds_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 1124 1124 0 0
T1 1 1 0 0
T2 1 1 0 0
T3 1 1 0 0
T4 1 1 0 0
T5 1 1 0 0
T6 1 1 0 0
T7 1 1 0 0
T11 1 1 0 0
T12 1 1 0 0
T13 1 1 0 0

u_state_regs_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 87543204 86701732 0 0
T1 5432 5382 0 0
T2 10698 10452 0 0
T3 25481 25010 0 0
T4 10281 10014 0 0
T5 4680 4619 0 0
T6 40011 39222 0 0
T7 36446 35679 0 0
T11 6282 6220 0 0
T12 98597 98413 0 0
T13 28315 27844 0 0

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