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



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

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
94.76 96.63 85.85 100.00 91.30 100.00


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
96.67 96.73 92.50 96.90 100.00 96.82 97.06


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
94.56 97.67 86.00 100.00 u_eflash


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
gen_prog_data.u_prog 97.81 100.00 95.38 95.00 100.00 96.49 100.00
u_disable_buf 100.00 100.00 100.00
u_erase 92.22 100.00 88.89 100.00 80.00
u_host_arb 93.98 75.93 100.00 100.00 100.00
u_host_outstanding_cnt 100.00 100.00
u_rd 96.92 97.64 92.75 100.00 99.37 94.83
u_state_regs 100.00 100.00 100.00 100.00



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

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
95.79 97.75 87.74 100.00 93.48 100.00


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
97.27 96.85 92.57 100.00 100.00 97.17 97.06


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
94.56 97.67 86.00 100.00 u_eflash


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
gen_prog_data.u_prog 98.39 100.00 93.85 100.00 100.00 96.49 100.00
u_disable_buf 100.00 100.00 100.00
u_erase 92.22 100.00 88.89 100.00 80.00
u_host_arb 91.95 75.93 91.89 100.00 100.00
u_host_outstanding_cnt 100.00 100.00
u_rd 96.97 97.64 92.99 100.00 99.37 94.83
u_state_regs 100.00 100.00 100.00 100.00

Line Coverage for Module : flash_phy_core
Line No.TotalCoveredPercent
TOTAL898797.75
ALWAYS15266100.00
ALWAYS16533100.00
CONT_ASSIGN19611100.00
CONT_ASSIGN20011100.00
ALWAYS20344100.00
ALWAYS2156583.33
ALWAYS2296583.33
CONT_ASSIGN27711100.00
CONT_ASSIGN28011100.00
CONT_ASSIGN28111100.00
CONT_ASSIGN28211100.00
CONT_ASSIGN28711100.00
CONT_ASSIGN31711100.00
CONT_ASSIGN32111100.00
ALWAYS3252929100.00
CONT_ASSIGN38811100.00
CONT_ASSIGN39211100.00
CONT_ASSIGN39311100.00
CONT_ASSIGN39411100.00
CONT_ASSIGN39511100.00
CONT_ASSIGN39611100.00
CONT_ASSIGN39711100.00
CONT_ASSIGN39811100.00
CONT_ASSIGN41511100.00
CONT_ASSIGN42811100.00
CONT_ASSIGN52311100.00
CONT_ASSIGN55011100.00
CONT_ASSIGN55111100.00
CONT_ASSIGN55211100.00
CONT_ASSIGN55311100.00
CONT_ASSIGN55511100.00
CONT_ASSIGN55611100.00
CONT_ASSIGN55711100.00
CONT_ASSIGN55811100.00
CONT_ASSIGN55911100.00
CONT_ASSIGN56011100.00
CONT_ASSIGN56111100.00
CONT_ASSIGN56811100.00
CONT_ASSIGN58511100.00
CONT_ASSIGN58611100.00
CONT_ASSIGN58711100.00

151 always_ff @(posedge clk_i or negedge rst_ni) begin 152 1/1 if (!rst_ni) begin Tests: T1 T2 T3  153 1/1 arb_cnt <= '0; Tests: T1 T2 T3  154 1/1 end else if (ctrl_rsp_vld) begin Tests: T1 T2 T3  155 1/1 arb_cnt <= '0; Tests: T1 T2 T3  156 1/1 end else if (inc_arb_cnt) begin Tests: T1 T2 T3  157 1/1 arb_cnt <= arb_cnt + 1'b1; Tests: T10 T11 T19  158 end MISSING_ELSE 159 end 160 161 import prim_mubi_pkg::mubi4_test_false_strict; 162 import prim_mubi_pkg::mubi4_test_true_loose; 163 164 // SEC_CM: PHY.FSM.SPARSE 165 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): 165.1 `ifdef SIMULATION 165.2 prim_sparse_fsm_flop #( 165.3 .StateEnumT(state_e), 165.4 .Width($bits(state_e)), 165.5 .ResetValue($bits(state_e)'(StIdle)), 165.6 .EnableAlertTriggerSVA(1), 165.7 .CustomForceName("state_q") 165.8 ) u_state_regs ( 165.9 .clk_i ( clk_i ), 165.10 .rst_ni ( rst_ni ), 165.11 .state_i ( state_d ), 165.12 .state_o ( ) 165.13 ); 165.14 always_ff @(posedge clk_i or negedge rst_ni) begin 165.15 1/1 if (!rst_ni) begin Tests: T1 T2 T3  165.16 1/1 state_q <= StIdle; Tests: T1 T2 T3  165.17 end else begin 165.18 1/1 state_q <= state_d; Tests: T1 T2 T3  165.19 end 165.20 end 165.21 u_state_regs_A: assert property (@(posedge clk_i) disable iff ((!rst_ni) !== '0) (state_q === u_state_regs.state_o)) 165.22 else begin 165.23 `ifdef UVM 165.24 uvm_pkg::uvm_report_error("ASSERT FAILED", "u_state_regs_A", uvm_pkg::UVM_NONE, 165.25 "../src/lowrisc_opentitan_top_earlgrey_flash_ctrl_0.1/rtl/flash_phy_core.sv", 165, "", 1); 165.26 `else 165.27 $error("%0t: (%0s:%0d) [%m] [ASSERT FAILED] %0s", $time, `__FILE__, `__LINE__, 165.28 `PRIM_STRINGIFY(u_state_regs_A)); 165.29 `endif 165.30 end 165.31 `else 165.32 prim_sparse_fsm_flop #( 165.33 .StateEnumT(state_e), 165.34 .Width($bits(state_e)), 165.35 .ResetValue($bits(state_e)'(StIdle)), 165.36 .EnableAlertTriggerSVA(1) 165.37 ) u_state_regs ( 165.38 .clk_i ( `PRIM_FLOP_CLK ), 165.39 .rst_ni ( `PRIM_FLOP_RST ), 165.40 .state_i ( state_d ), 165.41 .state_o ( state_q ) 165.42 ); 165.43 `endif166 167 typedef enum logic [2:0] { 168 HostDisableIdx, 169 CtrlDisableIdx, 170 FsmDisableIdx, 171 ProgFsmDisableIdx, 172 LastDisableIdx 173 } phy_core_disable_e; 174 175 prim_mubi_pkg::mubi4_t [LastDisableIdx-1:0] flash_disable; 176 prim_mubi4_sync #( 177 .NumCopies(int'(LastDisableIdx)), 178 .AsyncOn(0) 179 ) u_disable_buf ( 180 .clk_i, 181 .rst_ni, 182 .mubi_i(flash_disable_i), 183 .mubi_o(flash_disable) 184 ); 185 186 // Oustanding width is slightly larger to ensure a faulty increment is able to reach 187 // the higher value. For example if RspOrderDepth were 3, a clog2 of 3 would still be 2 188 // and not allow the counter to increment to 4. 189 localparam int OutstandingRdWidth = $clog2(RspOrderDepth+2); 190 logic [OutstandingRdWidth-1:0] host_outstanding; 191 logic ctrl_fsm_idle; 192 logic host_req; 193 // SEC_CM: PHY_HOST_GRANT.CTRL.CONSISTENCY 194 // A host transaction was granted to the muxed partition, this is illegal 195 logic host_gnt_err_event; 196 1/1 assign host_gnt_err_event = (host_gnt && muxed_part != flash_ctrl_pkg::FlashPartData); Tests: T1 T2 T3  197 // Controller fsm became non idle when there are pending host transactions, this is 198 // illegal. 199 logic host_outstanding_err_event; 200 1/1 assign host_outstanding_err_event = |host_outstanding & !ctrl_fsm_idle; Tests: T1 T2 T3  201 202 always_ff @(posedge clk_i or negedge rst_ni) begin 203 1/1 if (!rst_ni) begin Tests: T1 T2 T3  204 1/1 host_gnt_err_o <= '0; Tests: T1 T2 T3  205 1/1 end else if (host_gnt_err_event | host_outstanding_err_event) begin Tests: T1 T2 T3  206 1/1 host_gnt_err_o <= 1'b1; Tests: T11 T181 T214  207 end MISSING_ELSE 208 end 209 210 // When host grant errors occur, also create in band error responses. 211 // The error condition is held until all existing host transactions are 212 // processed. 213 logic host_gnt_rd_err; 214 always_ff @(posedge clk_i or negedge rst_ni) begin 215 1/1 if (!rst_ni) begin Tests: T1 T2 T3  216 1/1 host_gnt_rd_err <= '0; Tests: T1 T2 T3  217 1/1 end else if (host_outstanding == '0) begin Tests: T1 T2 T3  218 1/1 host_gnt_rd_err <= '0; Tests: T1 T2 T3  219 1/1 end else if (host_gnt_err_event) begin Tests: T8 T6 T20  220 0/1 ==> host_gnt_rd_err <= 1'b1; 221 end MISSING_ELSE 222 end 223 224 // When host outstanding errors occur, also create in band error responses. 225 // The error condition is held until all existing host and controller 226 // transactions are processed. 227 logic host_outstanding_rd_err; 228 always_ff @(posedge clk_i or negedge rst_ni) begin 229 1/1 if (!rst_ni) begin Tests: T1 T2 T3  230 1/1 host_outstanding_rd_err <= '0; Tests: T1 T2 T3  231 1/1 end else if (host_outstanding == '0 && ctrl_fsm_idle) begin Tests: T1 T2 T3  232 1/1 host_outstanding_rd_err <= '0; Tests: T1 T2 T3  233 1/1 end else if (host_outstanding_err_event) begin Tests: T1 T2 T3  234 0/1 ==> host_outstanding_rd_err <= 1'b1; 235 end MISSING_ELSE 236 end 237 238 // SEC_CM: PHY_HOST_GRANT.CTRL.CONSISTENCY 239 prim_count #( 240 .Width(OutstandingRdWidth), 241 .ResetValue('0) 242 ) u_host_outstanding_cnt ( 243 .clk_i, 244 .rst_ni, 245 .clr_i('0), 246 .set_i('0), 247 .set_cnt_i('0), 248 .incr_en_i(host_gnt && !host_req_done_o && (host_outstanding <= RspOrderDepth)), 249 .decr_en_i(!host_gnt && host_req_done_o && |host_outstanding), 250 .step_i(OutstandingRdWidth'(1'b1)), 251 .commit_i(1'b1), 252 .cnt_o(host_outstanding), 253 .cnt_after_commit_o(), 254 .err_o(cnt_err_o) 255 ); 256 257 // If host_outstanding is non-zero, the controller fsm must be idle.. 258 // This assertion needs to be disabled for sec_cm testing 259 `ASSERT(HostTransIdleChk_A, |host_outstanding |-> ctrl_fsm_idle) 260 261 //always_ff @(posedge clk_i or negedge rst_ni) begin 262 // if (!rst_ni) begin 263 // host_outstanding <= '0; 264 // end else if (host_gnt && !host_req_done_o && (host_outstanding <= RspOrderDepth)) begin 265 // host_outstanding <= host_outstanding + 1'b1; 266 // end else if (!host_gnt && host_req_done_o && |host_outstanding) begin 267 // host_outstanding <= host_outstanding - 1'b1; 268 // end 269 //end 270 271 `ASSERT(RdTxnCheck_A, host_outstanding <= RspOrderDepth) 272 273 // The host request is suppressed under a variety of conditions: 274 // 1. If a controller transaction is already ongoing. 275 // 2. If a grant or outstanding error has already been observed but not yet 276 // fully processed. 277 1/1 assign host_req = host_req_i & (arb_cnt < ArbCnt[CntWidth-1:0]) & ctrl_fsm_idle & Tests: T1 T2 T3  278 !host_gnt_rd_err & !host_outstanding_rd_err & 279 mubi4_test_false_strict(flash_disable[HostDisableIdx]); 280 1/1 assign host_sel = host_req; Tests: T1 T2 T4  281 1/1 assign host_gnt = host_req & host_req_rdy_o; Tests: T1 T2 T4  282 1/1 assign host_req_done_o = |host_outstanding & rd_stage_data_valid; Tests: T1 T2 T3  283 284 // controller request can only win after the entire read pipeline 285 // clears 286 logic ctrl_req; 287 1/1 assign ctrl_req = req_i & rd_stage_idle & Tests: T1 T2 T3  288 !host_gnt_rd_err & !host_outstanding_rd_err & 289 mubi4_test_false_strict(flash_disable[CtrlDisableIdx]); 290 291 logic [1:0] data_tie_off [2]; 292 assign data_tie_off = '{default: '0}; 293 294 // SEC_CM: PHY_ARBITER.CTRL.REDUN 295 logic phy_req; 296 logic phy_rdy; 297 298 prim_arbiter_tree_dup #( 299 .N(2), 300 .DW(2), 301 .EnDataPort('0), 302 .FixedArb(1) 303 ) u_host_arb ( 304 .clk_i, 305 .rst_ni, 306 .req_chk_i('0), 307 .req_i({ctrl_req, host_req}), 308 .data_i(data_tie_off), 309 .gnt_o({ctrl_gnt, host_req_rdy_o}), 310 .idx_o(), 311 .valid_o(phy_req), 312 .data_o(), 313 .ready_i(phy_rdy), 314 .err_o(arb_err_o) 315 ); 316 317 1/1 assign phy_rdy = phy_req & host_req ? rd_stage_rdy : rd_stage_idle; Tests: T1 T2 T3  318 319 320 // if request happens at the same time as a host grant, increment count 321 1/1 assign inc_arb_cnt = req_i & host_gnt; Tests: T1 T2 T3  322 323 logic fsm_err; 324 always_comb begin 325 1/1 state_d = state_q; Tests: T1 T2 T3  326 1/1 reqs = '0; Tests: T1 T2 T3  327 1/1 ctrl_rsp_vld = '0; Tests: T1 T2 T3  328 1/1 fsm_err = '0; Tests: T1 T2 T3  329 1/1 ctrl_fsm_idle = '0; Tests: T1 T2 T3  330 331 1/1 unique case (state_q) Tests: T1 T2 T3  332 StIdle: begin 333 1/1 ctrl_fsm_idle = 1'b1; Tests: T1 T2 T3  334 1/1 if (mubi4_test_true_loose(flash_disable[FsmDisableIdx])) begin Tests: T1 T2 T3  335 1/1 state_d = StDisable; Tests: T4 T5 T6  336 1/1 end else if (ctrl_gnt && rd_i) begin Tests: T1 T2 T3  337 1/1 state_d = StCtrlRead; Tests: T1 T2 T3  338 1/1 end else if (ctrl_gnt && prog_i) begin Tests: T1 T2 T3  339 1/1 state_d = StCtrlProg; Tests: T1 T2 T4  340 1/1 end else if (ctrl_gnt) begin Tests: T1 T2 T3  341 1/1 state_d = StCtrl; Tests: T9 T27 T28  342 end MISSING_ELSE 343 end 344 345 // Controller reads are very slow. 346 StCtrlRead: begin 347 1/1 if (rd_stage_data_valid) begin Tests: T1 T2 T3  348 1/1 ctrl_rsp_vld = 1'b1; Tests: T1 T2 T3  349 1/1 state_d = StIdle; Tests: T1 T2 T3  350 end MISSING_ELSE 351 end 352 353 // Controller program data may be packed based on 354 // address alignment 355 StCtrlProg: begin 356 1/1 reqs[PhyProg] = 1'b1; Tests: T1 T2 T4  357 1/1 if (prog_ack) begin Tests: T1 T2 T4  358 1/1 ctrl_rsp_vld = 1'b1; Tests: T1 T2 T4  359 1/1 state_d = StIdle; Tests: T1 T2 T4  360 end MISSING_ELSE 361 end 362 363 // other controller operations directly interface with flash 364 StCtrl: begin 365 1/1 reqs[PhyPgErase] = pg_erase_i; Tests: T9 T27 T28  366 1/1 reqs[PhyBkErase] = bk_erase_i; Tests: T9 T27 T28  367 1/1 if (erase_ack) begin Tests: T9 T27 T28  368 1/1 ctrl_rsp_vld = 1'b1; Tests: T9 T27 T28  369 1/1 state_d = StIdle; Tests: T9 T27 T28  370 end MISSING_ELSE 371 end 372 373 StDisable: begin 374 1/1 ctrl_fsm_idle = 1'b1; Tests: T4 T5 T6  375 1/1 state_d = StDisable; Tests: T4 T5 T6  376 end 377 378 default: begin 379 ctrl_fsm_idle = 1'b1; 380 fsm_err = 1'b1; 381 end 382 383 endcase // unique case (state_q) 384 end // always_comb 385 386 // determine spurious acks 387 // SEC_CM: PHY_ACK.CTRL.CONSISTENCY 388 1/1 assign spurious_ack_o = (ctrl_fsm_idle & ctrl_rsp_vld) | Tests: T1 T2 T3  389 ((host_outstanding == '0) & host_req_done_o); 390 391 // transactions coming from flash controller are always data type 392 1/1 assign muxed_addr = host_sel ? host_addr_i : addr_i; Tests: T1 T2 T3  393 1/1 assign muxed_part = host_sel ? flash_ctrl_pkg::FlashPartData : part_i; Tests: T1 T2 T3  394 1/1 assign muxed_scramble_en = host_sel ? host_scramble_en_i : scramble_en_i; Tests: T1 T2 T3  395 1/1 assign muxed_ecc_en = host_sel ? host_ecc_en_i : ecc_en_i; Tests: T1 T2 T3  396 1/1 assign rd_done_o = ctrl_rsp_vld & rd_i; Tests: T1 T2 T3  397 1/1 assign prog_done_o = ctrl_rsp_vld & prog_i; Tests: T1 T2 T3  398 1/1 assign erase_done_o = ctrl_rsp_vld & (pg_erase_i | bk_erase_i); Tests: T1 T2 T3  399 400 //////////////////////// 401 // read pipeline 402 //////////////////////// 403 404 logic flash_rd_req; 405 logic [FullDataWidth-1:0] flash_rdata; 406 logic rd_calc_req; 407 logic [BankAddrW-1:0] rd_calc_addr; 408 logic rd_op_req; 409 logic [DataWidth-1:0] rd_scrambled_data; 410 logic [DataWidth-1:0] rd_descrambled_data; 411 412 // if host grant is encountered, transactions return in-band 413 // error until all transactions are flushed. 414 logic phy_rd_err; 415 1/1 assign rd_err_o = phy_rd_err; Tests: T1 T2 T3  416 417 418 // After host_gnt_rd_err asserts, no more host requests 419 // are granted until all transactions are flushed. This means 420 // the last outstanding transaction is by definition the "error". 421 // 422 // If ctrl_fsm_idle inexplicably goes low while there are host transactions 423 // the transaction handling may be irreversibly broken. 424 // The host_oustanding_rd_err makes a best effort attempt to cleanly 425 // recover. It responds with in-band error controller transactions until the 426 // all pending transactions are flushed. 427 logic arb_host_gnt_err; 428 1/1 assign arb_host_gnt_err = (host_gnt_rd_err & host_outstanding == 1'b1) | Tests: T1 T2 T3  429 (host_outstanding_rd_err); 430 431 flash_phy_rd u_rd ( 432 .clk_i, 433 .rst_ni, 434 .buf_en_i(rd_buf_en_i), 435 //.req_i(reqs[PhyRead] | host_req), 436 .req_i(phy_req & (rd_i | host_req)), 437 .descramble_i(muxed_scramble_en), 438 .ecc_i(muxed_ecc_en), 439 .prog_i(reqs[PhyProg]), 440 .pg_erase_i(reqs[PhyPgErase]), 441 .bk_erase_i(reqs[PhyBkErase]), 442 .addr_i(muxed_addr), 443 .part_i(muxed_part), 444 // info select cannot be generated by the host 445 .info_sel_i(info_sel_i), 446 .rdy_o(rd_stage_rdy), 447 .data_valid_o(rd_stage_data_valid), 448 .data_err_o(phy_rd_err), 449 .data_host_o(rd_data_host_o), 450 .data_ctrl_o(rd_data_ctrl_o), 451 .idle_o(rd_stage_idle), 452 // a catastrophic arbitration error has been observed, just dump 453 // dump returns until all transactions are flushed. 454 .arb_err_i(arb_host_gnt_err), 455 .req_o(flash_rd_req), 456 .ack_i(ack), 457 .done_i(done), 458 .data_i(arb_host_gnt_err ? {FullDataWidth{1'b1}} : flash_rdata), 459 //scramble unit interface 460 .calc_req_o(rd_calc_req), 461 .calc_addr_o(rd_calc_addr), 462 .descramble_req_o(rd_op_req), 463 .scrambled_data_o(rd_scrambled_data), 464 .calc_ack_i(calc_ack), 465 .descramble_ack_i(op_ack), 466 .mask_i(scramble_mask), 467 .descrambled_data_i(rd_descrambled_data), 468 .ecc_single_err_o, 469 .ecc_addr_o, 470 .relbl_ecc_err_o, 471 .intg_ecc_err_o, 472 .fifo_err_o 473 ); 474 475 //////////////////////// 476 // program pipeline 477 //////////////////////// 478 479 logic [FullDataWidth-1:0] prog_full_data; 480 logic [DataWidth-1:0] prog_scrambled_data; 481 logic [DataWidth-1:0] prog_data; 482 logic prog_last; 483 logic flash_prog_req; 484 logic prog_calc_req; 485 logic prog_op_req; 486 logic prog_fsm_err; 487 488 if (WidthMultiple == 1) begin : gen_single_prog_data 489 assign flash_prog_req = reqs[PhyProg]; 490 assign prog_data = prog_data_i[BusWidth-1:0]; 491 assign prog_fsm_err = '0; 492 end else begin : gen_prog_data 493 494 // SEC_CM: MEM.INTEGRITY 495 flash_phy_prog u_prog ( 496 .clk_i, 497 .rst_ni, 498 .req_i(reqs[PhyProg]), 499 .disable_i(flash_disable[ProgFsmDisableIdx]), 500 .scramble_i(muxed_scramble_en), 501 .ecc_i(muxed_ecc_en), 502 .sel_i(addr_i[0 +: WordSelW]), 503 .data_i(prog_data_i), 504 .last_i(prog_last_i), 505 .ack_i(ack), 506 .done_i(done), 507 .calc_ack_i(calc_ack), 508 .scramble_ack_i(op_ack), 509 .mask_i(scramble_mask), 510 .scrambled_data_i(prog_scrambled_data), 511 .calc_req_o(prog_calc_req), 512 .scramble_req_o(prog_op_req), 513 .req_o(flash_prog_req), 514 .last_o(prog_last), 515 .ack_o(prog_ack), 516 .block_data_o(prog_data), 517 .data_o(prog_full_data), 518 .fsm_err_o(prog_fsm_err), 519 .intg_err_o(prog_intg_err_o) 520 ); 521 end 522 523 1/1 assign fsm_err_o = fsm_err | prog_fsm_err; Tests: T1 T2 T3  524 525 //////////////////////// 526 // erase pipeline 527 //////////////////////// 528 529 logic flash_pg_erase_req; 530 logic flash_bk_erase_req; 531 logic erase_suspend_req; 532 flash_phy_erase u_erase ( 533 .clk_i, 534 .rst_ni, 535 .pg_erase_req_i(reqs[PhyPgErase]), 536 .bk_erase_req_i(reqs[PhyBkErase]), 537 .suspend_req_i(erase_suspend_req_i), 538 .ack_o(erase_ack), 539 .pg_erase_req_o(flash_pg_erase_req), 540 .bk_erase_req_o(flash_bk_erase_req), 541 .suspend_req_o(erase_suspend_req), 542 .ack_i(ack), 543 .done_i(done) 544 ); 545 546 //////////////////////// 547 // bundle data to send to shared scrambling module 548 //////////////////////// 549 550 1/1 assign scramble_req_o.calc_req = prog_calc_req | rd_calc_req; Tests: T1 T2 T3  551 1/1 assign scramble_req_o.op_req = prog_op_req | rd_op_req; Tests: T1 T2 T3  552 1/1 assign scramble_req_o.op_type = prog_op_req ? ScrambleOp : DeScrambleOp; Tests: T1 T2 T3  553 1/1 assign scramble_req_o.addr = prog_calc_req ? muxed_addr[BusBankAddrW-1:LsbAddrBit] : Tests: T1 T2 T3  554 rd_calc_addr; 555 1/1 assign scramble_req_o.plain_data = prog_data; Tests: T1 T2 T3  556 1/1 assign scramble_req_o.scrambled_data = rd_scrambled_data; Tests: T1 T2 T3  557 1/1 assign calc_ack = scramble_rsp_i.calc_ack; Tests: T1 T2 T3  558 1/1 assign op_ack = scramble_rsp_i.op_ack; Tests: T1 T2 T3  559 1/1 assign scramble_mask = scramble_rsp_i.mask; Tests: T1 T2 T3  560 1/1 assign rd_descrambled_data = scramble_rsp_i.plain_data; Tests: T1 T2 T3  561 1/1 assign prog_scrambled_data = scramble_rsp_i.scrambled_data; Tests: T1 T2 T3  562 563 //////////////////////// 564 // Actual connection to flash phy 565 //////////////////////// 566 567 // Connections to the actual flash macro wrapper 568 1/1 assign prim_flash_req_o = '{ Tests: T1 T2 T3  569 rd_req: flash_rd_req, 570 prog_req: flash_prog_req, 571 prog_last: prog_last, 572 prog_type: prog_type_i, 573 pg_erase_req: flash_pg_erase_req, 574 bk_erase_req: flash_bk_erase_req, 575 erase_suspend_req: erase_suspend_req, 576 // high endurance enable does not cause changes to 577 // transaction protocol and is forwarded directly to the wrapper 578 he: he_en_i, 579 addr: muxed_addr[BusBankAddrW-1:LsbAddrBit], 580 part: muxed_part, 581 info_sel: info_sel_i, 582 prog_full_data: prog_full_data 583 }; 584 585 1/1 assign ack = prim_flash_rsp_i.ack; Tests: T1 T2 T3  586 1/1 assign done = prim_flash_rsp_i.done; Tests: T1 T2 T3  587 1/1 assign flash_rdata = prim_flash_rsp_i.rdata; Tests: T1 T2 T3 

Cond Coverage for Module : flash_phy_core
TotalCoveredPercent
Conditions1069589.62
Logical1069589.62
Non-Logical00
Event00

 LINE       196
 EXPRESSION (host_gnt && (muxed_part != FlashPartData))
             ----1---    --------------2--------------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT8,T6,T20
11CoveredT11,T181,T214

 LINE       196
 SUB-EXPRESSION (muxed_part != FlashPartData)
                --------------1--------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       200
 EXPRESSION (((|host_outstanding)) & ((!ctrl_fsm_idle)))
             ----------1----------   ---------2--------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT8,T6,T20
11Not Covered

 LINE       205
 EXPRESSION (host_gnt_err_event | host_outstanding_err_event)
             ---------1--------   -------------2------------
-1--2-StatusTests
00CoveredT1,T2,T3
01Not Covered
10CoveredT11,T181,T214

 LINE       217
 EXPRESSION (host_outstanding == '0)
            ------------1-----------
-1-StatusTests
0CoveredT8,T6,T20
1CoveredT1,T2,T3

 LINE       231
 EXPRESSION ((host_outstanding == '0) && ctrl_fsm_idle)
             ------------1-----------    ------2------
-1--2-StatusTests
01CoveredT8,T6,T20
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       231
 SUB-EXPRESSION (host_outstanding == '0)
                ------------1-----------
-1-StatusTests
0CoveredT8,T6,T20
1CoveredT1,T2,T3

 LINE       242
 EXPRESSION (host_gnt && ((!host_req_done_o)) && (host_outstanding <= flash_phy_pkg::RspOrderDepth))
             ----1---    ----------2---------    -------------------------3------------------------
-1--2--3-StatusTests
011CoveredT1,T2,T3
101CoveredT8,T6,T20
110Not Covered
111CoveredT8,T6,T20

 LINE       242
 EXPRESSION (((!host_gnt)) && host_req_done_o && ((|host_outstanding)))
             ------1------    -------2-------    ----------3----------
-1--2--3-StatusTests
011CoveredT8,T6,T20
101CoveredT8,T6,T20
110Not Covered
111CoveredT8,T6,T20

 LINE       281
 EXPRESSION (host_req & host_req_rdy_o)
             ----1---   -------2------
-1--2-StatusTests
01CoveredT105
10CoveredT10,T11,T34
11CoveredT8,T6,T20

 LINE       282
 EXPRESSION (((|host_outstanding)) & rd_stage_data_valid)
             ----------1----------   ---------2---------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT8,T6,T20
11CoveredT8,T6,T20

 LINE       317
 EXPRESSION ((phy_req & host_req) ? rd_stage_rdy : rd_stage_idle)
             ----------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T6,T20

 LINE       317
 SUB-EXPRESSION (phy_req & host_req)
                 ---1---   ----2---
-1--2-StatusTests
01CoveredT103,T104,T219
10CoveredT1,T2,T3
11CoveredT8,T6,T20

 LINE       321
 EXPRESSION (req_i & host_gnt)
             --1--   ----2---
-1--2-StatusTests
01CoveredT8,T6,T20
10CoveredT1,T2,T3
11CoveredT10,T11,T19

 LINE       336
 EXPRESSION (ctrl_gnt && rd_i)
             ----1---    --2-
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T4
11CoveredT1,T2,T3

 LINE       338
 EXPRESSION (ctrl_gnt && prog_i)
             ----1---    ---2--
-1--2-StatusTests
01CoveredT1,T2,T4
10CoveredT9,T27,T28
11CoveredT1,T2,T4

 LINE       388
 EXPRESSION ((ctrl_fsm_idle & ctrl_rsp_vld) | ((host_outstanding == '0) & host_req_done_o))
             ---------------1--------------   ----------------------2---------------------
-1--2-StatusTests
00CoveredT1,T2,T3
01Not Covered
10CoveredT10,T106,T216

 LINE       388
 SUB-EXPRESSION (ctrl_fsm_idle & ctrl_rsp_vld)
                 ------1------   ------2-----
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T3
11CoveredT10,T106,T216

 LINE       388
 SUB-EXPRESSION ((host_outstanding == '0) & host_req_done_o)
                 ------------1-----------   -------2-------
-1--2-StatusTests
01CoveredT8,T6,T20
10CoveredT1,T2,T3
11Not Covered

 LINE       388
 SUB-EXPRESSION (host_outstanding == '0)
                ------------1-----------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       392
 EXPRESSION (host_sel ? host_addr_i : addr_i)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T6,T20

 LINE       393
 EXPRESSION (host_sel ? FlashPartData : part_i)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T6,T20

 LINE       394
 EXPRESSION (host_sel ? host_scramble_en_i : scramble_en_i)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T6,T20

 LINE       395
 EXPRESSION (host_sel ? host_ecc_en_i : ecc_en_i)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T6,T20

 LINE       396
 EXPRESSION (ctrl_rsp_vld & rd_i)
             ------1-----   --2-
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T4
11CoveredT1,T2,T3

 LINE       397
 EXPRESSION (ctrl_rsp_vld & prog_i)
             ------1-----   ---2--
-1--2-StatusTests
01CoveredT1,T2,T4
10CoveredT1,T2,T3
11CoveredT1,T2,T4

 LINE       398
 EXPRESSION (ctrl_rsp_vld & (pg_erase_i | bk_erase_i))
             ------1-----   ------------2------------
-1--2-StatusTests
01CoveredT9,T27,T28
10CoveredT1,T2,T3
11CoveredT9,T27,T28

 LINE       398
 SUB-EXPRESSION (pg_erase_i | bk_erase_i)
                 -----1----   -----2----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT29,T30,T31
10CoveredT9,T27,T28

 LINE       428
 EXPRESSION ((host_gnt_rd_err & (host_outstanding == 1'b1)) | host_outstanding_rd_err)
             -----------------------1----------------------   -----------2-----------
-1--2-StatusTests
00CoveredT1,T2,T3
01Not Covered
10Not Covered

 LINE       428
 SUB-EXPRESSION (host_gnt_rd_err & (host_outstanding == 1'b1))
                 -------1-------   -------------2------------
-1--2-StatusTests
01CoveredT8,T6,T20
10Not Covered
11Not Covered

 LINE       428
 SUB-EXPRESSION (host_outstanding == 1'b1)
                -------------1------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T6,T20

 LINE       431
 EXPRESSION (phy_req & (rd_i | host_req))
             ---1---   --------2--------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T4
11CoveredT1,T2,T3

 LINE       431
 SUB-EXPRESSION (rd_i | host_req)
                 --1-   ----2---
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT8,T6,T20
10CoveredT1,T2,T3

 LINE       431
 EXPRESSION (arb_host_gnt_err ? ({flash_phy_pkg::FullDataWidth {1'b1}}) : flash_rdata)
             --------1-------
-1-StatusTests
0CoveredT1,T2,T3
1Not Covered

 LINE       523
 EXPRESSION (fsm_err | prog_fsm_err)
             ---1---   ------2-----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT12,T13,T14
10CoveredT12,T13,T14

 LINE       550
 EXPRESSION (prog_calc_req | rd_calc_req)
             ------1------   -----2-----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT1,T2,T3
10CoveredT1,T4,T5

 LINE       551
 EXPRESSION (prog_op_req | rd_op_req)
             -----1-----   ----2----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT1,T2,T3
10CoveredT1,T4,T5

 LINE       552
 EXPRESSION (prog_op_req ? ScrambleOp : DeScrambleOp)
             -----1-----
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T4,T5

 LINE       553
 EXPRESSION (prog_calc_req ? muxed_addr[(flash_phy_pkg::BusBankAddrW - 1):flash_phy_pkg::LsbAddrBit] : rd_calc_addr)
             ------1------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T4,T5

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

State, Transition and Sequence Details for FSM :: state_q
states   Line No.   Covered   Tests   
StCtrl 341 Covered T9,T27,T28
StCtrlProg 339 Covered T1,T2,T4
StCtrlRead 337 Covered T1,T2,T3
StDisable 335 Covered T4,T5,T6
StIdle 349 Covered T1,T2,T3


transitions   Line No.   Covered   Tests   
StCtrl->StIdle 369 Covered T9,T27,T28
StCtrlProg->StIdle 359 Covered T1,T2,T4
StCtrlRead->StIdle 349 Covered T1,T2,T3
StIdle->StCtrl 341 Covered T9,T27,T28
StIdle->StCtrlProg 339 Covered T1,T2,T4
StIdle->StCtrlRead 337 Covered T1,T2,T3
StIdle->StDisable 335 Covered T4,T5,T6



Branch Coverage for Module : flash_phy_core
Line No.TotalCoveredPercent
Branches 46 43 93.48
TERNARY 317 2 2 100.00
TERNARY 392 2 2 100.00
TERNARY 393 2 2 100.00
TERNARY 394 2 2 100.00
TERNARY 395 2 2 100.00
TERNARY 552 2 2 100.00
TERNARY 553 2 2 100.00
TERNARY 431 2 1 50.00
IF 152 4 4 100.00
IF 165 2 2 100.00
IF 203 3 3 100.00
IF 215 4 3 75.00
IF 229 4 3 75.00
CASE 331 13 13 100.00


317 assign phy_rdy = phy_req & host_req ? rd_stage_rdy : rd_stage_idle; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T8,T6,T20
0 Covered T1,T2,T3


392 assign muxed_addr = host_sel ? host_addr_i : addr_i; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T8,T6,T20
0 Covered T1,T2,T3


393 assign muxed_part = host_sel ? flash_ctrl_pkg::FlashPartData : part_i; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T8,T6,T20
0 Covered T1,T2,T3


394 assign muxed_scramble_en = host_sel ? host_scramble_en_i : scramble_en_i; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T8,T6,T20
0 Covered T1,T2,T3


395 assign muxed_ecc_en = host_sel ? host_ecc_en_i : ecc_en_i; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T8,T6,T20
0 Covered T1,T2,T3


552 assign scramble_req_o.op_type = prog_op_req ? ScrambleOp : DeScrambleOp; -1- ==> ==>

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


553 assign scramble_req_o.addr = prog_calc_req ? muxed_addr[BusBankAddrW-1:LsbAddrBit] : -1- ==> ==>

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


431 flash_phy_rd u_rd ( 432 .clk_i, 433 .rst_ni, 434 .buf_en_i(rd_buf_en_i), 435 //.req_i(reqs[PhyRead] | host_req), 436 .req_i(phy_req & (rd_i | host_req)), 437 .descramble_i(muxed_scramble_en), 438 .ecc_i(muxed_ecc_en), 439 .prog_i(reqs[PhyProg]), 440 .pg_erase_i(reqs[PhyPgErase]), 441 .bk_erase_i(reqs[PhyBkErase]), 442 .addr_i(muxed_addr), 443 .part_i(muxed_part), 444 // info select cannot be generated by the host 445 .info_sel_i(info_sel_i), 446 .rdy_o(rd_stage_rdy), 447 .data_valid_o(rd_stage_data_valid), 448 .data_err_o(phy_rd_err), 449 .data_host_o(rd_data_host_o), 450 .data_ctrl_o(rd_data_ctrl_o), 451 .idle_o(rd_stage_idle), 452 // a catastrophic arbitration error has been observed, just dump 453 // dump returns until all transactions are flushed. 454 .arb_err_i(arb_host_gnt_err), 455 .req_o(flash_rd_req), 456 .ack_i(ack), 457 .done_i(done), 458 .data_i(arb_host_gnt_err ? {FullDataWidth{1'b1}} : flash_rdata), -1- ==> ==>

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


152 if (!rst_ni) begin -1- 153 arb_cnt <= '0; ==> 154 end else if (ctrl_rsp_vld) begin -2- 155 arb_cnt <= '0; ==> 156 end else if (inc_arb_cnt) begin -3- 157 arb_cnt <= arb_cnt + 1'b1; ==> 158 end MISSING_ELSE ==>

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


165 `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


203 if (!rst_ni) begin -1- 204 host_gnt_err_o <= '0; ==> 205 end else if (host_gnt_err_event | host_outstanding_err_event) begin -2- 206 host_gnt_err_o <= 1'b1; ==> 207 end MISSING_ELSE ==>

Branches:
-1--2-StatusTests
1 - Covered T1,T2,T3
0 1 Covered T11,T181,T214
0 0 Covered T1,T2,T3


215 if (!rst_ni) begin -1- 216 host_gnt_rd_err <= '0; ==> 217 end else if (host_outstanding == '0) begin -2- 218 host_gnt_rd_err <= '0; ==> 219 end else if (host_gnt_err_event) begin -3- 220 host_gnt_rd_err <= 1'b1; ==> 221 end MISSING_ELSE ==>

Branches:
-1--2--3-StatusTests
1 - - Covered T1,T2,T3
0 1 - Covered T1,T2,T3
0 0 1 Not Covered
0 0 0 Covered T8,T6,T20


229 if (!rst_ni) begin -1- 230 host_outstanding_rd_err <= '0; ==> 231 end else if (host_outstanding == '0 && ctrl_fsm_idle) begin -2- 232 host_outstanding_rd_err <= '0; ==> 233 end else if (host_outstanding_err_event) begin -3- 234 host_outstanding_rd_err <= 1'b1; ==> 235 end MISSING_ELSE ==>

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


331 unique case (state_q) -1- 332 StIdle: begin 333 ctrl_fsm_idle = 1'b1; 334 if (mubi4_test_true_loose(flash_disable[FsmDisableIdx])) begin -2- 335 state_d = StDisable; ==> 336 end else if (ctrl_gnt && rd_i) begin -3- 337 state_d = StCtrlRead; ==> 338 end else if (ctrl_gnt && prog_i) begin -4- 339 state_d = StCtrlProg; ==> 340 end else if (ctrl_gnt) begin -5- 341 state_d = StCtrl; ==> 342 end MISSING_ELSE ==> 343 end 344 345 // Controller reads are very slow. 346 StCtrlRead: begin 347 if (rd_stage_data_valid) begin -6- 348 ctrl_rsp_vld = 1'b1; ==> 349 state_d = StIdle; 350 end MISSING_ELSE ==> 351 end 352 353 // Controller program data may be packed based on 354 // address alignment 355 StCtrlProg: begin 356 reqs[PhyProg] = 1'b1; 357 if (prog_ack) begin -7- 358 ctrl_rsp_vld = 1'b1; ==> 359 state_d = StIdle; 360 end MISSING_ELSE ==> 361 end 362 363 // other controller operations directly interface with flash 364 StCtrl: begin 365 reqs[PhyPgErase] = pg_erase_i; 366 reqs[PhyBkErase] = bk_erase_i; 367 if (erase_ack) begin -8- 368 ctrl_rsp_vld = 1'b1; ==> 369 state_d = StIdle; 370 end MISSING_ELSE ==> 371 end 372 373 StDisable: begin 374 ctrl_fsm_idle = 1'b1; ==> 375 state_d = StDisable; 376 end 377 378 default: begin 379 ctrl_fsm_idle = 1'b1; ==>

Branches:
-1--2--3--4--5--6--7--8-StatusTests
StIdle 1 - - - - - - Covered T4,T5,T6
StIdle 0 1 - - - - - Covered T1,T2,T3
StIdle 0 0 1 - - - - Covered T1,T2,T4
StIdle 0 0 0 1 - - - Covered T9,T27,T28
StIdle 0 0 0 0 - - - Covered T1,T2,T3
StCtrlRead - - - - 1 - - Covered T1,T2,T3
StCtrlRead - - - - 0 - - Covered T1,T2,T3
StCtrlProg - - - - - 1 - Covered T1,T2,T4
StCtrlProg - - - - - 0 - Covered T1,T2,T4
StCtrl - - - - - - 1 Covered T9,T27,T28
StCtrl - - - - - - 0 Covered T9,T27,T28
StDisable - - - - - - - Covered T4,T5,T6
default - - - - - - - Covered T12,T13,T14


Assert Coverage for Module : flash_phy_core
TotalAttemptedPercentSucceeded/MatchedPercent
Assertions 8 8 100.00 8 100.00
Cover properties 0 0 0
Cover sequences 0 0 0
Total 8 8 100.00 8 100.00




Assertion Details

Name   Attempts   Real Successes   Failures   Incomplete   
ArbCntMax_A 665750786 2994540 0 0
CtrlPrio_A 665750786 2994540 0 0
HostTransIdleChk_A 665750786 44099721 0 0
NoRemainder_A 2052 2052 0 0
OneHotReqs_A 665750786 664017318 0 0
Pow2Multiple_A 2052 2052 0 0
RdTxnCheck_A 665332322 663598854 0 0
u_state_regs_A 665750786 664017318 0 0


ArbCntMax_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 665750786 2994540 0 0
T29 147420 0 0 0
T43 0 5562 0 0
T52 110578 3224 0 0
T60 910092 0 0 0
T61 121700 3939 0 0
T67 179198 0 0 0
T74 117636 3089 0 0
T82 0 4881 0 0
T84 197298 0 0 0
T92 422020 0 0 0
T103 0 35 0 0
T123 0 4624 0 0
T124 0 8954 0 0
T179 0 3340 0 0
T218 121000 10 0 0
T220 0 7355 0 0
T221 2894 0 0 0

CtrlPrio_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 665750786 2994540 0 0
T29 147420 0 0 0
T43 0 5562 0 0
T52 110578 3224 0 0
T60 910092 0 0 0
T61 121700 3939 0 0
T67 179198 0 0 0
T74 117636 3089 0 0
T82 0 4881 0 0
T84 197298 0 0 0
T92 422020 0 0 0
T103 0 35 0 0
T123 0 4624 0 0
T124 0 8954 0 0
T179 0 3340 0 0
T218 121000 10 0 0
T220 0 7355 0 0
T221 2894 0 0 0

HostTransIdleChk_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 665750786 44099721 0 0
T6 1746 25 0 0
T8 102564 622 0 0
T9 4220 0 0 0
T10 2526 20 0 0
T11 936 8 0 0
T17 3690 0 0 0
T19 0 588 0 0
T20 2210 15 0 0
T24 0 40 0 0
T27 0 52 0 0
T33 3308 0 0 0
T34 0 12 0 0
T36 0 759 0 0
T51 0 139 0 0
T59 2338 0 0 0
T64 0 884 0 0
T66 2482 0 0 0

NoRemainder_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 2052 2052 0 0
T1 2 2 0 0
T2 2 2 0 0
T3 2 2 0 0
T4 2 2 0 0
T5 2 2 0 0
T6 2 2 0 0
T8 2 2 0 0
T15 2 2 0 0
T16 2 2 0 0
T17 2 2 0 0

OneHotReqs_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 665750786 664017318 0 0
T1 2950 2722 0 0
T2 7388 7200 0 0
T3 4566 4388 0 0
T4 8750 7704 0 0
T5 2500 2302 0 0
T6 1746 1552 0 0
T8 102564 102464 0 0
T15 1898 1772 0 0
T16 3668 3490 0 0
T17 3690 3492 0 0

Pow2Multiple_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 2052 2052 0 0
T1 2 2 0 0
T2 2 2 0 0
T3 2 2 0 0
T4 2 2 0 0
T5 2 2 0 0
T6 2 2 0 0
T8 2 2 0 0
T15 2 2 0 0
T16 2 2 0 0
T17 2 2 0 0

RdTxnCheck_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 665332322 663598854 0 0
T1 2950 2722 0 0
T2 7388 7200 0 0
T3 4566 4388 0 0
T4 8750 7704 0 0
T5 2500 2302 0 0
T6 1746 1552 0 0
T8 102564 102464 0 0
T15 1898 1772 0 0
T16 3668 3490 0 0
T17 3690 3492 0 0

u_state_regs_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 665750786 664017318 0 0
T1 2950 2722 0 0
T2 7388 7200 0 0
T3 4566 4388 0 0
T4 8750 7704 0 0
T5 2500 2302 0 0
T6 1746 1552 0 0
T8 102564 102464 0 0
T15 1898 1772 0 0
T16 3668 3490 0 0
T17 3690 3492 0 0

Line Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[1].u_core
Line No.TotalCoveredPercent
TOTAL898696.63
ALWAYS15266100.00
ALWAYS16533100.00
CONT_ASSIGN19611100.00
CONT_ASSIGN20011100.00
ALWAYS2034375.00
ALWAYS2156583.33
ALWAYS2296583.33
CONT_ASSIGN27711100.00
CONT_ASSIGN28011100.00
CONT_ASSIGN28111100.00
CONT_ASSIGN28211100.00
CONT_ASSIGN28711100.00
CONT_ASSIGN31711100.00
CONT_ASSIGN32111100.00
ALWAYS3252929100.00
CONT_ASSIGN38811100.00
CONT_ASSIGN39211100.00
CONT_ASSIGN39311100.00
CONT_ASSIGN39411100.00
CONT_ASSIGN39511100.00
CONT_ASSIGN39611100.00
CONT_ASSIGN39711100.00
CONT_ASSIGN39811100.00
CONT_ASSIGN41511100.00
CONT_ASSIGN42811100.00
CONT_ASSIGN52311100.00
CONT_ASSIGN55011100.00
CONT_ASSIGN55111100.00
CONT_ASSIGN55211100.00
CONT_ASSIGN55311100.00
CONT_ASSIGN55511100.00
CONT_ASSIGN55611100.00
CONT_ASSIGN55711100.00
CONT_ASSIGN55811100.00
CONT_ASSIGN55911100.00
CONT_ASSIGN56011100.00
CONT_ASSIGN56111100.00
CONT_ASSIGN56811100.00
CONT_ASSIGN58511100.00
CONT_ASSIGN58611100.00
CONT_ASSIGN58711100.00

151 always_ff @(posedge clk_i or negedge rst_ni) begin 152 1/1 if (!rst_ni) begin Tests: T1 T2 T3  153 1/1 arb_cnt <= '0; Tests: T1 T2 T3  154 1/1 end else if (ctrl_rsp_vld) begin Tests: T1 T2 T3  155 1/1 arb_cnt <= '0; Tests: T4 T16 T8  156 1/1 end else if (inc_arb_cnt) begin Tests: T1 T2 T3  157 1/1 arb_cnt <= arb_cnt + 1'b1; Tests: T52 T74 T61  158 end MISSING_ELSE 159 end 160 161 import prim_mubi_pkg::mubi4_test_false_strict; 162 import prim_mubi_pkg::mubi4_test_true_loose; 163 164 // SEC_CM: PHY.FSM.SPARSE 165 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): 165.1 `ifdef SIMULATION 165.2 prim_sparse_fsm_flop #( 165.3 .StateEnumT(state_e), 165.4 .Width($bits(state_e)), 165.5 .ResetValue($bits(state_e)'(StIdle)), 165.6 .EnableAlertTriggerSVA(1), 165.7 .CustomForceName("state_q") 165.8 ) u_state_regs ( 165.9 .clk_i ( clk_i ), 165.10 .rst_ni ( rst_ni ), 165.11 .state_i ( state_d ), 165.12 .state_o ( ) 165.13 ); 165.14 always_ff @(posedge clk_i or negedge rst_ni) begin 165.15 1/1 if (!rst_ni) begin Tests: T1 T2 T3  165.16 1/1 state_q <= StIdle; Tests: T1 T2 T3  165.17 end else begin 165.18 1/1 state_q <= state_d; Tests: T1 T2 T3  165.19 end 165.20 end 165.21 u_state_regs_A: assert property (@(posedge clk_i) disable iff ((!rst_ni) !== '0) (state_q === u_state_regs.state_o)) 165.22 else begin 165.23 `ifdef UVM 165.24 uvm_pkg::uvm_report_error("ASSERT FAILED", "u_state_regs_A", uvm_pkg::UVM_NONE, 165.25 "../src/lowrisc_opentitan_top_earlgrey_flash_ctrl_0.1/rtl/flash_phy_core.sv", 165, "", 1); 165.26 `else 165.27 $error("%0t: (%0s:%0d) [%m] [ASSERT FAILED] %0s", $time, `__FILE__, `__LINE__, 165.28 `PRIM_STRINGIFY(u_state_regs_A)); 165.29 `endif 165.30 end 165.31 `else 165.32 prim_sparse_fsm_flop #( 165.33 .StateEnumT(state_e), 165.34 .Width($bits(state_e)), 165.35 .ResetValue($bits(state_e)'(StIdle)), 165.36 .EnableAlertTriggerSVA(1) 165.37 ) u_state_regs ( 165.38 .clk_i ( `PRIM_FLOP_CLK ), 165.39 .rst_ni ( `PRIM_FLOP_RST ), 165.40 .state_i ( state_d ), 165.41 .state_o ( state_q ) 165.42 ); 165.43 `endif166 167 typedef enum logic [2:0] { 168 HostDisableIdx, 169 CtrlDisableIdx, 170 FsmDisableIdx, 171 ProgFsmDisableIdx, 172 LastDisableIdx 173 } phy_core_disable_e; 174 175 prim_mubi_pkg::mubi4_t [LastDisableIdx-1:0] flash_disable; 176 prim_mubi4_sync #( 177 .NumCopies(int'(LastDisableIdx)), 178 .AsyncOn(0) 179 ) u_disable_buf ( 180 .clk_i, 181 .rst_ni, 182 .mubi_i(flash_disable_i), 183 .mubi_o(flash_disable) 184 ); 185 186 // Oustanding width is slightly larger to ensure a faulty increment is able to reach 187 // the higher value. For example if RspOrderDepth were 3, a clog2 of 3 would still be 2 188 // and not allow the counter to increment to 4. 189 localparam int OutstandingRdWidth = $clog2(RspOrderDepth+2); 190 logic [OutstandingRdWidth-1:0] host_outstanding; 191 logic ctrl_fsm_idle; 192 logic host_req; 193 // SEC_CM: PHY_HOST_GRANT.CTRL.CONSISTENCY 194 // A host transaction was granted to the muxed partition, this is illegal 195 logic host_gnt_err_event; 196 1/1 assign host_gnt_err_event = (host_gnt && muxed_part != flash_ctrl_pkg::FlashPartData); Tests: T1 T2 T3  197 // Controller fsm became non idle when there are pending host transactions, this is 198 // illegal. 199 logic host_outstanding_err_event; 200 1/1 assign host_outstanding_err_event = |host_outstanding & !ctrl_fsm_idle; Tests: T1 T2 T3  201 202 always_ff @(posedge clk_i or negedge rst_ni) begin 203 1/1 if (!rst_ni) begin Tests: T1 T2 T3  204 1/1 host_gnt_err_o <= '0; Tests: T1 T2 T3  205 1/1 end else if (host_gnt_err_event | host_outstanding_err_event) begin Tests: T1 T2 T3  206 0/1 ==> host_gnt_err_o <= 1'b1; 207 end MISSING_ELSE 208 end 209 210 // When host grant errors occur, also create in band error responses. 211 // The error condition is held until all existing host transactions are 212 // processed. 213 logic host_gnt_rd_err; 214 always_ff @(posedge clk_i or negedge rst_ni) begin 215 1/1 if (!rst_ni) begin Tests: T1 T2 T3  216 1/1 host_gnt_rd_err <= '0; Tests: T1 T2 T3  217 1/1 end else if (host_outstanding == '0) begin Tests: T1 T2 T3  218 1/1 host_gnt_rd_err <= '0; Tests: T1 T2 T3  219 1/1 end else if (host_gnt_err_event) begin Tests: T8 T10 T11  220 0/1 ==> host_gnt_rd_err <= 1'b1; 221 end MISSING_ELSE 222 end 223 224 // When host outstanding errors occur, also create in band error responses. 225 // The error condition is held until all existing host and controller 226 // transactions are processed. 227 logic host_outstanding_rd_err; 228 always_ff @(posedge clk_i or negedge rst_ni) begin 229 1/1 if (!rst_ni) begin Tests: T1 T2 T3  230 1/1 host_outstanding_rd_err <= '0; Tests: T1 T2 T3  231 1/1 end else if (host_outstanding == '0 && ctrl_fsm_idle) begin Tests: T1 T2 T3  232 1/1 host_outstanding_rd_err <= '0; Tests: T1 T2 T3  233 1/1 end else if (host_outstanding_err_event) begin Tests: T4 T16 T8  234 0/1 ==> host_outstanding_rd_err <= 1'b1; 235 end MISSING_ELSE 236 end 237 238 // SEC_CM: PHY_HOST_GRANT.CTRL.CONSISTENCY 239 prim_count #( 240 .Width(OutstandingRdWidth), 241 .ResetValue('0) 242 ) u_host_outstanding_cnt ( 243 .clk_i, 244 .rst_ni, 245 .clr_i('0), 246 .set_i('0), 247 .set_cnt_i('0), 248 .incr_en_i(host_gnt && !host_req_done_o && (host_outstanding <= RspOrderDepth)), 249 .decr_en_i(!host_gnt && host_req_done_o && |host_outstanding), 250 .step_i(OutstandingRdWidth'(1'b1)), 251 .commit_i(1'b1), 252 .cnt_o(host_outstanding), 253 .cnt_after_commit_o(), 254 .err_o(cnt_err_o) 255 ); 256 257 // If host_outstanding is non-zero, the controller fsm must be idle.. 258 // This assertion needs to be disabled for sec_cm testing 259 `ASSERT(HostTransIdleChk_A, |host_outstanding |-> ctrl_fsm_idle) 260 261 //always_ff @(posedge clk_i or negedge rst_ni) begin 262 // if (!rst_ni) begin 263 // host_outstanding <= '0; 264 // end else if (host_gnt && !host_req_done_o && (host_outstanding <= RspOrderDepth)) begin 265 // host_outstanding <= host_outstanding + 1'b1; 266 // end else if (!host_gnt && host_req_done_o && |host_outstanding) begin 267 // host_outstanding <= host_outstanding - 1'b1; 268 // end 269 //end 270 271 `ASSERT(RdTxnCheck_A, host_outstanding <= RspOrderDepth) 272 273 // The host request is suppressed under a variety of conditions: 274 // 1. If a controller transaction is already ongoing. 275 // 2. If a grant or outstanding error has already been observed but not yet 276 // fully processed. 277 1/1 assign host_req = host_req_i & (arb_cnt < ArbCnt[CntWidth-1:0]) & ctrl_fsm_idle & Tests: T1 T2 T3  278 !host_gnt_rd_err & !host_outstanding_rd_err & 279 mubi4_test_false_strict(flash_disable[HostDisableIdx]); 280 1/1 assign host_sel = host_req; Tests: T1 T2 T4  281 1/1 assign host_gnt = host_req & host_req_rdy_o; Tests: T1 T2 T4  282 1/1 assign host_req_done_o = |host_outstanding & rd_stage_data_valid; Tests: T1 T2 T3  283 284 // controller request can only win after the entire read pipeline 285 // clears 286 logic ctrl_req; 287 1/1 assign ctrl_req = req_i & rd_stage_idle & Tests: T1 T2 T3  288 !host_gnt_rd_err & !host_outstanding_rd_err & 289 mubi4_test_false_strict(flash_disable[CtrlDisableIdx]); 290 291 logic [1:0] data_tie_off [2]; 292 assign data_tie_off = '{default: '0}; 293 294 // SEC_CM: PHY_ARBITER.CTRL.REDUN 295 logic phy_req; 296 logic phy_rdy; 297 298 prim_arbiter_tree_dup #( 299 .N(2), 300 .DW(2), 301 .EnDataPort('0), 302 .FixedArb(1) 303 ) u_host_arb ( 304 .clk_i, 305 .rst_ni, 306 .req_chk_i('0), 307 .req_i({ctrl_req, host_req}), 308 .data_i(data_tie_off), 309 .gnt_o({ctrl_gnt, host_req_rdy_o}), 310 .idx_o(), 311 .valid_o(phy_req), 312 .data_o(), 313 .ready_i(phy_rdy), 314 .err_o(arb_err_o) 315 ); 316 317 1/1 assign phy_rdy = phy_req & host_req ? rd_stage_rdy : rd_stage_idle; Tests: T1 T2 T3  318 319 320 // if request happens at the same time as a host grant, increment count 321 1/1 assign inc_arb_cnt = req_i & host_gnt; Tests: T1 T2 T3  322 323 logic fsm_err; 324 always_comb begin 325 1/1 state_d = state_q; Tests: T1 T2 T3  326 1/1 reqs = '0; Tests: T1 T2 T3  327 1/1 ctrl_rsp_vld = '0; Tests: T1 T2 T3  328 1/1 fsm_err = '0; Tests: T1 T2 T3  329 1/1 ctrl_fsm_idle = '0; Tests: T1 T2 T3  330 331 1/1 unique case (state_q) Tests: T1 T2 T3  332 StIdle: begin 333 1/1 ctrl_fsm_idle = 1'b1; Tests: T1 T2 T3  334 1/1 if (mubi4_test_true_loose(flash_disable[FsmDisableIdx])) begin Tests: T1 T2 T3  335 1/1 state_d = StDisable; Tests: T4 T5 T6  336 1/1 end else if (ctrl_gnt && rd_i) begin Tests: T1 T2 T3  337 1/1 state_d = StCtrlRead; Tests: T16 T8 T17  338 1/1 end else if (ctrl_gnt && prog_i) begin Tests: T1 T2 T3  339 1/1 state_d = StCtrlProg; Tests: T4 T33 T34  340 1/1 end else if (ctrl_gnt) begin Tests: T1 T2 T3  341 1/1 state_d = StCtrl; Tests: T27 T28 T35  342 end MISSING_ELSE 343 end 344 345 // Controller reads are very slow. 346 StCtrlRead: begin 347 1/1 if (rd_stage_data_valid) begin Tests: T16 T8 T17  348 1/1 ctrl_rsp_vld = 1'b1; Tests: T16 T8 T17  349 1/1 state_d = StIdle; Tests: T16 T8 T17  350 end MISSING_ELSE 351 end 352 353 // Controller program data may be packed based on 354 // address alignment 355 StCtrlProg: begin 356 1/1 reqs[PhyProg] = 1'b1; Tests: T4 T33 T34  357 1/1 if (prog_ack) begin Tests: T4 T33 T34  358 1/1 ctrl_rsp_vld = 1'b1; Tests: T4 T33 T34  359 1/1 state_d = StIdle; Tests: T4 T33 T34  360 end MISSING_ELSE 361 end 362 363 // other controller operations directly interface with flash 364 StCtrl: begin 365 1/1 reqs[PhyPgErase] = pg_erase_i; Tests: T27 T28 T35  366 1/1 reqs[PhyBkErase] = bk_erase_i; Tests: T27 T28 T35  367 1/1 if (erase_ack) begin Tests: T27 T28 T35  368 1/1 ctrl_rsp_vld = 1'b1; Tests: T27 T28 T35  369 1/1 state_d = StIdle; Tests: T27 T28 T35  370 end MISSING_ELSE 371 end 372 373 StDisable: begin 374 1/1 ctrl_fsm_idle = 1'b1; Tests: T4 T5 T6  375 1/1 state_d = StDisable; Tests: T4 T5 T6  376 end 377 378 default: begin 379 ctrl_fsm_idle = 1'b1; 380 fsm_err = 1'b1; 381 end 382 383 endcase // unique case (state_q) 384 end // always_comb 385 386 // determine spurious acks 387 // SEC_CM: PHY_ACK.CTRL.CONSISTENCY 388 1/1 assign spurious_ack_o = (ctrl_fsm_idle & ctrl_rsp_vld) | Tests: T1 T2 T3  389 ((host_outstanding == '0) & host_req_done_o); 390 391 // transactions coming from flash controller are always data type 392 1/1 assign muxed_addr = host_sel ? host_addr_i : addr_i; Tests: T1 T2 T3  393 1/1 assign muxed_part = host_sel ? flash_ctrl_pkg::FlashPartData : part_i; Tests: T1 T2 T3  394 1/1 assign muxed_scramble_en = host_sel ? host_scramble_en_i : scramble_en_i; Tests: T1 T2 T3  395 1/1 assign muxed_ecc_en = host_sel ? host_ecc_en_i : ecc_en_i; Tests: T1 T2 T3  396 1/1 assign rd_done_o = ctrl_rsp_vld & rd_i; Tests: T1 T2 T3  397 1/1 assign prog_done_o = ctrl_rsp_vld & prog_i; Tests: T1 T2 T3  398 1/1 assign erase_done_o = ctrl_rsp_vld & (pg_erase_i | bk_erase_i); Tests: T1 T2 T3  399 400 //////////////////////// 401 // read pipeline 402 //////////////////////// 403 404 logic flash_rd_req; 405 logic [FullDataWidth-1:0] flash_rdata; 406 logic rd_calc_req; 407 logic [BankAddrW-1:0] rd_calc_addr; 408 logic rd_op_req; 409 logic [DataWidth-1:0] rd_scrambled_data; 410 logic [DataWidth-1:0] rd_descrambled_data; 411 412 // if host grant is encountered, transactions return in-band 413 // error until all transactions are flushed. 414 logic phy_rd_err; 415 1/1 assign rd_err_o = phy_rd_err; Tests: T1 T2 T3  416 417 418 // After host_gnt_rd_err asserts, no more host requests 419 // are granted until all transactions are flushed. This means 420 // the last outstanding transaction is by definition the "error". 421 // 422 // If ctrl_fsm_idle inexplicably goes low while there are host transactions 423 // the transaction handling may be irreversibly broken. 424 // The host_oustanding_rd_err makes a best effort attempt to cleanly 425 // recover. It responds with in-band error controller transactions until the 426 // all pending transactions are flushed. 427 logic arb_host_gnt_err; 428 1/1 assign arb_host_gnt_err = (host_gnt_rd_err & host_outstanding == 1'b1) | Tests: T1 T2 T3  429 (host_outstanding_rd_err); 430 431 flash_phy_rd u_rd ( 432 .clk_i, 433 .rst_ni, 434 .buf_en_i(rd_buf_en_i), 435 //.req_i(reqs[PhyRead] | host_req), 436 .req_i(phy_req & (rd_i | host_req)), 437 .descramble_i(muxed_scramble_en), 438 .ecc_i(muxed_ecc_en), 439 .prog_i(reqs[PhyProg]), 440 .pg_erase_i(reqs[PhyPgErase]), 441 .bk_erase_i(reqs[PhyBkErase]), 442 .addr_i(muxed_addr), 443 .part_i(muxed_part), 444 // info select cannot be generated by the host 445 .info_sel_i(info_sel_i), 446 .rdy_o(rd_stage_rdy), 447 .data_valid_o(rd_stage_data_valid), 448 .data_err_o(phy_rd_err), 449 .data_host_o(rd_data_host_o), 450 .data_ctrl_o(rd_data_ctrl_o), 451 .idle_o(rd_stage_idle), 452 // a catastrophic arbitration error has been observed, just dump 453 // dump returns until all transactions are flushed. 454 .arb_err_i(arb_host_gnt_err), 455 .req_o(flash_rd_req), 456 .ack_i(ack), 457 .done_i(done), 458 .data_i(arb_host_gnt_err ? {FullDataWidth{1'b1}} : flash_rdata), 459 //scramble unit interface 460 .calc_req_o(rd_calc_req), 461 .calc_addr_o(rd_calc_addr), 462 .descramble_req_o(rd_op_req), 463 .scrambled_data_o(rd_scrambled_data), 464 .calc_ack_i(calc_ack), 465 .descramble_ack_i(op_ack), 466 .mask_i(scramble_mask), 467 .descrambled_data_i(rd_descrambled_data), 468 .ecc_single_err_o, 469 .ecc_addr_o, 470 .relbl_ecc_err_o, 471 .intg_ecc_err_o, 472 .fifo_err_o 473 ); 474 475 //////////////////////// 476 // program pipeline 477 //////////////////////// 478 479 logic [FullDataWidth-1:0] prog_full_data; 480 logic [DataWidth-1:0] prog_scrambled_data; 481 logic [DataWidth-1:0] prog_data; 482 logic prog_last; 483 logic flash_prog_req; 484 logic prog_calc_req; 485 logic prog_op_req; 486 logic prog_fsm_err; 487 488 if (WidthMultiple == 1) begin : gen_single_prog_data 489 assign flash_prog_req = reqs[PhyProg]; 490 assign prog_data = prog_data_i[BusWidth-1:0]; 491 assign prog_fsm_err = '0; 492 end else begin : gen_prog_data 493 494 // SEC_CM: MEM.INTEGRITY 495 flash_phy_prog u_prog ( 496 .clk_i, 497 .rst_ni, 498 .req_i(reqs[PhyProg]), 499 .disable_i(flash_disable[ProgFsmDisableIdx]), 500 .scramble_i(muxed_scramble_en), 501 .ecc_i(muxed_ecc_en), 502 .sel_i(addr_i[0 +: WordSelW]), 503 .data_i(prog_data_i), 504 .last_i(prog_last_i), 505 .ack_i(ack), 506 .done_i(done), 507 .calc_ack_i(calc_ack), 508 .scramble_ack_i(op_ack), 509 .mask_i(scramble_mask), 510 .scrambled_data_i(prog_scrambled_data), 511 .calc_req_o(prog_calc_req), 512 .scramble_req_o(prog_op_req), 513 .req_o(flash_prog_req), 514 .last_o(prog_last), 515 .ack_o(prog_ack), 516 .block_data_o(prog_data), 517 .data_o(prog_full_data), 518 .fsm_err_o(prog_fsm_err), 519 .intg_err_o(prog_intg_err_o) 520 ); 521 end 522 523 1/1 assign fsm_err_o = fsm_err | prog_fsm_err; Tests: T1 T2 T3  524 525 //////////////////////// 526 // erase pipeline 527 //////////////////////// 528 529 logic flash_pg_erase_req; 530 logic flash_bk_erase_req; 531 logic erase_suspend_req; 532 flash_phy_erase u_erase ( 533 .clk_i, 534 .rst_ni, 535 .pg_erase_req_i(reqs[PhyPgErase]), 536 .bk_erase_req_i(reqs[PhyBkErase]), 537 .suspend_req_i(erase_suspend_req_i), 538 .ack_o(erase_ack), 539 .pg_erase_req_o(flash_pg_erase_req), 540 .bk_erase_req_o(flash_bk_erase_req), 541 .suspend_req_o(erase_suspend_req), 542 .ack_i(ack), 543 .done_i(done) 544 ); 545 546 //////////////////////// 547 // bundle data to send to shared scrambling module 548 //////////////////////// 549 550 1/1 assign scramble_req_o.calc_req = prog_calc_req | rd_calc_req; Tests: T1 T2 T3  551 1/1 assign scramble_req_o.op_req = prog_op_req | rd_op_req; Tests: T1 T2 T3  552 1/1 assign scramble_req_o.op_type = prog_op_req ? ScrambleOp : DeScrambleOp; Tests: T1 T2 T3  553 1/1 assign scramble_req_o.addr = prog_calc_req ? muxed_addr[BusBankAddrW-1:LsbAddrBit] : Tests: T1 T2 T3  554 rd_calc_addr; 555 1/1 assign scramble_req_o.plain_data = prog_data; Tests: T1 T2 T3  556 1/1 assign scramble_req_o.scrambled_data = rd_scrambled_data; Tests: T1 T2 T3  557 1/1 assign calc_ack = scramble_rsp_i.calc_ack; Tests: T4 T16 T10  558 1/1 assign op_ack = scramble_rsp_i.op_ack; Tests: T1 T2 T3  559 1/1 assign scramble_mask = scramble_rsp_i.mask; Tests: T1 T2 T3  560 1/1 assign rd_descrambled_data = scramble_rsp_i.plain_data; Tests: T1 T2 T3  561 1/1 assign prog_scrambled_data = scramble_rsp_i.scrambled_data; Tests: T1 T2 T3  562 563 //////////////////////// 564 // Actual connection to flash phy 565 //////////////////////// 566 567 // Connections to the actual flash macro wrapper 568 1/1 assign prim_flash_req_o = '{ Tests: T1 T2 T3  569 rd_req: flash_rd_req, 570 prog_req: flash_prog_req, 571 prog_last: prog_last, 572 prog_type: prog_type_i, 573 pg_erase_req: flash_pg_erase_req, 574 bk_erase_req: flash_bk_erase_req, 575 erase_suspend_req: erase_suspend_req, 576 // high endurance enable does not cause changes to 577 // transaction protocol and is forwarded directly to the wrapper 578 he: he_en_i, 579 addr: muxed_addr[BusBankAddrW-1:LsbAddrBit], 580 part: muxed_part, 581 info_sel: info_sel_i, 582 prog_full_data: prog_full_data 583 }; 584 585 1/1 assign ack = prim_flash_rsp_i.ack; Tests: T1 T2 T3  586 1/1 assign done = prim_flash_rsp_i.done; Tests: T1 T2 T3  587 1/1 assign flash_rdata = prim_flash_rsp_i.rdata; Tests: T4 T16 T8 

Cond Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[1].u_core
TotalCoveredPercent
Conditions1069185.85
Logical1069185.85
Non-Logical00
Event00

 LINE       196
 EXPRESSION (host_gnt && (muxed_part != FlashPartData))
             ----1---    --------------2--------------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT8,T10,T11
11Not Covered

 LINE       196
 SUB-EXPRESSION (muxed_part != FlashPartData)
                --------------1--------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       200
 EXPRESSION (((|host_outstanding)) & ((!ctrl_fsm_idle)))
             ----------1----------   ---------2--------
-1--2-StatusTests
01CoveredT4,T16,T8
10CoveredT8,T10,T11
11Not Covered

 LINE       205
 EXPRESSION (host_gnt_err_event | host_outstanding_err_event)
             ---------1--------   -------------2------------
-1--2-StatusTests
00CoveredT1,T2,T3
01Not Covered
10Not Covered

 LINE       217
 EXPRESSION (host_outstanding == '0)
            ------------1-----------
-1-StatusTests
0CoveredT8,T10,T11
1CoveredT1,T2,T3

 LINE       231
 EXPRESSION ((host_outstanding == '0) && ctrl_fsm_idle)
             ------------1-----------    ------2------
-1--2-StatusTests
01CoveredT8,T10,T11
10CoveredT4,T16,T8
11CoveredT1,T2,T3

 LINE       231
 SUB-EXPRESSION (host_outstanding == '0)
                ------------1-----------
-1-StatusTests
0CoveredT8,T10,T11
1CoveredT1,T2,T3

 LINE       242
 EXPRESSION (host_gnt && ((!host_req_done_o)) && (host_outstanding <= flash_phy_pkg::RspOrderDepth))
             ----1---    ----------2---------    -------------------------3------------------------
-1--2--3-StatusTests
011CoveredT1,T2,T3
101CoveredT8,T11,T64
110Not Covered
111CoveredT8,T10,T11

 LINE       242
 EXPRESSION (((!host_gnt)) && host_req_done_o && ((|host_outstanding)))
             ------1------    -------2-------    ----------3----------
-1--2--3-StatusTests
011CoveredT8,T11,T64
101CoveredT8,T10,T11
110Not Covered
111CoveredT8,T10,T11

 LINE       281
 EXPRESSION (host_req & host_req_rdy_o)
             ----1---   -------2------
-1--2-StatusTests
01CoveredT105
10CoveredT10,T11,T34
11CoveredT8,T10,T11

 LINE       282
 EXPRESSION (((|host_outstanding)) & rd_stage_data_valid)
             ----------1----------   ---------2---------
-1--2-StatusTests
01CoveredT16,T8,T17
10CoveredT8,T10,T11
11CoveredT8,T10,T11

 LINE       317
 EXPRESSION ((phy_req & host_req) ? rd_stage_rdy : rd_stage_idle)
             ----------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T10,T11

 LINE       317
 SUB-EXPRESSION (phy_req & host_req)
                 ---1---   ----2---
-1--2-StatusTests
01CoveredT103,T104,T219
10CoveredT4,T16,T8
11CoveredT8,T10,T11

 LINE       321
 EXPRESSION (req_i & host_gnt)
             --1--   ----2---
-1--2-StatusTests
01CoveredT8,T10,T11
10CoveredT4,T16,T8
11CoveredT52,T74,T61

 LINE       336
 EXPRESSION (ctrl_gnt && rd_i)
             ----1---    --2-
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT4,T33,T34
11CoveredT16,T8,T17

 LINE       338
 EXPRESSION (ctrl_gnt && prog_i)
             ----1---    ---2--
-1--2-StatusTests
01CoveredT1,T2,T4
10CoveredT27,T28,T35
11CoveredT4,T33,T34

 LINE       388
 EXPRESSION ((ctrl_fsm_idle & ctrl_rsp_vld) | ((host_outstanding == '0) & host_req_done_o))
             ---------------1--------------   ----------------------2---------------------
-1--2-StatusTests
00CoveredT1,T2,T3
01Not Covered
10Not Covered

 LINE       388
 SUB-EXPRESSION (ctrl_fsm_idle & ctrl_rsp_vld)
                 ------1------   ------2-----
-1--2-StatusTests
01CoveredT4,T16,T8
10CoveredT1,T2,T3
11Not Covered

 LINE       388
 SUB-EXPRESSION ((host_outstanding == '0) & host_req_done_o)
                 ------------1-----------   -------2-------
-1--2-StatusTests
01CoveredT8,T10,T11
10CoveredT1,T2,T3
11Not Covered

 LINE       388
 SUB-EXPRESSION (host_outstanding == '0)
                ------------1-----------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       392
 EXPRESSION (host_sel ? host_addr_i : addr_i)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T10,T11

 LINE       393
 EXPRESSION (host_sel ? FlashPartData : part_i)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T10,T11

 LINE       394
 EXPRESSION (host_sel ? host_scramble_en_i : scramble_en_i)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T10,T11

 LINE       395
 EXPRESSION (host_sel ? host_ecc_en_i : ecc_en_i)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T10,T11

 LINE       396
 EXPRESSION (ctrl_rsp_vld & rd_i)
             ------1-----   --2-
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT4,T33,T34
11CoveredT16,T8,T17

 LINE       397
 EXPRESSION (ctrl_rsp_vld & prog_i)
             ------1-----   ---2--
-1--2-StatusTests
01CoveredT1,T2,T4
10CoveredT4,T16,T8
11CoveredT4,T33,T34

 LINE       398
 EXPRESSION (ctrl_rsp_vld & (pg_erase_i | bk_erase_i))
             ------1-----   ------------2------------
-1--2-StatusTests
01CoveredT9,T27,T28
10CoveredT4,T16,T8
11CoveredT27,T28,T35

 LINE       398
 SUB-EXPRESSION (pg_erase_i | bk_erase_i)
                 -----1----   -----2----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT29,T30,T31
10CoveredT9,T27,T28

 LINE       428
 EXPRESSION ((host_gnt_rd_err & (host_outstanding == 1'b1)) | host_outstanding_rd_err)
             -----------------------1----------------------   -----------2-----------
-1--2-StatusTests
00CoveredT1,T2,T3
01Not Covered
10Not Covered

 LINE       428
 SUB-EXPRESSION (host_gnt_rd_err & (host_outstanding == 1'b1))
                 -------1-------   -------------2------------
-1--2-StatusTests
01CoveredT8,T10,T11
10Not Covered
11Not Covered

 LINE       428
 SUB-EXPRESSION (host_outstanding == 1'b1)
                -------------1------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T10,T11

 LINE       431
 EXPRESSION (phy_req & (rd_i | host_req))
             ---1---   --------2--------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT4,T33,T34
11CoveredT16,T8,T17

 LINE       431
 SUB-EXPRESSION (rd_i | host_req)
                 --1-   ----2---
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT8,T10,T11
10CoveredT1,T2,T3

 LINE       431
 EXPRESSION (arb_host_gnt_err ? ({flash_phy_pkg::FullDataWidth {1'b1}}) : flash_rdata)
             --------1-------
-1-StatusTests
0CoveredT1,T2,T3
1Not Covered

 LINE       523
 EXPRESSION (fsm_err | prog_fsm_err)
             ---1---   ------2-----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT12,T13,T14
10CoveredT12,T13,T14

 LINE       550
 EXPRESSION (prog_calc_req | rd_calc_req)
             ------1------   -----2-----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT16,T10,T11
10CoveredT4,T33,T85

 LINE       551
 EXPRESSION (prog_op_req | rd_op_req)
             -----1-----   ----2----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT16,T34,T27
10CoveredT4,T33,T85

 LINE       552
 EXPRESSION (prog_op_req ? ScrambleOp : DeScrambleOp)
             -----1-----
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT4,T33,T85

 LINE       553
 EXPRESSION (prog_calc_req ? muxed_addr[(flash_phy_pkg::BusBankAddrW - 1):flash_phy_pkg::LsbAddrBit] : rd_calc_addr)
             ------1------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT4,T33,T85

FSM Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[1].u_core
Summary for FSM :: state_q
TotalCoveredPercent
States 5 5 100.00 (Not included in score)
Transitions 7 7 100.00
Sequences 0 0

State, Transition and Sequence Details for FSM :: state_q
states   Line No.   Covered   Tests   
StCtrl 341 Covered T27,T28,T35
StCtrlProg 339 Covered T4,T33,T34
StCtrlRead 337 Covered T16,T8,T17
StDisable 335 Covered T4,T5,T6
StIdle 349 Covered T1,T2,T3


transitions   Line No.   Covered   Tests   
StCtrl->StIdle 369 Covered T27,T28,T35
StCtrlProg->StIdle 359 Covered T4,T33,T34
StCtrlRead->StIdle 349 Covered T16,T8,T17
StIdle->StCtrl 341 Covered T27,T28,T35
StIdle->StCtrlProg 339 Covered T4,T33,T34
StIdle->StCtrlRead 337 Covered T16,T8,T17
StIdle->StDisable 335 Covered T4,T5,T6



Branch Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[1].u_core
Line No.TotalCoveredPercent
Branches 46 42 91.30
TERNARY 317 2 2 100.00
TERNARY 392 2 2 100.00
TERNARY 393 2 2 100.00
TERNARY 394 2 2 100.00
TERNARY 395 2 2 100.00
TERNARY 552 2 2 100.00
TERNARY 553 2 2 100.00
TERNARY 431 2 1 50.00
IF 152 4 4 100.00
IF 165 2 2 100.00
IF 203 3 2 66.67
IF 215 4 3 75.00
IF 229 4 3 75.00
CASE 331 13 13 100.00


317 assign phy_rdy = phy_req & host_req ? rd_stage_rdy : rd_stage_idle; -1- ==> ==>

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


392 assign muxed_addr = host_sel ? host_addr_i : addr_i; -1- ==> ==>

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


393 assign muxed_part = host_sel ? flash_ctrl_pkg::FlashPartData : part_i; -1- ==> ==>

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


394 assign muxed_scramble_en = host_sel ? host_scramble_en_i : scramble_en_i; -1- ==> ==>

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


395 assign muxed_ecc_en = host_sel ? host_ecc_en_i : ecc_en_i; -1- ==> ==>

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


552 assign scramble_req_o.op_type = prog_op_req ? ScrambleOp : DeScrambleOp; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T4,T33,T85
0 Covered T1,T2,T3


553 assign scramble_req_o.addr = prog_calc_req ? muxed_addr[BusBankAddrW-1:LsbAddrBit] : -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T4,T33,T85
0 Covered T1,T2,T3


431 flash_phy_rd u_rd ( 432 .clk_i, 433 .rst_ni, 434 .buf_en_i(rd_buf_en_i), 435 //.req_i(reqs[PhyRead] | host_req), 436 .req_i(phy_req & (rd_i | host_req)), 437 .descramble_i(muxed_scramble_en), 438 .ecc_i(muxed_ecc_en), 439 .prog_i(reqs[PhyProg]), 440 .pg_erase_i(reqs[PhyPgErase]), 441 .bk_erase_i(reqs[PhyBkErase]), 442 .addr_i(muxed_addr), 443 .part_i(muxed_part), 444 // info select cannot be generated by the host 445 .info_sel_i(info_sel_i), 446 .rdy_o(rd_stage_rdy), 447 .data_valid_o(rd_stage_data_valid), 448 .data_err_o(phy_rd_err), 449 .data_host_o(rd_data_host_o), 450 .data_ctrl_o(rd_data_ctrl_o), 451 .idle_o(rd_stage_idle), 452 // a catastrophic arbitration error has been observed, just dump 453 // dump returns until all transactions are flushed. 454 .arb_err_i(arb_host_gnt_err), 455 .req_o(flash_rd_req), 456 .ack_i(ack), 457 .done_i(done), 458 .data_i(arb_host_gnt_err ? {FullDataWidth{1'b1}} : flash_rdata), -1- ==> ==>

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


152 if (!rst_ni) begin -1- 153 arb_cnt <= '0; ==> 154 end else if (ctrl_rsp_vld) begin -2- 155 arb_cnt <= '0; ==> 156 end else if (inc_arb_cnt) begin -3- 157 arb_cnt <= arb_cnt + 1'b1; ==> 158 end MISSING_ELSE ==>

Branches:
-1--2--3-StatusTests
1 - - Covered T1,T2,T3
0 1 - Covered T4,T16,T8
0 0 1 Covered T52,T74,T61
0 0 0 Covered T1,T2,T3


165 `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


203 if (!rst_ni) begin -1- 204 host_gnt_err_o <= '0; ==> 205 end else if (host_gnt_err_event | host_outstanding_err_event) begin -2- 206 host_gnt_err_o <= 1'b1; ==> 207 end MISSING_ELSE ==>

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


215 if (!rst_ni) begin -1- 216 host_gnt_rd_err <= '0; ==> 217 end else if (host_outstanding == '0) begin -2- 218 host_gnt_rd_err <= '0; ==> 219 end else if (host_gnt_err_event) begin -3- 220 host_gnt_rd_err <= 1'b1; ==> 221 end MISSING_ELSE ==>

Branches:
-1--2--3-StatusTests
1 - - Covered T1,T2,T3
0 1 - Covered T1,T2,T3
0 0 1 Not Covered
0 0 0 Covered T8,T10,T11


229 if (!rst_ni) begin -1- 230 host_outstanding_rd_err <= '0; ==> 231 end else if (host_outstanding == '0 && ctrl_fsm_idle) begin -2- 232 host_outstanding_rd_err <= '0; ==> 233 end else if (host_outstanding_err_event) begin -3- 234 host_outstanding_rd_err <= 1'b1; ==> 235 end MISSING_ELSE ==>

Branches:
-1--2--3-StatusTests
1 - - Covered T1,T2,T3
0 1 - Covered T1,T2,T3
0 0 1 Not Covered
0 0 0 Covered T4,T16,T8


331 unique case (state_q) -1- 332 StIdle: begin 333 ctrl_fsm_idle = 1'b1; 334 if (mubi4_test_true_loose(flash_disable[FsmDisableIdx])) begin -2- 335 state_d = StDisable; ==> 336 end else if (ctrl_gnt && rd_i) begin -3- 337 state_d = StCtrlRead; ==> 338 end else if (ctrl_gnt && prog_i) begin -4- 339 state_d = StCtrlProg; ==> 340 end else if (ctrl_gnt) begin -5- 341 state_d = StCtrl; ==> 342 end MISSING_ELSE ==> 343 end 344 345 // Controller reads are very slow. 346 StCtrlRead: begin 347 if (rd_stage_data_valid) begin -6- 348 ctrl_rsp_vld = 1'b1; ==> 349 state_d = StIdle; 350 end MISSING_ELSE ==> 351 end 352 353 // Controller program data may be packed based on 354 // address alignment 355 StCtrlProg: begin 356 reqs[PhyProg] = 1'b1; 357 if (prog_ack) begin -7- 358 ctrl_rsp_vld = 1'b1; ==> 359 state_d = StIdle; 360 end MISSING_ELSE ==> 361 end 362 363 // other controller operations directly interface with flash 364 StCtrl: begin 365 reqs[PhyPgErase] = pg_erase_i; 366 reqs[PhyBkErase] = bk_erase_i; 367 if (erase_ack) begin -8- 368 ctrl_rsp_vld = 1'b1; ==> 369 state_d = StIdle; 370 end MISSING_ELSE ==> 371 end 372 373 StDisable: begin 374 ctrl_fsm_idle = 1'b1; ==> 375 state_d = StDisable; 376 end 377 378 default: begin 379 ctrl_fsm_idle = 1'b1; ==>

Branches:
-1--2--3--4--5--6--7--8-StatusTests
StIdle 1 - - - - - - Covered T4,T5,T6
StIdle 0 1 - - - - - Covered T16,T8,T17
StIdle 0 0 1 - - - - Covered T4,T33,T34
StIdle 0 0 0 1 - - - Covered T27,T28,T35
StIdle 0 0 0 0 - - - Covered T1,T2,T3
StCtrlRead - - - - 1 - - Covered T16,T8,T17
StCtrlRead - - - - 0 - - Covered T16,T8,T17
StCtrlProg - - - - - 1 - Covered T4,T33,T34
StCtrlProg - - - - - 0 - Covered T4,T33,T34
StCtrl - - - - - - 1 Covered T27,T28,T35
StCtrl - - - - - - 0 Covered T27,T28,T35
StDisable - - - - - - - Covered T4,T5,T6
default - - - - - - - Covered T12,T13,T14


Assert Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[1].u_core
TotalAttemptedPercentSucceeded/MatchedPercent
Assertions 8 8 100.00 8 100.00
Cover properties 0 0 0
Cover sequences 0 0 0
Total 8 8 100.00 8 100.00




Assertion Details

Name   Attempts   Real Successes   Failures   Incomplete   
ArbCntMax_A 332875393 1429531 0 0
CtrlPrio_A 332875393 1429531 0 0
HostTransIdleChk_A 332875393 21985939 0 0
NoRemainder_A 1026 1026 0 0
OneHotReqs_A 332875393 332008659 0 0
Pow2Multiple_A 1026 1026 0 0
RdTxnCheck_A 332666161 331799427 0 0
u_state_regs_A 332875393 332008659 0 0


ArbCntMax_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 332875393 1429531 0 0
T29 73710 0 0 0
T43 0 2628 0 0
T52 55289 1817 0 0
T60 455046 0 0 0
T61 60850 2181 0 0
T67 89599 0 0 0
T74 58818 866 0 0
T82 0 1638 0 0
T84 98649 0 0 0
T92 211010 0 0 0
T103 0 35 0 0
T123 0 1242 0 0
T124 0 3424 0 0
T179 0 2507 0 0
T218 60500 0 0 0
T220 0 5839 0 0
T221 1447 0 0 0

CtrlPrio_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 332875393 1429531 0 0
T29 73710 0 0 0
T43 0 2628 0 0
T52 55289 1817 0 0
T60 455046 0 0 0
T61 60850 2181 0 0
T67 89599 0 0 0
T74 58818 866 0 0
T82 0 1638 0 0
T84 98649 0 0 0
T92 211010 0 0 0
T103 0 35 0 0
T123 0 1242 0 0
T124 0 3424 0 0
T179 0 2507 0 0
T218 60500 0 0 0
T220 0 5839 0 0
T221 1447 0 0 0

HostTransIdleChk_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 332875393 21985939 0 0
T6 873 0 0 0
T8 51282 357 0 0
T9 2110 0 0 0
T10 1263 10 0 0
T11 468 4 0 0
T17 1845 0 0 0
T19 0 251 0 0
T20 1105 0 0 0
T24 0 40 0 0
T27 0 28 0 0
T33 1654 0 0 0
T34 0 8 0 0
T36 0 372 0 0
T51 0 139 0 0
T59 1169 0 0 0
T64 0 178 0 0
T66 1241 0 0 0

NoRemainder_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 1026 1026 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
T8 1 1 0 0
T15 1 1 0 0
T16 1 1 0 0
T17 1 1 0 0

OneHotReqs_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 332875393 332008659 0 0
T1 1475 1361 0 0
T2 3694 3600 0 0
T3 2283 2194 0 0
T4 4375 3852 0 0
T5 1250 1151 0 0
T6 873 776 0 0
T8 51282 51232 0 0
T15 949 886 0 0
T16 1834 1745 0 0
T17 1845 1746 0 0

Pow2Multiple_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 1026 1026 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
T8 1 1 0 0
T15 1 1 0 0
T16 1 1 0 0
T17 1 1 0 0

RdTxnCheck_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 332666161 331799427 0 0
T1 1475 1361 0 0
T2 3694 3600 0 0
T3 2283 2194 0 0
T4 4375 3852 0 0
T5 1250 1151 0 0
T6 873 776 0 0
T8 51282 51232 0 0
T15 949 886 0 0
T16 1834 1745 0 0
T17 1845 1746 0 0

u_state_regs_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 332875393 332008659 0 0
T1 1475 1361 0 0
T2 3694 3600 0 0
T3 2283 2194 0 0
T4 4375 3852 0 0
T5 1250 1151 0 0
T6 873 776 0 0
T8 51282 51232 0 0
T15 949 886 0 0
T16 1834 1745 0 0
T17 1845 1746 0 0

Line Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[0].u_core
Line No.TotalCoveredPercent
TOTAL898797.75
ALWAYS15266100.00
ALWAYS16533100.00
CONT_ASSIGN19611100.00
CONT_ASSIGN20011100.00
ALWAYS20344100.00
ALWAYS2156583.33
ALWAYS2296583.33
CONT_ASSIGN27711100.00
CONT_ASSIGN28011100.00
CONT_ASSIGN28111100.00
CONT_ASSIGN28211100.00
CONT_ASSIGN28711100.00
CONT_ASSIGN31711100.00
CONT_ASSIGN32111100.00
ALWAYS3252929100.00
CONT_ASSIGN38811100.00
CONT_ASSIGN39211100.00
CONT_ASSIGN39311100.00
CONT_ASSIGN39411100.00
CONT_ASSIGN39511100.00
CONT_ASSIGN39611100.00
CONT_ASSIGN39711100.00
CONT_ASSIGN39811100.00
CONT_ASSIGN41511100.00
CONT_ASSIGN42811100.00
CONT_ASSIGN52311100.00
CONT_ASSIGN55011100.00
CONT_ASSIGN55111100.00
CONT_ASSIGN55211100.00
CONT_ASSIGN55311100.00
CONT_ASSIGN55511100.00
CONT_ASSIGN55611100.00
CONT_ASSIGN55711100.00
CONT_ASSIGN55811100.00
CONT_ASSIGN55911100.00
CONT_ASSIGN56011100.00
CONT_ASSIGN56111100.00
CONT_ASSIGN56811100.00
CONT_ASSIGN58511100.00
CONT_ASSIGN58611100.00
CONT_ASSIGN58711100.00

151 always_ff @(posedge clk_i or negedge rst_ni) begin 152 1/1 if (!rst_ni) begin Tests: T1 T2 T3  153 1/1 arb_cnt <= '0; Tests: T1 T2 T3  154 1/1 end else if (ctrl_rsp_vld) begin Tests: T1 T2 T3  155 1/1 arb_cnt <= '0; Tests: T1 T2 T3  156 1/1 end else if (inc_arb_cnt) begin Tests: T1 T2 T3  157 1/1 arb_cnt <= arb_cnt + 1'b1; Tests: T10 T11 T19  158 end MISSING_ELSE 159 end 160 161 import prim_mubi_pkg::mubi4_test_false_strict; 162 import prim_mubi_pkg::mubi4_test_true_loose; 163 164 // SEC_CM: PHY.FSM.SPARSE 165 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): 165.1 `ifdef SIMULATION 165.2 prim_sparse_fsm_flop #( 165.3 .StateEnumT(state_e), 165.4 .Width($bits(state_e)), 165.5 .ResetValue($bits(state_e)'(StIdle)), 165.6 .EnableAlertTriggerSVA(1), 165.7 .CustomForceName("state_q") 165.8 ) u_state_regs ( 165.9 .clk_i ( clk_i ), 165.10 .rst_ni ( rst_ni ), 165.11 .state_i ( state_d ), 165.12 .state_o ( ) 165.13 ); 165.14 always_ff @(posedge clk_i or negedge rst_ni) begin 165.15 1/1 if (!rst_ni) begin Tests: T1 T2 T3  165.16 1/1 state_q <= StIdle; Tests: T1 T2 T3  165.17 end else begin 165.18 1/1 state_q <= state_d; Tests: T1 T2 T3  165.19 end 165.20 end 165.21 u_state_regs_A: assert property (@(posedge clk_i) disable iff ((!rst_ni) !== '0) (state_q === u_state_regs.state_o)) 165.22 else begin 165.23 `ifdef UVM 165.24 uvm_pkg::uvm_report_error("ASSERT FAILED", "u_state_regs_A", uvm_pkg::UVM_NONE, 165.25 "../src/lowrisc_opentitan_top_earlgrey_flash_ctrl_0.1/rtl/flash_phy_core.sv", 165, "", 1); 165.26 `else 165.27 $error("%0t: (%0s:%0d) [%m] [ASSERT FAILED] %0s", $time, `__FILE__, `__LINE__, 165.28 `PRIM_STRINGIFY(u_state_regs_A)); 165.29 `endif 165.30 end 165.31 `else 165.32 prim_sparse_fsm_flop #( 165.33 .StateEnumT(state_e), 165.34 .Width($bits(state_e)), 165.35 .ResetValue($bits(state_e)'(StIdle)), 165.36 .EnableAlertTriggerSVA(1) 165.37 ) u_state_regs ( 165.38 .clk_i ( `PRIM_FLOP_CLK ), 165.39 .rst_ni ( `PRIM_FLOP_RST ), 165.40 .state_i ( state_d ), 165.41 .state_o ( state_q ) 165.42 ); 165.43 `endif166 167 typedef enum logic [2:0] { 168 HostDisableIdx, 169 CtrlDisableIdx, 170 FsmDisableIdx, 171 ProgFsmDisableIdx, 172 LastDisableIdx 173 } phy_core_disable_e; 174 175 prim_mubi_pkg::mubi4_t [LastDisableIdx-1:0] flash_disable; 176 prim_mubi4_sync #( 177 .NumCopies(int'(LastDisableIdx)), 178 .AsyncOn(0) 179 ) u_disable_buf ( 180 .clk_i, 181 .rst_ni, 182 .mubi_i(flash_disable_i), 183 .mubi_o(flash_disable) 184 ); 185 186 // Oustanding width is slightly larger to ensure a faulty increment is able to reach 187 // the higher value. For example if RspOrderDepth were 3, a clog2 of 3 would still be 2 188 // and not allow the counter to increment to 4. 189 localparam int OutstandingRdWidth = $clog2(RspOrderDepth+2); 190 logic [OutstandingRdWidth-1:0] host_outstanding; 191 logic ctrl_fsm_idle; 192 logic host_req; 193 // SEC_CM: PHY_HOST_GRANT.CTRL.CONSISTENCY 194 // A host transaction was granted to the muxed partition, this is illegal 195 logic host_gnt_err_event; 196 1/1 assign host_gnt_err_event = (host_gnt && muxed_part != flash_ctrl_pkg::FlashPartData); Tests: T1 T2 T3  197 // Controller fsm became non idle when there are pending host transactions, this is 198 // illegal. 199 logic host_outstanding_err_event; 200 1/1 assign host_outstanding_err_event = |host_outstanding & !ctrl_fsm_idle; Tests: T1 T2 T3  201 202 always_ff @(posedge clk_i or negedge rst_ni) begin 203 1/1 if (!rst_ni) begin Tests: T1 T2 T3  204 1/1 host_gnt_err_o <= '0; Tests: T1 T2 T3  205 1/1 end else if (host_gnt_err_event | host_outstanding_err_event) begin Tests: T1 T2 T3  206 1/1 host_gnt_err_o <= 1'b1; Tests: T11 T181 T214  207 end MISSING_ELSE 208 end 209 210 // When host grant errors occur, also create in band error responses. 211 // The error condition is held until all existing host transactions are 212 // processed. 213 logic host_gnt_rd_err; 214 always_ff @(posedge clk_i or negedge rst_ni) begin 215 1/1 if (!rst_ni) begin Tests: T1 T2 T3  216 1/1 host_gnt_rd_err <= '0; Tests: T1 T2 T3  217 1/1 end else if (host_outstanding == '0) begin Tests: T1 T2 T3  218 1/1 host_gnt_rd_err <= '0; Tests: T1 T2 T3  219 1/1 end else if (host_gnt_err_event) begin Tests: T8 T6 T20  220 0/1 ==> host_gnt_rd_err <= 1'b1; 221 end MISSING_ELSE 222 end 223 224 // When host outstanding errors occur, also create in band error responses. 225 // The error condition is held until all existing host and controller 226 // transactions are processed. 227 logic host_outstanding_rd_err; 228 always_ff @(posedge clk_i or negedge rst_ni) begin 229 1/1 if (!rst_ni) begin Tests: T1 T2 T3  230 1/1 host_outstanding_rd_err <= '0; Tests: T1 T2 T3  231 1/1 end else if (host_outstanding == '0 && ctrl_fsm_idle) begin Tests: T1 T2 T3  232 1/1 host_outstanding_rd_err <= '0; Tests: T1 T2 T3  233 1/1 end else if (host_outstanding_err_event) begin Tests: T1 T2 T3  234 0/1 ==> host_outstanding_rd_err <= 1'b1; 235 end MISSING_ELSE 236 end 237 238 // SEC_CM: PHY_HOST_GRANT.CTRL.CONSISTENCY 239 prim_count #( 240 .Width(OutstandingRdWidth), 241 .ResetValue('0) 242 ) u_host_outstanding_cnt ( 243 .clk_i, 244 .rst_ni, 245 .clr_i('0), 246 .set_i('0), 247 .set_cnt_i('0), 248 .incr_en_i(host_gnt && !host_req_done_o && (host_outstanding <= RspOrderDepth)), 249 .decr_en_i(!host_gnt && host_req_done_o && |host_outstanding), 250 .step_i(OutstandingRdWidth'(1'b1)), 251 .commit_i(1'b1), 252 .cnt_o(host_outstanding), 253 .cnt_after_commit_o(), 254 .err_o(cnt_err_o) 255 ); 256 257 // If host_outstanding is non-zero, the controller fsm must be idle.. 258 // This assertion needs to be disabled for sec_cm testing 259 `ASSERT(HostTransIdleChk_A, |host_outstanding |-> ctrl_fsm_idle) 260 261 //always_ff @(posedge clk_i or negedge rst_ni) begin 262 // if (!rst_ni) begin 263 // host_outstanding <= '0; 264 // end else if (host_gnt && !host_req_done_o && (host_outstanding <= RspOrderDepth)) begin 265 // host_outstanding <= host_outstanding + 1'b1; 266 // end else if (!host_gnt && host_req_done_o && |host_outstanding) begin 267 // host_outstanding <= host_outstanding - 1'b1; 268 // end 269 //end 270 271 `ASSERT(RdTxnCheck_A, host_outstanding <= RspOrderDepth) 272 273 // The host request is suppressed under a variety of conditions: 274 // 1. If a controller transaction is already ongoing. 275 // 2. If a grant or outstanding error has already been observed but not yet 276 // fully processed. 277 1/1 assign host_req = host_req_i & (arb_cnt < ArbCnt[CntWidth-1:0]) & ctrl_fsm_idle & Tests: T1 T2 T3  278 !host_gnt_rd_err & !host_outstanding_rd_err & 279 mubi4_test_false_strict(flash_disable[HostDisableIdx]); 280 1/1 assign host_sel = host_req; Tests: T1 T2 T4  281 1/1 assign host_gnt = host_req & host_req_rdy_o; Tests: T1 T2 T4  282 1/1 assign host_req_done_o = |host_outstanding & rd_stage_data_valid; Tests: T1 T2 T3  283 284 // controller request can only win after the entire read pipeline 285 // clears 286 logic ctrl_req; 287 1/1 assign ctrl_req = req_i & rd_stage_idle & Tests: T1 T2 T3  288 !host_gnt_rd_err & !host_outstanding_rd_err & 289 mubi4_test_false_strict(flash_disable[CtrlDisableIdx]); 290 291 logic [1:0] data_tie_off [2]; 292 assign data_tie_off = '{default: '0}; 293 294 // SEC_CM: PHY_ARBITER.CTRL.REDUN 295 logic phy_req; 296 logic phy_rdy; 297 298 prim_arbiter_tree_dup #( 299 .N(2), 300 .DW(2), 301 .EnDataPort('0), 302 .FixedArb(1) 303 ) u_host_arb ( 304 .clk_i, 305 .rst_ni, 306 .req_chk_i('0), 307 .req_i({ctrl_req, host_req}), 308 .data_i(data_tie_off), 309 .gnt_o({ctrl_gnt, host_req_rdy_o}), 310 .idx_o(), 311 .valid_o(phy_req), 312 .data_o(), 313 .ready_i(phy_rdy), 314 .err_o(arb_err_o) 315 ); 316 317 1/1 assign phy_rdy = phy_req & host_req ? rd_stage_rdy : rd_stage_idle; Tests: T1 T2 T3  318 319 320 // if request happens at the same time as a host grant, increment count 321 1/1 assign inc_arb_cnt = req_i & host_gnt; Tests: T1 T2 T3  322 323 logic fsm_err; 324 always_comb begin 325 1/1 state_d = state_q; Tests: T1 T2 T3  326 1/1 reqs = '0; Tests: T1 T2 T3  327 1/1 ctrl_rsp_vld = '0; Tests: T1 T2 T3  328 1/1 fsm_err = '0; Tests: T1 T2 T3  329 1/1 ctrl_fsm_idle = '0; Tests: T1 T2 T3  330 331 1/1 unique case (state_q) Tests: T1 T2 T3  332 StIdle: begin 333 1/1 ctrl_fsm_idle = 1'b1; Tests: T1 T2 T3  334 1/1 if (mubi4_test_true_loose(flash_disable[FsmDisableIdx])) begin Tests: T1 T2 T3  335 1/1 state_d = StDisable; Tests: T4 T5 T6  336 1/1 end else if (ctrl_gnt && rd_i) begin Tests: T1 T2 T3  337 1/1 state_d = StCtrlRead; Tests: T1 T2 T3  338 1/1 end else if (ctrl_gnt && prog_i) begin Tests: T1 T2 T3  339 1/1 state_d = StCtrlProg; Tests: T1 T2 T4  340 1/1 end else if (ctrl_gnt) begin Tests: T1 T2 T3  341 1/1 state_d = StCtrl; Tests: T9 T27 T28  342 end MISSING_ELSE 343 end 344 345 // Controller reads are very slow. 346 StCtrlRead: begin 347 1/1 if (rd_stage_data_valid) begin Tests: T1 T2 T3  348 1/1 ctrl_rsp_vld = 1'b1; Tests: T1 T2 T3  349 1/1 state_d = StIdle; Tests: T1 T2 T3  350 end MISSING_ELSE 351 end 352 353 // Controller program data may be packed based on 354 // address alignment 355 StCtrlProg: begin 356 1/1 reqs[PhyProg] = 1'b1; Tests: T1 T2 T4  357 1/1 if (prog_ack) begin Tests: T1 T2 T4  358 1/1 ctrl_rsp_vld = 1'b1; Tests: T1 T2 T4  359 1/1 state_d = StIdle; Tests: T1 T2 T4  360 end MISSING_ELSE 361 end 362 363 // other controller operations directly interface with flash 364 StCtrl: begin 365 1/1 reqs[PhyPgErase] = pg_erase_i; Tests: T9 T27 T28  366 1/1 reqs[PhyBkErase] = bk_erase_i; Tests: T9 T27 T28  367 1/1 if (erase_ack) begin Tests: T9 T27 T28  368 1/1 ctrl_rsp_vld = 1'b1; Tests: T9 T27 T28  369 1/1 state_d = StIdle; Tests: T9 T27 T28  370 end MISSING_ELSE 371 end 372 373 StDisable: begin 374 1/1 ctrl_fsm_idle = 1'b1; Tests: T4 T5 T6  375 1/1 state_d = StDisable; Tests: T4 T5 T6  376 end 377 378 default: begin 379 ctrl_fsm_idle = 1'b1; 380 fsm_err = 1'b1; 381 end 382 383 endcase // unique case (state_q) 384 end // always_comb 385 386 // determine spurious acks 387 // SEC_CM: PHY_ACK.CTRL.CONSISTENCY 388 1/1 assign spurious_ack_o = (ctrl_fsm_idle & ctrl_rsp_vld) | Tests: T1 T2 T3  389 ((host_outstanding == '0) & host_req_done_o); 390 391 // transactions coming from flash controller are always data type 392 1/1 assign muxed_addr = host_sel ? host_addr_i : addr_i; Tests: T1 T2 T3  393 1/1 assign muxed_part = host_sel ? flash_ctrl_pkg::FlashPartData : part_i; Tests: T1 T2 T3  394 1/1 assign muxed_scramble_en = host_sel ? host_scramble_en_i : scramble_en_i; Tests: T1 T2 T3  395 1/1 assign muxed_ecc_en = host_sel ? host_ecc_en_i : ecc_en_i; Tests: T1 T2 T3  396 1/1 assign rd_done_o = ctrl_rsp_vld & rd_i; Tests: T1 T2 T3  397 1/1 assign prog_done_o = ctrl_rsp_vld & prog_i; Tests: T1 T2 T3  398 1/1 assign erase_done_o = ctrl_rsp_vld & (pg_erase_i | bk_erase_i); Tests: T1 T2 T3  399 400 //////////////////////// 401 // read pipeline 402 //////////////////////// 403 404 logic flash_rd_req; 405 logic [FullDataWidth-1:0] flash_rdata; 406 logic rd_calc_req; 407 logic [BankAddrW-1:0] rd_calc_addr; 408 logic rd_op_req; 409 logic [DataWidth-1:0] rd_scrambled_data; 410 logic [DataWidth-1:0] rd_descrambled_data; 411 412 // if host grant is encountered, transactions return in-band 413 // error until all transactions are flushed. 414 logic phy_rd_err; 415 1/1 assign rd_err_o = phy_rd_err; Tests: T1 T2 T3  416 417 418 // After host_gnt_rd_err asserts, no more host requests 419 // are granted until all transactions are flushed. This means 420 // the last outstanding transaction is by definition the "error". 421 // 422 // If ctrl_fsm_idle inexplicably goes low while there are host transactions 423 // the transaction handling may be irreversibly broken. 424 // The host_oustanding_rd_err makes a best effort attempt to cleanly 425 // recover. It responds with in-band error controller transactions until the 426 // all pending transactions are flushed. 427 logic arb_host_gnt_err; 428 1/1 assign arb_host_gnt_err = (host_gnt_rd_err & host_outstanding == 1'b1) | Tests: T1 T2 T3  429 (host_outstanding_rd_err); 430 431 flash_phy_rd u_rd ( 432 .clk_i, 433 .rst_ni, 434 .buf_en_i(rd_buf_en_i), 435 //.req_i(reqs[PhyRead] | host_req), 436 .req_i(phy_req & (rd_i | host_req)), 437 .descramble_i(muxed_scramble_en), 438 .ecc_i(muxed_ecc_en), 439 .prog_i(reqs[PhyProg]), 440 .pg_erase_i(reqs[PhyPgErase]), 441 .bk_erase_i(reqs[PhyBkErase]), 442 .addr_i(muxed_addr), 443 .part_i(muxed_part), 444 // info select cannot be generated by the host 445 .info_sel_i(info_sel_i), 446 .rdy_o(rd_stage_rdy), 447 .data_valid_o(rd_stage_data_valid), 448 .data_err_o(phy_rd_err), 449 .data_host_o(rd_data_host_o), 450 .data_ctrl_o(rd_data_ctrl_o), 451 .idle_o(rd_stage_idle), 452 // a catastrophic arbitration error has been observed, just dump 453 // dump returns until all transactions are flushed. 454 .arb_err_i(arb_host_gnt_err), 455 .req_o(flash_rd_req), 456 .ack_i(ack), 457 .done_i(done), 458 .data_i(arb_host_gnt_err ? {FullDataWidth{1'b1}} : flash_rdata), 459 //scramble unit interface 460 .calc_req_o(rd_calc_req), 461 .calc_addr_o(rd_calc_addr), 462 .descramble_req_o(rd_op_req), 463 .scrambled_data_o(rd_scrambled_data), 464 .calc_ack_i(calc_ack), 465 .descramble_ack_i(op_ack), 466 .mask_i(scramble_mask), 467 .descrambled_data_i(rd_descrambled_data), 468 .ecc_single_err_o, 469 .ecc_addr_o, 470 .relbl_ecc_err_o, 471 .intg_ecc_err_o, 472 .fifo_err_o 473 ); 474 475 //////////////////////// 476 // program pipeline 477 //////////////////////// 478 479 logic [FullDataWidth-1:0] prog_full_data; 480 logic [DataWidth-1:0] prog_scrambled_data; 481 logic [DataWidth-1:0] prog_data; 482 logic prog_last; 483 logic flash_prog_req; 484 logic prog_calc_req; 485 logic prog_op_req; 486 logic prog_fsm_err; 487 488 if (WidthMultiple == 1) begin : gen_single_prog_data 489 assign flash_prog_req = reqs[PhyProg]; 490 assign prog_data = prog_data_i[BusWidth-1:0]; 491 assign prog_fsm_err = '0; 492 end else begin : gen_prog_data 493 494 // SEC_CM: MEM.INTEGRITY 495 flash_phy_prog u_prog ( 496 .clk_i, 497 .rst_ni, 498 .req_i(reqs[PhyProg]), 499 .disable_i(flash_disable[ProgFsmDisableIdx]), 500 .scramble_i(muxed_scramble_en), 501 .ecc_i(muxed_ecc_en), 502 .sel_i(addr_i[0 +: WordSelW]), 503 .data_i(prog_data_i), 504 .last_i(prog_last_i), 505 .ack_i(ack), 506 .done_i(done), 507 .calc_ack_i(calc_ack), 508 .scramble_ack_i(op_ack), 509 .mask_i(scramble_mask), 510 .scrambled_data_i(prog_scrambled_data), 511 .calc_req_o(prog_calc_req), 512 .scramble_req_o(prog_op_req), 513 .req_o(flash_prog_req), 514 .last_o(prog_last), 515 .ack_o(prog_ack), 516 .block_data_o(prog_data), 517 .data_o(prog_full_data), 518 .fsm_err_o(prog_fsm_err), 519 .intg_err_o(prog_intg_err_o) 520 ); 521 end 522 523 1/1 assign fsm_err_o = fsm_err | prog_fsm_err; Tests: T1 T2 T3  524 525 //////////////////////// 526 // erase pipeline 527 //////////////////////// 528 529 logic flash_pg_erase_req; 530 logic flash_bk_erase_req; 531 logic erase_suspend_req; 532 flash_phy_erase u_erase ( 533 .clk_i, 534 .rst_ni, 535 .pg_erase_req_i(reqs[PhyPgErase]), 536 .bk_erase_req_i(reqs[PhyBkErase]), 537 .suspend_req_i(erase_suspend_req_i), 538 .ack_o(erase_ack), 539 .pg_erase_req_o(flash_pg_erase_req), 540 .bk_erase_req_o(flash_bk_erase_req), 541 .suspend_req_o(erase_suspend_req), 542 .ack_i(ack), 543 .done_i(done) 544 ); 545 546 //////////////////////// 547 // bundle data to send to shared scrambling module 548 //////////////////////// 549 550 1/1 assign scramble_req_o.calc_req = prog_calc_req | rd_calc_req; Tests: T1 T2 T3  551 1/1 assign scramble_req_o.op_req = prog_op_req | rd_op_req; Tests: T1 T2 T3  552 1/1 assign scramble_req_o.op_type = prog_op_req ? ScrambleOp : DeScrambleOp; Tests: T1 T2 T3  553 1/1 assign scramble_req_o.addr = prog_calc_req ? muxed_addr[BusBankAddrW-1:LsbAddrBit] : Tests: T1 T2 T3  554 rd_calc_addr; 555 1/1 assign scramble_req_o.plain_data = prog_data; Tests: T1 T2 T3  556 1/1 assign scramble_req_o.scrambled_data = rd_scrambled_data; Tests: T1 T2 T3  557 1/1 assign calc_ack = scramble_rsp_i.calc_ack; Tests: T1 T2 T3  558 1/1 assign op_ack = scramble_rsp_i.op_ack; Tests: T1 T2 T3  559 1/1 assign scramble_mask = scramble_rsp_i.mask; Tests: T1 T2 T3  560 1/1 assign rd_descrambled_data = scramble_rsp_i.plain_data; Tests: T1 T2 T3  561 1/1 assign prog_scrambled_data = scramble_rsp_i.scrambled_data; Tests: T1 T2 T3  562 563 //////////////////////// 564 // Actual connection to flash phy 565 //////////////////////// 566 567 // Connections to the actual flash macro wrapper 568 1/1 assign prim_flash_req_o = '{ Tests: T1 T2 T3  569 rd_req: flash_rd_req, 570 prog_req: flash_prog_req, 571 prog_last: prog_last, 572 prog_type: prog_type_i, 573 pg_erase_req: flash_pg_erase_req, 574 bk_erase_req: flash_bk_erase_req, 575 erase_suspend_req: erase_suspend_req, 576 // high endurance enable does not cause changes to 577 // transaction protocol and is forwarded directly to the wrapper 578 he: he_en_i, 579 addr: muxed_addr[BusBankAddrW-1:LsbAddrBit], 580 part: muxed_part, 581 info_sel: info_sel_i, 582 prog_full_data: prog_full_data 583 }; 584 585 1/1 assign ack = prim_flash_rsp_i.ack; Tests: T1 T2 T3  586 1/1 assign done = prim_flash_rsp_i.done; Tests: T1 T2 T3  587 1/1 assign flash_rdata = prim_flash_rsp_i.rdata; Tests: T1 T2 T3 

Cond Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[0].u_core
TotalCoveredPercent
Conditions1069387.74
Logical1069387.74
Non-Logical00
Event00

 LINE       196
 EXPRESSION (host_gnt && (muxed_part != FlashPartData))
             ----1---    --------------2--------------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT8,T6,T20
11CoveredT11,T181,T214

 LINE       196
 SUB-EXPRESSION (muxed_part != FlashPartData)
                --------------1--------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       200
 EXPRESSION (((|host_outstanding)) & ((!ctrl_fsm_idle)))
             ----------1----------   ---------2--------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT8,T6,T20
11Not Covered

 LINE       205
 EXPRESSION (host_gnt_err_event | host_outstanding_err_event)
             ---------1--------   -------------2------------
-1--2-StatusTests
00CoveredT1,T2,T3
01Not Covered
10CoveredT11,T181,T214

 LINE       217
 EXPRESSION (host_outstanding == '0)
            ------------1-----------
-1-StatusTests
0CoveredT8,T6,T20
1CoveredT1,T2,T3

 LINE       231
 EXPRESSION ((host_outstanding == '0) && ctrl_fsm_idle)
             ------------1-----------    ------2------
-1--2-StatusTests
01CoveredT8,T6,T20
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       231
 SUB-EXPRESSION (host_outstanding == '0)
                ------------1-----------
-1-StatusTests
0CoveredT8,T6,T20
1CoveredT1,T2,T3

 LINE       242
 EXPRESSION (host_gnt && ((!host_req_done_o)) && (host_outstanding <= flash_phy_pkg::RspOrderDepth))
             ----1---    ----------2---------    -------------------------3------------------------
-1--2--3-StatusTests
011CoveredT1,T2,T3
101CoveredT8,T6,T20
110Not Covered
111CoveredT8,T6,T20

 LINE       242
 EXPRESSION (((!host_gnt)) && host_req_done_o && ((|host_outstanding)))
             ------1------    -------2-------    ----------3----------
-1--2--3-StatusTests
011CoveredT8,T6,T20
101CoveredT8,T6,T20
110Not Covered
111CoveredT8,T6,T20

 LINE       281
 EXPRESSION (host_req & host_req_rdy_o)
             ----1---   -------2------
-1--2-StatusTests
01Not Covered
10CoveredT10,T11,T27
11CoveredT8,T6,T20

 LINE       282
 EXPRESSION (((|host_outstanding)) & rd_stage_data_valid)
             ----------1----------   ---------2---------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT8,T6,T20
11CoveredT8,T6,T20

 LINE       317
 EXPRESSION ((phy_req & host_req) ? rd_stage_rdy : rd_stage_idle)
             ----------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T6,T20

 LINE       317
 SUB-EXPRESSION (phy_req & host_req)
                 ---1---   ----2---
-1--2-StatusTests
01Not Covered
10CoveredT1,T2,T3
11CoveredT8,T6,T20

 LINE       321
 EXPRESSION (req_i & host_gnt)
             --1--   ----2---
-1--2-StatusTests
01CoveredT8,T6,T20
10CoveredT1,T2,T3
11CoveredT10,T11,T19

 LINE       336
 EXPRESSION (ctrl_gnt && rd_i)
             ----1---    --2-
-1--2-StatusTests
01CoveredT16,T8,T17
10CoveredT1,T2,T4
11CoveredT1,T2,T3

 LINE       338
 EXPRESSION (ctrl_gnt && prog_i)
             ----1---    ---2--
-1--2-StatusTests
01CoveredT4,T11,T33
10CoveredT9,T27,T28
11CoveredT1,T2,T4

 LINE       388
 EXPRESSION ((ctrl_fsm_idle & ctrl_rsp_vld) | ((host_outstanding == '0) & host_req_done_o))
             ---------------1--------------   ----------------------2---------------------
-1--2-StatusTests
00CoveredT1,T2,T3
01Not Covered
10CoveredT10,T106,T216

 LINE       388
 SUB-EXPRESSION (ctrl_fsm_idle & ctrl_rsp_vld)
                 ------1------   ------2-----
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T3
11CoveredT10,T106,T216

 LINE       388
 SUB-EXPRESSION ((host_outstanding == '0) & host_req_done_o)
                 ------------1-----------   -------2-------
-1--2-StatusTests
01CoveredT8,T6,T20
10CoveredT1,T2,T3
11Not Covered

 LINE       388
 SUB-EXPRESSION (host_outstanding == '0)
                ------------1-----------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       392
 EXPRESSION (host_sel ? host_addr_i : addr_i)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T6,T20

 LINE       393
 EXPRESSION (host_sel ? FlashPartData : part_i)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T6,T20

 LINE       394
 EXPRESSION (host_sel ? host_scramble_en_i : scramble_en_i)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T6,T20

 LINE       395
 EXPRESSION (host_sel ? host_ecc_en_i : ecc_en_i)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T6,T20

 LINE       396
 EXPRESSION (ctrl_rsp_vld & rd_i)
             ------1-----   --2-
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T4
11CoveredT1,T2,T3

 LINE       397
 EXPRESSION (ctrl_rsp_vld & prog_i)
             ------1-----   ---2--
-1--2-StatusTests
01CoveredT1,T2,T4
10CoveredT1,T2,T3
11CoveredT1,T2,T4

 LINE       398
 EXPRESSION (ctrl_rsp_vld & (pg_erase_i | bk_erase_i))
             ------1-----   ------------2------------
-1--2-StatusTests
01CoveredT9,T27,T28
10CoveredT1,T2,T3
11CoveredT9,T27,T28

 LINE       398
 SUB-EXPRESSION (pg_erase_i | bk_erase_i)
                 -----1----   -----2----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT29,T30,T31
10CoveredT9,T27,T28

 LINE       428
 EXPRESSION ((host_gnt_rd_err & (host_outstanding == 1'b1)) | host_outstanding_rd_err)
             -----------------------1----------------------   -----------2-----------
-1--2-StatusTests
00CoveredT1,T2,T3
01Not Covered
10Not Covered

 LINE       428
 SUB-EXPRESSION (host_gnt_rd_err & (host_outstanding == 1'b1))
                 -------1-------   -------------2------------
-1--2-StatusTests
01CoveredT8,T6,T20
10Not Covered
11Not Covered

 LINE       428
 SUB-EXPRESSION (host_outstanding == 1'b1)
                -------------1------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT8,T6,T20

 LINE       431
 EXPRESSION (phy_req & (rd_i | host_req))
             ---1---   --------2--------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T4
11CoveredT1,T2,T3

 LINE       431
 SUB-EXPRESSION (rd_i | host_req)
                 --1-   ----2---
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT8,T6,T20
10CoveredT1,T2,T3

 LINE       431
 EXPRESSION (arb_host_gnt_err ? ({flash_phy_pkg::FullDataWidth {1'b1}}) : flash_rdata)
             --------1-------
-1-StatusTests
0CoveredT1,T2,T3
1Not Covered

 LINE       523
 EXPRESSION (fsm_err | prog_fsm_err)
             ---1---   ------2-----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT12,T13,T14
10CoveredT12,T13,T14

 LINE       550
 EXPRESSION (prog_calc_req | rd_calc_req)
             ------1------   -----2-----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT1,T2,T3
10CoveredT1,T4,T5

 LINE       551
 EXPRESSION (prog_op_req | rd_op_req)
             -----1-----   ----2----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT1,T2,T3
10CoveredT1,T4,T5

 LINE       552
 EXPRESSION (prog_op_req ? ScrambleOp : DeScrambleOp)
             -----1-----
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T4,T5

 LINE       553
 EXPRESSION (prog_calc_req ? muxed_addr[(flash_phy_pkg::BusBankAddrW - 1):flash_phy_pkg::LsbAddrBit] : rd_calc_addr)
             ------1------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T4,T5

FSM Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[0].u_core
Summary for FSM :: state_q
TotalCoveredPercent
States 5 5 100.00 (Not included in score)
Transitions 7 7 100.00
Sequences 0 0

State, Transition and Sequence Details for FSM :: state_q
states   Line No.   Covered   Tests   
StCtrl 341 Covered T9,T27,T28
StCtrlProg 339 Covered T1,T2,T4
StCtrlRead 337 Covered T1,T2,T3
StDisable 335 Covered T4,T5,T6
StIdle 349 Covered T1,T2,T3


transitions   Line No.   Covered   Tests   
StCtrl->StIdle 369 Covered T9,T27,T28
StCtrlProg->StIdle 359 Covered T1,T2,T4
StCtrlRead->StIdle 349 Covered T1,T2,T3
StIdle->StCtrl 341 Covered T9,T27,T28
StIdle->StCtrlProg 339 Covered T1,T2,T4
StIdle->StCtrlRead 337 Covered T1,T2,T3
StIdle->StDisable 335 Covered T4,T5,T6



Branch Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[0].u_core
Line No.TotalCoveredPercent
Branches 46 43 93.48
TERNARY 317 2 2 100.00
TERNARY 392 2 2 100.00
TERNARY 393 2 2 100.00
TERNARY 394 2 2 100.00
TERNARY 395 2 2 100.00
TERNARY 552 2 2 100.00
TERNARY 553 2 2 100.00
TERNARY 431 2 1 50.00
IF 152 4 4 100.00
IF 165 2 2 100.00
IF 203 3 3 100.00
IF 215 4 3 75.00
IF 229 4 3 75.00
CASE 331 13 13 100.00


317 assign phy_rdy = phy_req & host_req ? rd_stage_rdy : rd_stage_idle; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T8,T6,T20
0 Covered T1,T2,T3


392 assign muxed_addr = host_sel ? host_addr_i : addr_i; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T8,T6,T20
0 Covered T1,T2,T3


393 assign muxed_part = host_sel ? flash_ctrl_pkg::FlashPartData : part_i; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T8,T6,T20
0 Covered T1,T2,T3


394 assign muxed_scramble_en = host_sel ? host_scramble_en_i : scramble_en_i; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T8,T6,T20
0 Covered T1,T2,T3


395 assign muxed_ecc_en = host_sel ? host_ecc_en_i : ecc_en_i; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T8,T6,T20
0 Covered T1,T2,T3


552 assign scramble_req_o.op_type = prog_op_req ? ScrambleOp : DeScrambleOp; -1- ==> ==>

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


553 assign scramble_req_o.addr = prog_calc_req ? muxed_addr[BusBankAddrW-1:LsbAddrBit] : -1- ==> ==>

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


431 flash_phy_rd u_rd ( 432 .clk_i, 433 .rst_ni, 434 .buf_en_i(rd_buf_en_i), 435 //.req_i(reqs[PhyRead] | host_req), 436 .req_i(phy_req & (rd_i | host_req)), 437 .descramble_i(muxed_scramble_en), 438 .ecc_i(muxed_ecc_en), 439 .prog_i(reqs[PhyProg]), 440 .pg_erase_i(reqs[PhyPgErase]), 441 .bk_erase_i(reqs[PhyBkErase]), 442 .addr_i(muxed_addr), 443 .part_i(muxed_part), 444 // info select cannot be generated by the host 445 .info_sel_i(info_sel_i), 446 .rdy_o(rd_stage_rdy), 447 .data_valid_o(rd_stage_data_valid), 448 .data_err_o(phy_rd_err), 449 .data_host_o(rd_data_host_o), 450 .data_ctrl_o(rd_data_ctrl_o), 451 .idle_o(rd_stage_idle), 452 // a catastrophic arbitration error has been observed, just dump 453 // dump returns until all transactions are flushed. 454 .arb_err_i(arb_host_gnt_err), 455 .req_o(flash_rd_req), 456 .ack_i(ack), 457 .done_i(done), 458 .data_i(arb_host_gnt_err ? {FullDataWidth{1'b1}} : flash_rdata), -1- ==> ==>

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


152 if (!rst_ni) begin -1- 153 arb_cnt <= '0; ==> 154 end else if (ctrl_rsp_vld) begin -2- 155 arb_cnt <= '0; ==> 156 end else if (inc_arb_cnt) begin -3- 157 arb_cnt <= arb_cnt + 1'b1; ==> 158 end MISSING_ELSE ==>

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


165 `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


203 if (!rst_ni) begin -1- 204 host_gnt_err_o <= '0; ==> 205 end else if (host_gnt_err_event | host_outstanding_err_event) begin -2- 206 host_gnt_err_o <= 1'b1; ==> 207 end MISSING_ELSE ==>

Branches:
-1--2-StatusTests
1 - Covered T1,T2,T3
0 1 Covered T11,T181,T214
0 0 Covered T1,T2,T3


215 if (!rst_ni) begin -1- 216 host_gnt_rd_err <= '0; ==> 217 end else if (host_outstanding == '0) begin -2- 218 host_gnt_rd_err <= '0; ==> 219 end else if (host_gnt_err_event) begin -3- 220 host_gnt_rd_err <= 1'b1; ==> 221 end MISSING_ELSE ==>

Branches:
-1--2--3-StatusTests
1 - - Covered T1,T2,T3
0 1 - Covered T1,T2,T3
0 0 1 Not Covered
0 0 0 Covered T8,T6,T20


229 if (!rst_ni) begin -1- 230 host_outstanding_rd_err <= '0; ==> 231 end else if (host_outstanding == '0 && ctrl_fsm_idle) begin -2- 232 host_outstanding_rd_err <= '0; ==> 233 end else if (host_outstanding_err_event) begin -3- 234 host_outstanding_rd_err <= 1'b1; ==> 235 end MISSING_ELSE ==>

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


331 unique case (state_q) -1- 332 StIdle: begin 333 ctrl_fsm_idle = 1'b1; 334 if (mubi4_test_true_loose(flash_disable[FsmDisableIdx])) begin -2- 335 state_d = StDisable; ==> 336 end else if (ctrl_gnt && rd_i) begin -3- 337 state_d = StCtrlRead; ==> 338 end else if (ctrl_gnt && prog_i) begin -4- 339 state_d = StCtrlProg; ==> 340 end else if (ctrl_gnt) begin -5- 341 state_d = StCtrl; ==> 342 end MISSING_ELSE ==> 343 end 344 345 // Controller reads are very slow. 346 StCtrlRead: begin 347 if (rd_stage_data_valid) begin -6- 348 ctrl_rsp_vld = 1'b1; ==> 349 state_d = StIdle; 350 end MISSING_ELSE ==> 351 end 352 353 // Controller program data may be packed based on 354 // address alignment 355 StCtrlProg: begin 356 reqs[PhyProg] = 1'b1; 357 if (prog_ack) begin -7- 358 ctrl_rsp_vld = 1'b1; ==> 359 state_d = StIdle; 360 end MISSING_ELSE ==> 361 end 362 363 // other controller operations directly interface with flash 364 StCtrl: begin 365 reqs[PhyPgErase] = pg_erase_i; 366 reqs[PhyBkErase] = bk_erase_i; 367 if (erase_ack) begin -8- 368 ctrl_rsp_vld = 1'b1; ==> 369 state_d = StIdle; 370 end MISSING_ELSE ==> 371 end 372 373 StDisable: begin 374 ctrl_fsm_idle = 1'b1; ==> 375 state_d = StDisable; 376 end 377 378 default: begin 379 ctrl_fsm_idle = 1'b1; ==>

Branches:
-1--2--3--4--5--6--7--8-StatusTests
StIdle 1 - - - - - - Covered T4,T5,T6
StIdle 0 1 - - - - - Covered T1,T2,T3
StIdle 0 0 1 - - - - Covered T1,T2,T4
StIdle 0 0 0 1 - - - Covered T9,T27,T28
StIdle 0 0 0 0 - - - Covered T1,T2,T3
StCtrlRead - - - - 1 - - Covered T1,T2,T3
StCtrlRead - - - - 0 - - Covered T1,T2,T3
StCtrlProg - - - - - 1 - Covered T1,T2,T4
StCtrlProg - - - - - 0 - Covered T1,T2,T4
StCtrl - - - - - - 1 Covered T9,T27,T28
StCtrl - - - - - - 0 Covered T9,T27,T28
StDisable - - - - - - - Covered T4,T5,T6
default - - - - - - - Covered T12,T13,T14


Assert Coverage for Instance : tb.dut.u_eflash.gen_flash_cores[0].u_core
TotalAttemptedPercentSucceeded/MatchedPercent
Assertions 8 8 100.00 8 100.00
Cover properties 0 0 0
Cover sequences 0 0 0
Total 8 8 100.00 8 100.00




Assertion Details

Name   Attempts   Real Successes   Failures   Incomplete   
ArbCntMax_A 332875393 1565009 0 0
CtrlPrio_A 332875393 1565009 0 0
HostTransIdleChk_A 332875393 22113782 0 0
NoRemainder_A 1026 1026 0 0
OneHotReqs_A 332875393 332008659 0 0
Pow2Multiple_A 1026 1026 0 0
RdTxnCheck_A 332666161 331799427 0 0
u_state_regs_A 332875393 332008659 0 0


ArbCntMax_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 332875393 1565009 0 0
T29 73710 0 0 0
T43 0 2934 0 0
T52 55289 1407 0 0
T60 455046 0 0 0
T61 60850 1758 0 0
T67 89599 0 0 0
T74 58818 2223 0 0
T82 0 3243 0 0
T84 98649 0 0 0
T92 211010 0 0 0
T123 0 3382 0 0
T124 0 5530 0 0
T179 0 833 0 0
T218 60500 10 0 0
T220 0 1516 0 0
T221 1447 0 0 0

CtrlPrio_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 332875393 1565009 0 0
T29 73710 0 0 0
T43 0 2934 0 0
T52 55289 1407 0 0
T60 455046 0 0 0
T61 60850 1758 0 0
T67 89599 0 0 0
T74 58818 2223 0 0
T82 0 3243 0 0
T84 98649 0 0 0
T92 211010 0 0 0
T123 0 3382 0 0
T124 0 5530 0 0
T179 0 833 0 0
T218 60500 10 0 0
T220 0 1516 0 0
T221 1447 0 0 0

HostTransIdleChk_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 332875393 22113782 0 0
T6 873 25 0 0
T8 51282 265 0 0
T9 2110 0 0 0
T10 1263 10 0 0
T11 468 4 0 0
T17 1845 0 0 0
T19 0 337 0 0
T20 1105 15 0 0
T27 0 24 0 0
T33 1654 0 0 0
T34 0 4 0 0
T36 0 387 0 0
T59 1169 0 0 0
T64 0 706 0 0
T66 1241 0 0 0

NoRemainder_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 1026 1026 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
T8 1 1 0 0
T15 1 1 0 0
T16 1 1 0 0
T17 1 1 0 0

OneHotReqs_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 332875393 332008659 0 0
T1 1475 1361 0 0
T2 3694 3600 0 0
T3 2283 2194 0 0
T4 4375 3852 0 0
T5 1250 1151 0 0
T6 873 776 0 0
T8 51282 51232 0 0
T15 949 886 0 0
T16 1834 1745 0 0
T17 1845 1746 0 0

Pow2Multiple_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 1026 1026 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
T8 1 1 0 0
T15 1 1 0 0
T16 1 1 0 0
T17 1 1 0 0

RdTxnCheck_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 332666161 331799427 0 0
T1 1475 1361 0 0
T2 3694 3600 0 0
T3 2283 2194 0 0
T4 4375 3852 0 0
T5 1250 1151 0 0
T6 873 776 0 0
T8 51282 51232 0 0
T15 949 886 0 0
T16 1834 1745 0 0
T17 1845 1746 0 0

u_state_regs_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 332875393 332008659 0 0
T1 1475 1361 0 0
T2 3694 3600 0 0
T3 2283 2194 0 0
T4 4375 3852 0 0
T5 1250 1151 0 0
T6 873 776 0 0
T8 51282 51232 0 0
T15 949 886 0 0
T16 1834 1745 0 0
T17 1845 1746 0 0