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



Module Instance : tb.dut.u_eflash.u_flash.gen_generic.u_impl_generic.gen_prim_flash_banks[0].u_prim_flash_bank

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
93.55 96.48 92.86 93.75 91.11


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
94.67 96.04 90.48 93.75 93.10 100.00


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
80.00 80.00 gen_generic.u_impl_generic


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
gen_info_types[0].u_info_mem 95.24 85.71 100.00 100.00
gen_info_types[1].u_info_mem 95.24 85.71 100.00 100.00
gen_info_types[2].u_info_mem 95.24 85.71 100.00 100.00
u_cmd_fifo 97.22 100.00 88.89 100.00 100.00
u_mem 95.24 85.71 100.00 100.00
u_phy_cov_if 89.51 100.00 85.19 83.33



Module Instance : tb.dut.u_eflash.u_flash.gen_generic.u_impl_generic.gen_prim_flash_banks[1].u_prim_flash_bank

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
93.55 96.48 92.86 93.75 91.11


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
94.67 96.04 90.48 93.75 93.10 100.00


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
80.00 80.00 gen_generic.u_impl_generic


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
gen_info_types[0].u_info_mem 95.24 85.71 100.00 100.00
gen_info_types[1].u_info_mem 95.24 85.71 100.00 100.00
gen_info_types[2].u_info_mem 95.24 85.71 100.00 100.00
u_cmd_fifo 97.22 100.00 88.89 100.00 100.00
u_mem 95.24 85.71 100.00 100.00
u_phy_cov_if 89.51 100.00 85.19 83.33

Line Coverage for Module : prim_generic_flash_bank
Line No.TotalCoveredPercent
TOTAL14213796.48
CONT_ASSIGN12711100.00
CONT_ASSIGN15211100.00
CONT_ASSIGN15311100.00
CONT_ASSIGN17511100.00
CONT_ASSIGN17611100.00
CONT_ASSIGN17711100.00
CONT_ASSIGN17811100.00
CONT_ASSIGN18111100.00
CONT_ASSIGN18211100.00
CONT_ASSIGN18311100.00
CONT_ASSIGN18411100.00
CONT_ASSIGN18611100.00
ALWAYS18933100.00
ALWAYS19499100.00
ALWAYS21044100.00
ALWAYS22166100.00
CONT_ASSIGN23111100.00
ALWAYS236131292.31
ALWAYS251868295.35
CONT_ASSIGN40211100.00
CONT_ASSIGN42611100.00
CONT_ASSIGN42611100.00
CONT_ASSIGN42611100.00
CONT_ASSIGN44611100.00
CONT_ASSIGN44711100.00
CONT_ASSIGN45011100.00
CONT_ASSIGN45311100.00

126 127 1/1 assign cmd_d = '{ Tests: T1 T2 T3  128 rd : rd_i, 129 prog: prog_i, 130 prog_last: prog_last_i, 131 prog_type: prog_type_i, 132 pg_erase: pg_erase_i, 133 bk_erase: bk_erase_i, 134 addr: addr_i, 135 part: part_i, 136 info_sel: info_sel_i, 137 prog_data: prog_data_i 138 }; 139 140 // for read transactions, in order to reduce latency, the 141 // command fifo is popped early (before done_o). This is to ensure that when 142 // the current transaction is complete, during the same cycle 143 // a new read can be issued. As a result, the command is popped 144 // immediately after the read is issued, rather than waiting for 145 // the read to be completed. The same restrictions are not necessary 146 // for program / erase, which do not have the same performance 147 // requirements. 148 149 // when the flash is going through init, do not accept any transactions 150 logic wvalid; 151 logic ack; 152 1/1 assign wvalid = (rd_i | prog_i | pg_erase_i | bk_erase_i) & !init_busy_o; Tests: T1 T2 T3  153 1/1 assign ack_o = ack & !init_busy_o; Tests: T1 T2 T3  154 155 prim_fifo_sync #( 156 .Width ($bits(cmd_payload_t)), 157 .Pass (0), 158 .Depth (2) 159 ) u_cmd_fifo ( 160 .clk_i, 161 .rst_ni, 162 .clr_i (1'b0), 163 .wvalid_i(wvalid), 164 .wready_o(ack), 165 .wdata_i (cmd_d), 166 .depth_o (), 167 .full_o (), 168 .rvalid_o(cmd_valid), 169 .rready_i(pop_cmd), 170 .rdata_o (cmd_q), 171 .err_o () 172 ); 173 174 logic rd_req, prog_req, pg_erase_req, bk_erase_req; 175 1/1 assign rd_req = cmd_valid & cmd_q.rd; Tests: T1 T2 T3  176 1/1 assign prog_req = cmd_valid & cmd_q.prog; Tests: T1 T2 T3  177 1/1 assign pg_erase_req = cmd_valid & cmd_q.pg_erase; Tests: T1 T2 T3  178 1/1 assign bk_erase_req = cmd_valid & cmd_q.bk_erase; Tests: T1 T2 T3  179 180 // for read / program operations, the index cnt should be 0 181 1/1 assign mem_rd_d = mem_req & ~mem_wr; Tests: T1 T2 T3  182 1/1 assign mem_addr = cmd_q.addr + index_cnt[AddrW-1:0]; Tests: T1 T2 T3  183 1/1 assign mem_part = cmd_q.part; Tests: T1 T2 T3  184 1/1 assign mem_bk_erase = cmd_q.bk_erase; Tests: T1 T2 T3  185 186 1/1 assign mem_info_sel = cmd_q.info_sel; Tests: T1 T2 T3  187 188 always_ff @(posedge clk_i or negedge rst_ni) begin 189 2/2 if (!rst_ni) st_q <= StReset; Tests: T1 T2 T3  | T1 T2 T3  190 1/1 else st_q <= st_d; Tests: T1 T2 T3  191 end 192 193 always_ff @(posedge clk_i or negedge rst_ni) begin 194 1/1 if (!rst_ni) begin Tests: T1 T2 T3  195 1/1 time_limit_q <= 'h0; Tests: T1 T2 T3  196 1/1 index_limit_q <= 'h0; Tests: T1 T2 T3  197 1/1 prog_pend_q <= 'h0; Tests: T1 T2 T3  198 1/1 mem_rd_q <= 'h0; Tests: T1 T2 T3  199 end else begin 200 1/1 time_limit_q <= time_limit_d; Tests: T1 T2 T3  201 1/1 index_limit_q <= index_limit_d; Tests: T1 T2 T3  202 1/1 prog_pend_q <= prog_pend_d; Tests: T1 T2 T3  203 1/1 mem_rd_q <= mem_rd_d; Tests: T1 T2 T3  204 end 205 end 206 207 // latch read data from emulated memories the cycle after a read 208 logic [DataWidth-1:0] rd_data_q, rd_data_d; 209 always_ff @(posedge clk_i or negedge rst_ni) begin 210 1/1 if (!rst_ni) begin Tests: T1 T2 T3  211 1/1 rd_data_q <= '0; Tests: T1 T2 T3  212 1/1 end else if (mem_rd_q) begin Tests: T1 T2 T3  213 1/1 rd_data_q <= rd_data_d; Tests: T1 T2 T3  214 end MISSING_ELSE 215 end 216 217 // latch partiton being read since the command fifo is popped early 218 flash_ctrl_pkg::flash_part_e rd_part_q; 219 logic [InfoTypesWidth-1:0] info_sel_q; 220 always_ff @(posedge clk_i or negedge rst_ni) begin 221 1/1 if (!rst_ni) begin Tests: T1 T2 T3  222 1/1 rd_part_q <= flash_ctrl_pkg::FlashPartData; Tests: T1 T2 T3  223 1/1 info_sel_q <= '0; Tests: T1 T2 T3  224 1/1 end else if (mem_rd_d) begin Tests: T1 T2 T3  225 1/1 rd_part_q <= cmd_q.part; Tests: T1 T2 T3  226 1/1 info_sel_q <= cmd_q.info_sel; Tests: T1 T2 T3  227 end MISSING_ELSE 228 end 229 230 // if read cycle is only 1, we can expose the unlatched data directly 231 1/1 assign rd_data_o = ReadLatency == 1 ? rd_data_d : rd_data_q; Tests: T1 T2 T3  232 233 // prog_pend_q is necessary to emulate flash behavior that a bit written to 0 cannot be written 234 // back to 1 without an erase 235 always_ff @(posedge clk_i or negedge rst_ni) begin 236 1/1 if (!rst_ni) begin Tests: T1 T2 T3  237 1/1 time_cnt <= 'h0; Tests: T1 T2 T3  238 1/1 index_cnt <= 'h0; Tests: T1 T2 T3  239 end else begin 240 2/2 if (time_cnt_inc) time_cnt <= time_cnt + 1'b1; Tests: T1 T2 T3  | T1 T2 T3  241 1/2 ==> else if (time_cnt_set1) time_cnt <= 32'h1; Tests: T1 T2 T3  242 2/2 else if (time_cnt_clr) time_cnt <= 32'h0; Tests: T1 T2 T3  | T1 T2 T3  MISSING_ELSE 243 244 2/2 if (index_cnt_inc) index_cnt <= index_cnt + 1'b1; Tests: T1 T2 T3  | T1 T2 T3  245 2/2 else if (index_cnt_clr) index_cnt <= 32'h0; Tests: T1 T2 T3  | T1 T2 T3  MISSING_ELSE 246 end 247 end 248 249 always_comb begin 250 // state 251 1/1 st_d = st_q; Tests: T1 T2 T3  252 253 // internally consumed signals 254 1/1 index_limit_d = index_limit_q; Tests: T1 T2 T3  255 1/1 time_limit_d = time_limit_q; Tests: T1 T2 T3  256 1/1 prog_pend_d = prog_pend_q; Tests: T1 T2 T3  257 1/1 mem_req = '0; Tests: T1 T2 T3  258 1/1 mem_wr = '0; Tests: T1 T2 T3  259 1/1 mem_wdata = '0; Tests: T1 T2 T3  260 1/1 time_cnt_inc = '0; Tests: T1 T2 T3  261 1/1 time_cnt_clr = '0; Tests: T1 T2 T3  262 1/1 time_cnt_set1 = '0; Tests: T1 T2 T3  263 1/1 index_cnt_inc = '0; Tests: T1 T2 T3  264 1/1 index_cnt_clr = '0; Tests: T1 T2 T3  265 266 // i/o 267 1/1 init_busy_o = '0; Tests: T1 T2 T3  268 1/1 pop_cmd = '0; Tests: T1 T2 T3  269 1/1 done_o = '0; Tests: T1 T2 T3  270 271 1/1 unique case (st_q) Tests: T1 T2 T3  272 StReset: begin 273 1/1 init_busy_o = 1'b1; Tests: T1 T2 T3  274 1/1 if (init_i && flash_power_ready_h_i && !flash_power_down_h_i) begin Tests: T1 T2 T3  275 1/1 st_d = StInit; Tests: T1 T2 T3  276 end MISSING_ELSE 277 end 278 279 // Emulate flash initilaization with a wait timer 280 StInit: begin 281 1/1 init_busy_o = 1'h1; Tests: T1 T2 T3  282 1/1 if (index_cnt < InitCycles) begin Tests: T1 T2 T3  283 1/1 st_d = StInit; Tests: T1 T2 T3  284 1/1 index_cnt_inc = 1'b1; Tests: T1 T2 T3  285 end else begin 286 1/1 st_d = StIdle; Tests: T1 T2 T3  287 1/1 index_cnt_clr = 1'b1; Tests: T1 T2 T3  288 end 289 end 290 291 StIdle: begin 292 1/1 if (rd_req) begin Tests: T1 T2 T3  293 1/1 pop_cmd = 1'b1; Tests: T1 T2 T3  294 1/1 mem_req = 1'b1; Tests: T1 T2 T3  295 1/1 time_cnt_inc = 1'b1; Tests: T1 T2 T3  296 1/1 st_d = StRead; Tests: T1 T2 T3  297 1/1 end else if (prog_req) begin Tests: T1 T2 T3  298 1/1 mem_req = 1'b1; Tests: T1 T3 T10  299 1/1 prog_pend_d = 1'b1; Tests: T1 T3 T10  300 1/1 st_d = StRead; Tests: T1 T3 T10  301 1/1 end else if (pg_erase_req) begin Tests: T1 T2 T3  302 1/1 st_d = StErase; Tests: T3 T11 T17  303 1/1 index_limit_d = WordsPerPage; Tests: T3 T11 T17  304 1/1 time_limit_d = EraseLatency; Tests: T3 T11 T17  305 1/1 end else if (bk_erase_req) begin Tests: T1 T2 T3  306 1/1 st_d = StErase; Tests: T26 T27 T28  307 1/1 index_limit_d = WordsPerBank; Tests: T26 T27 T28  308 1/1 time_limit_d = BkEraseCycles; Tests: T26 T27 T28  309 end MISSING_ELSE 310 end 311 312 StRead: begin 313 1/1 if (time_cnt < ReadLatency) begin Tests: T1 T2 T3  314 1/1 time_cnt_inc = 1'b1; Tests: T1 T3 T10  315 316 1/1 end else if (!prog_pend_q) begin Tests: T1 T2 T3  317 1/1 done_o = 1'b1; Tests: T1 T2 T3  318 319 // if another request already pending 320 1/1 if (rd_req) begin Tests: T1 T2 T3  321 0/1 ==> pop_cmd = 1'b1; 322 0/1 ==> mem_req = 1'b1; 323 0/1 ==> time_cnt_set1 = 1'b1; 324 0/1 ==> st_d = StRead; 325 end else begin 326 1/1 time_cnt_clr = 1'b1; Tests: T1 T2 T3  327 1/1 st_d = StIdle; Tests: T1 T2 T3  328 end 329 330 1/1 end else if (prog_pend_q) begin Tests: T1 T3 T10  331 // this is the read performed before a program operation 332 1/1 prog_pend_d = 1'b0; Tests: T1 T3 T10  333 1/1 time_cnt_clr = 1'b1; Tests: T1 T3 T10  334 1/1 st_d = StProg; Tests: T1 T3 T10  335 end ==> MISSING_ELSE 336 end 337 338 StProg: begin 339 // if data is already 0, cannot program to 1 without erase 340 1/1 mem_wdata = cmd_q.prog_data & rd_data_q; Tests: T1 T3 T10  341 1/1 if (time_cnt < ProgLatency) begin Tests: T1 T3 T10  342 1/1 mem_req = 1'b1; Tests: T1 T3 T10  343 1/1 mem_wr = 1'b1; Tests: T1 T3 T10  344 1/1 time_cnt_inc = 1'b1; Tests: T1 T3 T10  345 end else begin 346 1/1 st_d = StIdle; Tests: T1 T3 T10  347 1/1 pop_cmd = 1'b1; Tests: T1 T3 T10  348 1/1 done_o = cmd_q.prog_last; Tests: T1 T3 T10  349 1/1 time_cnt_clr = 1'b1; Tests: T1 T3 T10  350 end 351 end 352 353 StErase: begin 354 // Actual erasing of the page 355 1/1 if (erase_suspend_req_i) begin Tests: T3 T11 T17  356 1/1 st_d = StErSuspend; Tests: T30 T27 T65  357 1/1 end else if (index_cnt < index_limit_q || time_cnt < time_limit_q) begin Tests: T3 T11 T17  358 1/1 mem_req = 1'b1; Tests: T3 T11 T17  359 1/1 mem_wr = 1'b1; Tests: T3 T11 T17  360 1/1 mem_wdata = {DataWidth{1'b1}}; Tests: T3 T11 T17  361 1/1 time_cnt_inc = (time_cnt < time_limit_q); Tests: T3 T11 T17  362 1/1 index_cnt_inc = (index_cnt < index_limit_q); Tests: T3 T11 T17  363 end else begin 364 1/1 st_d = StIdle; Tests: T3 T11 T17  365 1/1 pop_cmd = 1'b1; Tests: T3 T11 T17  366 1/1 done_o = 1'b1; Tests: T3 T11 T17  367 1/1 time_cnt_clr = 1'b1; Tests: T3 T11 T17  368 1/1 index_cnt_clr = 1'b1; Tests: T3 T11 T17  369 end 370 end // case: StErase 371 372 // The done can actually be signaled back in `StErase`, but move it 373 // to a different state to better model the ack_o/done_o timing separation 374 StErSuspend: begin 375 1/1 done_o = 1'b1; Tests: T30 T27 T65  376 1/1 pop_cmd = 1'b1; Tests: T30 T27 T65  377 1/1 time_cnt_clr = 1'b1; Tests: T30 T27 T65  378 1/1 index_cnt_clr = 1'b1; Tests: T30 T27 T65  379 1/1 st_d = StIdle; Tests: T30 T27 T65  380 end 381 382 383 default: begin 384 st_d = StIdle; 385 end 386 387 endcase // unique case (st_q) 388 389 // Emulate power down and power loss behavior 390 1/1 if (!flash_power_ready_h_i || flash_power_down_h_i) begin Tests: T1 T2 T3  391 1/1 st_d = StReset; Tests: T1 T2 T3  392 end MISSING_ELSE 393 394 end // always_comb 395 396 logic [DataWidth-1:0] rd_data_main, rd_data_info; 397 logic [InfoTypes-1:0][DataWidth-1:0] rd_nom_data_info; 398 399 // data memory is requested whenver it's a transaction targetted at the data partition 400 // OR if it's a bank erase 401 logic data_mem_req; 402 1/1 assign data_mem_req = mem_req & Tests: T1 T2 T3  403 (mem_part == flash_ctrl_pkg::FlashPartData | 404 mem_bk_erase); 405 406 prim_ram_1p #( 407 .Width(DataWidth), 408 .Depth(WordsPerBank), 409 .DataBitsPerMask(DataWidth) 410 ) u_mem ( 411 .clk_i, 412 .req_i (data_mem_req), 413 .write_i (mem_wr), 414 .addr_i (mem_addr), 415 .wdata_i (mem_wdata), 416 .wmask_i ({DataWidth{1'b1}}), 417 .rdata_o (rd_data_main), 418 .cfg_i ('0) 419 ); 420 421 for (genvar info_type = 0; info_type < InfoTypes; info_type++) begin : gen_info_types 422 423 // when info partitions are selected for bank erase, all info types are erased. 424 // if NOT bank erase, then only the selected info partition is erased 425 logic info_mem_req; 426 3/3 assign info_mem_req = mem_req & Tests: T1 T2 T3  | T1 T2 T3  | T1 T2 T3  427 (mem_part == flash_ctrl_pkg::FlashPartInfo) & 428 ((mem_info_sel == info_type) | mem_bk_erase); 429 430 prim_ram_1p #( 431 .Width(DataWidth), 432 .Depth(WordsPerInfoBank), 433 .DataBitsPerMask(DataWidth) 434 ) u_info_mem ( 435 .clk_i, 436 .req_i (info_mem_req), 437 .write_i (mem_wr), 438 .addr_i (mem_addr[0 +: InfoAddrW]), 439 .wdata_i (mem_wdata), 440 .wmask_i ({DataWidth{1'b1}}), 441 .rdata_o (rd_nom_data_info[info_type]), 442 .cfg_i ('0) 443 ); 444 end 445 446 1/1 assign rd_data_info = rd_nom_data_info[info_sel_q]; Tests: T1 T2 T3  447 1/1 assign rd_data_d = rd_part_q == flash_ctrl_pkg::FlashPartData ? rd_data_main : rd_data_info; Tests: T1 T2 T3  448 449 flash_ctrl_pkg::flash_prog_e unused_prog_type; 450 1/1 assign unused_prog_type = cmd_q.prog_type; Tests: T1 T2 T3  451 452 logic unused_he; 453 1/1 assign unused_he = he_i; Tests: T1 T2 T3 

Cond Coverage for Module : prim_generic_flash_bank
TotalCoveredPercent
Conditions847892.86
Logical847892.86
Non-Logical00
Event00

 LINE       152
 EXPRESSION ((rd_i | prog_i | pg_erase_i | bk_erase_i) & ((!init_busy_o)))
             --------------------1--------------------   --------2-------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT30,T65,T67
11CoveredT1,T2,T3

 LINE       152
 SUB-EXPRESSION (rd_i | prog_i | pg_erase_i | bk_erase_i)
                 --1-   ---2--   -----3----   -----4----
-1--2--3--4-StatusTests
0000CoveredT1,T2,T3
0001CoveredT26,T27,T28
0010CoveredT3,T11,T17
0100CoveredT1,T3,T10
1000CoveredT1,T2,T3

 LINE       153
 EXPRESSION (ack & ((!init_busy_o)))
             -1-   --------2-------
-1--2-StatusTests
01CoveredT1,T3,T10
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       175
 EXPRESSION (cmd_valid & cmd_q.rd)
             ----1----   ----2---
-1--2-StatusTests
01Not Covered
10CoveredT1,T3,T10
11CoveredT1,T2,T3

 LINE       176
 EXPRESSION (cmd_valid & cmd_q.prog)
             ----1----   -----2----
-1--2-StatusTests
01Not Covered
10CoveredT1,T2,T3
11CoveredT1,T3,T10

 LINE       177
 EXPRESSION (cmd_valid & cmd_q.pg_erase)
             ----1----   -------2------
-1--2-StatusTests
01Not Covered
10CoveredT1,T2,T3
11CoveredT3,T11,T17

 LINE       178
 EXPRESSION (cmd_valid & cmd_q.bk_erase)
             ----1----   -------2------
-1--2-StatusTests
01Not Covered
10CoveredT1,T2,T3
11CoveredT26,T27,T28

 LINE       181
 EXPRESSION (mem_req & ((~mem_wr)))
             ---1---   -----2-----
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T3,T10
11CoveredT1,T2,T3

 LINE       231
 EXPRESSION ((ReadLatency == 1) ? rd_data_d : rd_data_q)
             ---------1--------
-1-StatusTests
0CoveredT78,T37,T79
1CoveredT1,T2,T3

 LINE       231
 SUB-EXPRESSION (ReadLatency == 1)
                ---------1--------
-1-StatusTests
0CoveredT78,T37,T79
1CoveredT1,T2,T3

 LINE       274
 EXPRESSION (init_i && flash_power_ready_h_i && ((!flash_power_down_h_i)))
             ---1--    ----------2----------    ------------3------------
-1--2--3-StatusTests
011Unreachable
101CoveredT30,T65,T67
110CoveredT1,T2,T3
111CoveredT1,T2,T3

 LINE       357
 EXPRESSION ((index_cnt < index_limit_q) || (time_cnt < time_limit_q))
             -------------1-------------    ------------2------------
-1--2-StatusTests
00CoveredT3,T11,T17
01Not Covered
10CoveredT3,T11,T17

 LINE       390
 EXPRESSION (((!flash_power_ready_h_i)) || flash_power_down_h_i)
             -------------1------------    ----------2---------
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT1,T2,T3
10CoveredT30,T65,T67

 LINE       402
 EXPRESSION (mem_req & ((mem_part == FlashPartData) | mem_bk_erase))
             ---1---   ----------------------2---------------------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       402
 SUB-EXPRESSION ((mem_part == FlashPartData) | mem_bk_erase)
                 -------------1-------------   ------2-----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT26,T29,T80
10CoveredT1,T2,T3

 LINE       402
 SUB-EXPRESSION (mem_part == FlashPartData)
                -------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       426
 EXPRESSION (mem_req & (mem_part == FlashPartInfo) & ((mem_info_sel == 0) | mem_bk_erase))
             ---1---   -------------2-------------   ------------------3-----------------
-1--2--3-StatusTests
011CoveredT11,T4,T18
101CoveredT1,T2,T3
110CoveredT18,T13,T48
111CoveredT1,T2,T3

 LINE       426
 SUB-EXPRESSION (mem_part == FlashPartInfo)
                -------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       426
 SUB-EXPRESSION ((mem_info_sel == 0) | mem_bk_erase)
                 ---------1---------   ------2-----
-1--2-StatusTests
00CoveredT18,T13,T48
01Not Covered
10CoveredT1,T2,T3

 LINE       426
 SUB-EXPRESSION (mem_info_sel == 0)
                ---------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       426
 EXPRESSION (mem_req & (mem_part == FlashPartInfo) & ((mem_info_sel == 1) | mem_bk_erase))
             ---1---   -------------2-------------   ------------------3-----------------
-1--2--3-StatusTests
011CoveredT26,T29,T80
101CoveredT13,T27,T48
110CoveredT1,T2,T3
111CoveredT18,T26,T49

 LINE       426
 SUB-EXPRESSION (mem_part == FlashPartInfo)
                -------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       426
 SUB-EXPRESSION ((mem_info_sel == 1) | mem_bk_erase)
                 ---------1---------   ------2-----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT26,T27,T28
10CoveredT18,T13,T48

 LINE       426
 SUB-EXPRESSION (mem_info_sel == 1)
                ---------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT18,T13,T48

 LINE       426
 EXPRESSION (mem_req & (mem_part == FlashPartInfo) & ((mem_info_sel == 2) | mem_bk_erase))
             ---1---   -------------2-------------   ------------------3-----------------
-1--2--3-StatusTests
011CoveredT18,T26,T50
101CoveredT13,T27,T48
110CoveredT1,T2,T3
111CoveredT18,T26,T13

 LINE       426
 SUB-EXPRESSION (mem_part == FlashPartInfo)
                -------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       426
 SUB-EXPRESSION ((mem_info_sel == 2) | mem_bk_erase)
                 ---------1---------   ------2-----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT26,T27,T28
10CoveredT18,T13,T48

 LINE       426
 SUB-EXPRESSION (mem_info_sel == 2)
                ---------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT18,T13,T48

 LINE       447
 EXPRESSION ((rd_part_q == FlashPartData) ? rd_data_main : rd_data_info)
             --------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       447
 SUB-EXPRESSION (rd_part_q == FlashPartData)
                --------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

FSM Coverage for Module : prim_generic_flash_bank
Summary for FSM :: st_q
TotalCoveredPercent
States 7 7 100.00 (Not included in score)
Transitions 16 15 93.75
Sequences 0 0

State, Transition and Sequence Details for FSM :: st_q
statesLine No.CoveredTests
StErSuspend 356 Covered T30,T27,T65
StErase 302 Covered T3,T11,T17
StIdle 286 Covered T1,T2,T3
StInit 275 Covered T1,T2,T3
StProg 334 Covered T1,T3,T10
StRead 296 Covered T1,T2,T3
StReset 391 Covered T1,T2,T3


transitionsLine No.CoveredTests
StErSuspend->StIdle 379 Covered T27,T66,T31
StErSuspend->StReset 391 Covered T30,T65,T67
StErase->StErSuspend 356 Covered T30,T27,T65
StErase->StIdle 364 Covered T3,T11,T17
StErase->StReset 391 Covered T4,T30,T65
StIdle->StErase 302 Covered T3,T11,T17
StIdle->StRead 296 Covered T1,T2,T3
StIdle->StReset 391 Covered T11,T4,T30
StInit->StIdle 286 Covered T1,T2,T3
StInit->StReset 391 Not Covered
StProg->StIdle 346 Covered T1,T3,T10
StProg->StReset 391 Covered T30,T81,T65
StRead->StIdle 327 Covered T1,T2,T3
StRead->StProg 334 Covered T1,T3,T10
StRead->StReset 391 Covered T82,T83,T84
StReset->StInit 275 Covered T1,T2,T3



Branch Coverage for Module : prim_generic_flash_bank
Line No.TotalCoveredPercent
Branches 45 41 91.11
TERNARY 231 2 2 100.00
TERNARY 447 2 2 100.00
IF 189 2 2 100.00
IF 194 2 2 100.00
IF 210 3 3 100.00
IF 221 3 3 100.00
IF 236 8 7 87.50
CASE 271 21 18 85.71
IF 390 2 2 100.00


231 assign rd_data_o = ReadLatency == 1 ? rd_data_d : rd_data_q; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
0 Covered T78,T37,T79


447 assign rd_data_d = rd_part_q == flash_ctrl_pkg::FlashPartData ? rd_data_main : rd_data_info; -1- ==> ==>

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


189 if (!rst_ni) st_q <= StReset; -1- ==> 190 else st_q <= st_d; ==>

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


194 if (!rst_ni) begin -1- 195 time_limit_q <= 'h0; ==> 196 index_limit_q <= 'h0; 197 prog_pend_q <= 'h0; 198 mem_rd_q <= 'h0; 199 end else begin 200 time_limit_q <= time_limit_d; ==>

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


210 if (!rst_ni) begin -1- 211 rd_data_q <= '0; ==> 212 end else if (mem_rd_q) begin -2- 213 rd_data_q <= rd_data_d; ==> 214 end MISSING_ELSE ==>

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


221 if (!rst_ni) begin -1- 222 rd_part_q <= flash_ctrl_pkg::FlashPartData; ==> 223 info_sel_q <= '0; 224 end else if (mem_rd_d) begin -2- 225 rd_part_q <= cmd_q.part; ==> 226 info_sel_q <= cmd_q.info_sel; 227 end MISSING_ELSE ==>

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


236 if (!rst_ni) begin -1- 237 time_cnt <= 'h0; ==> 238 index_cnt <= 'h0; 239 end else begin 240 if (time_cnt_inc) time_cnt <= time_cnt + 1'b1; -2- ==> 241 else if (time_cnt_set1) time_cnt <= 32'h1; -3- ==> 242 else if (time_cnt_clr) time_cnt <= 32'h0; -4- ==> MISSING_ELSE ==> 243 244 if (index_cnt_inc) index_cnt <= index_cnt + 1'b1; -5- ==> 245 else if (index_cnt_clr) index_cnt <= 32'h0; -6- ==> MISSING_ELSE ==>

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


271 unique case (st_q) -1- 272 StReset: begin 273 init_busy_o = 1'b1; 274 if (init_i && flash_power_ready_h_i && !flash_power_down_h_i) begin -2- 275 st_d = StInit; ==> 276 end MISSING_ELSE ==> 277 end 278 279 // Emulate flash initilaization with a wait timer 280 StInit: begin 281 init_busy_o = 1'h1; 282 if (index_cnt < InitCycles) begin -3- 283 st_d = StInit; ==> 284 index_cnt_inc = 1'b1; 285 end else begin 286 st_d = StIdle; ==> 287 index_cnt_clr = 1'b1; 288 end 289 end 290 291 StIdle: begin 292 if (rd_req) begin -4- 293 pop_cmd = 1'b1; ==> 294 mem_req = 1'b1; 295 time_cnt_inc = 1'b1; 296 st_d = StRead; 297 end else if (prog_req) begin -5- 298 mem_req = 1'b1; ==> 299 prog_pend_d = 1'b1; 300 st_d = StRead; 301 end else if (pg_erase_req) begin -6- 302 st_d = StErase; ==> 303 index_limit_d = WordsPerPage; 304 time_limit_d = EraseLatency; 305 end else if (bk_erase_req) begin -7- 306 st_d = StErase; ==> 307 index_limit_d = WordsPerBank; 308 time_limit_d = BkEraseCycles; 309 end MISSING_ELSE ==> 310 end 311 312 StRead: begin 313 if (time_cnt < ReadLatency) begin -8- 314 time_cnt_inc = 1'b1; ==> 315 316 end else if (!prog_pend_q) begin -9- 317 done_o = 1'b1; 318 319 // if another request already pending 320 if (rd_req) begin -10- 321 pop_cmd = 1'b1; ==> 322 mem_req = 1'b1; 323 time_cnt_set1 = 1'b1; 324 st_d = StRead; 325 end else begin 326 time_cnt_clr = 1'b1; ==> 327 st_d = StIdle; 328 end 329 330 end else if (prog_pend_q) begin -11- 331 // this is the read performed before a program operation 332 prog_pend_d = 1'b0; ==> 333 time_cnt_clr = 1'b1; 334 st_d = StProg; 335 end MISSING_ELSE ==> 336 end 337 338 StProg: begin 339 // if data is already 0, cannot program to 1 without erase 340 mem_wdata = cmd_q.prog_data & rd_data_q; 341 if (time_cnt < ProgLatency) begin -12- 342 mem_req = 1'b1; ==> 343 mem_wr = 1'b1; 344 time_cnt_inc = 1'b1; 345 end else begin 346 st_d = StIdle; ==> 347 pop_cmd = 1'b1; 348 done_o = cmd_q.prog_last; 349 time_cnt_clr = 1'b1; 350 end 351 end 352 353 StErase: begin 354 // Actual erasing of the page 355 if (erase_suspend_req_i) begin -13- 356 st_d = StErSuspend; ==> 357 end else if (index_cnt < index_limit_q || time_cnt < time_limit_q) begin -14- 358 mem_req = 1'b1; ==> 359 mem_wr = 1'b1; 360 mem_wdata = {DataWidth{1'b1}}; 361 time_cnt_inc = (time_cnt < time_limit_q); 362 index_cnt_inc = (index_cnt < index_limit_q); 363 end else begin 364 st_d = StIdle; ==> 365 pop_cmd = 1'b1; 366 done_o = 1'b1; 367 time_cnt_clr = 1'b1; 368 index_cnt_clr = 1'b1; 369 end 370 end // case: StErase 371 372 // The done can actually be signaled back in `StErase`, but move it 373 // to a different state to better model the ack_o/done_o timing separation 374 StErSuspend: begin 375 done_o = 1'b1; ==> 376 pop_cmd = 1'b1; 377 time_cnt_clr = 1'b1; 378 index_cnt_clr = 1'b1; 379 st_d = StIdle; 380 end 381 382 383 default: begin 384 st_d = StIdle; ==>

Branches:
-1--2--3--4--5--6--7--8--9--10--11--12--13--14-StatusTests
StReset 1 - - - - - - - - - - - - Covered T1,T2,T3
StReset 0 - - - - - - - - - - - - Covered T1,T2,T3
StInit - 1 - - - - - - - - - - - Covered T1,T2,T3
StInit - 0 - - - - - - - - - - - Covered T1,T2,T3
StIdle - - 1 - - - - - - - - - - Covered T1,T2,T3
StIdle - - 0 1 - - - - - - - - - Covered T1,T3,T10
StIdle - - 0 0 1 - - - - - - - - Covered T3,T11,T17
StIdle - - 0 0 0 1 - - - - - - - Covered T26,T27,T28
StIdle - - 0 0 0 0 - - - - - - - Covered T1,T2,T3
StRead - - - - - - 1 - - - - - - Covered T1,T3,T10
StRead - - - - - - 0 1 1 - - - - Not Covered
StRead - - - - - - 0 1 0 - - - - Covered T1,T2,T3
StRead - - - - - - 0 0 - 1 - - - Covered T1,T3,T10
StRead - - - - - - 0 0 - 0 - - - Not Covered
StProg - - - - - - - - - - 1 - - Covered T1,T3,T10
StProg - - - - - - - - - - 0 - - Covered T1,T3,T10
StErase - - - - - - - - - - - 1 - Covered T30,T27,T65
StErase - - - - - - - - - - - 0 1 Covered T3,T11,T17
StErase - - - - - - - - - - - 0 0 Covered T3,T11,T17
StErSuspend - - - - - - - - - - - - - Covered T30,T27,T65
default - - - - - - - - - - - - - Not Covered


390 if (!flash_power_ready_h_i || flash_power_down_h_i) begin -1- 391 st_d = StReset; ==> 392 end MISSING_ELSE ==>

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

Line Coverage for Instance : tb.dut.u_eflash.u_flash.gen_generic.u_impl_generic.gen_prim_flash_banks[0].u_prim_flash_bank
Line No.TotalCoveredPercent
TOTAL14213796.48
CONT_ASSIGN12711100.00
CONT_ASSIGN15211100.00
CONT_ASSIGN15311100.00
CONT_ASSIGN17511100.00
CONT_ASSIGN17611100.00
CONT_ASSIGN17711100.00
CONT_ASSIGN17811100.00
CONT_ASSIGN18111100.00
CONT_ASSIGN18211100.00
CONT_ASSIGN18311100.00
CONT_ASSIGN18411100.00
CONT_ASSIGN18611100.00
ALWAYS18933100.00
ALWAYS19499100.00
ALWAYS21044100.00
ALWAYS22166100.00
CONT_ASSIGN23111100.00
ALWAYS236131292.31
ALWAYS251868295.35
CONT_ASSIGN40211100.00
CONT_ASSIGN42611100.00
CONT_ASSIGN42611100.00
CONT_ASSIGN42611100.00
CONT_ASSIGN44611100.00
CONT_ASSIGN44711100.00
CONT_ASSIGN45011100.00
CONT_ASSIGN45311100.00

126 127 1/1 assign cmd_d = '{ Tests: T1 T2 T3  128 rd : rd_i, 129 prog: prog_i, 130 prog_last: prog_last_i, 131 prog_type: prog_type_i, 132 pg_erase: pg_erase_i, 133 bk_erase: bk_erase_i, 134 addr: addr_i, 135 part: part_i, 136 info_sel: info_sel_i, 137 prog_data: prog_data_i 138 }; 139 140 // for read transactions, in order to reduce latency, the 141 // command fifo is popped early (before done_o). This is to ensure that when 142 // the current transaction is complete, during the same cycle 143 // a new read can be issued. As a result, the command is popped 144 // immediately after the read is issued, rather than waiting for 145 // the read to be completed. The same restrictions are not necessary 146 // for program / erase, which do not have the same performance 147 // requirements. 148 149 // when the flash is going through init, do not accept any transactions 150 logic wvalid; 151 logic ack; 152 1/1 assign wvalid = (rd_i | prog_i | pg_erase_i | bk_erase_i) & !init_busy_o; Tests: T1 T2 T3  153 1/1 assign ack_o = ack & !init_busy_o; Tests: T1 T2 T3  154 155 prim_fifo_sync #( 156 .Width ($bits(cmd_payload_t)), 157 .Pass (0), 158 .Depth (2) 159 ) u_cmd_fifo ( 160 .clk_i, 161 .rst_ni, 162 .clr_i (1'b0), 163 .wvalid_i(wvalid), 164 .wready_o(ack), 165 .wdata_i (cmd_d), 166 .depth_o (), 167 .full_o (), 168 .rvalid_o(cmd_valid), 169 .rready_i(pop_cmd), 170 .rdata_o (cmd_q), 171 .err_o () 172 ); 173 174 logic rd_req, prog_req, pg_erase_req, bk_erase_req; 175 1/1 assign rd_req = cmd_valid & cmd_q.rd; Tests: T1 T2 T3  176 1/1 assign prog_req = cmd_valid & cmd_q.prog; Tests: T1 T2 T3  177 1/1 assign pg_erase_req = cmd_valid & cmd_q.pg_erase; Tests: T1 T2 T3  178 1/1 assign bk_erase_req = cmd_valid & cmd_q.bk_erase; Tests: T1 T2 T3  179 180 // for read / program operations, the index cnt should be 0 181 1/1 assign mem_rd_d = mem_req & ~mem_wr; Tests: T1 T2 T3  182 1/1 assign mem_addr = cmd_q.addr + index_cnt[AddrW-1:0]; Tests: T1 T2 T3  183 1/1 assign mem_part = cmd_q.part; Tests: T1 T2 T3  184 1/1 assign mem_bk_erase = cmd_q.bk_erase; Tests: T1 T2 T3  185 186 1/1 assign mem_info_sel = cmd_q.info_sel; Tests: T1 T2 T3  187 188 always_ff @(posedge clk_i or negedge rst_ni) begin 189 2/2 if (!rst_ni) st_q <= StReset; Tests: T1 T2 T3  | T1 T2 T3  190 1/1 else st_q <= st_d; Tests: T1 T2 T3  191 end 192 193 always_ff @(posedge clk_i or negedge rst_ni) begin 194 1/1 if (!rst_ni) begin Tests: T1 T2 T3  195 1/1 time_limit_q <= 'h0; Tests: T1 T2 T3  196 1/1 index_limit_q <= 'h0; Tests: T1 T2 T3  197 1/1 prog_pend_q <= 'h0; Tests: T1 T2 T3  198 1/1 mem_rd_q <= 'h0; Tests: T1 T2 T3  199 end else begin 200 1/1 time_limit_q <= time_limit_d; Tests: T1 T2 T3  201 1/1 index_limit_q <= index_limit_d; Tests: T1 T2 T3  202 1/1 prog_pend_q <= prog_pend_d; Tests: T1 T2 T3  203 1/1 mem_rd_q <= mem_rd_d; Tests: T1 T2 T3  204 end 205 end 206 207 // latch read data from emulated memories the cycle after a read 208 logic [DataWidth-1:0] rd_data_q, rd_data_d; 209 always_ff @(posedge clk_i or negedge rst_ni) begin 210 1/1 if (!rst_ni) begin Tests: T1 T2 T3  211 1/1 rd_data_q <= '0; Tests: T1 T2 T3  212 1/1 end else if (mem_rd_q) begin Tests: T1 T2 T3  213 1/1 rd_data_q <= rd_data_d; Tests: T1 T2 T3  214 end MISSING_ELSE 215 end 216 217 // latch partiton being read since the command fifo is popped early 218 flash_ctrl_pkg::flash_part_e rd_part_q; 219 logic [InfoTypesWidth-1:0] info_sel_q; 220 always_ff @(posedge clk_i or negedge rst_ni) begin 221 1/1 if (!rst_ni) begin Tests: T1 T2 T3  222 1/1 rd_part_q <= flash_ctrl_pkg::FlashPartData; Tests: T1 T2 T3  223 1/1 info_sel_q <= '0; Tests: T1 T2 T3  224 1/1 end else if (mem_rd_d) begin Tests: T1 T2 T3  225 1/1 rd_part_q <= cmd_q.part; Tests: T1 T2 T3  226 1/1 info_sel_q <= cmd_q.info_sel; Tests: T1 T2 T3  227 end MISSING_ELSE 228 end 229 230 // if read cycle is only 1, we can expose the unlatched data directly 231 1/1 assign rd_data_o = ReadLatency == 1 ? rd_data_d : rd_data_q; Tests: T1 T2 T3  232 233 // prog_pend_q is necessary to emulate flash behavior that a bit written to 0 cannot be written 234 // back to 1 without an erase 235 always_ff @(posedge clk_i or negedge rst_ni) begin 236 1/1 if (!rst_ni) begin Tests: T1 T2 T3  237 1/1 time_cnt <= 'h0; Tests: T1 T2 T3  238 1/1 index_cnt <= 'h0; Tests: T1 T2 T3  239 end else begin 240 2/2 if (time_cnt_inc) time_cnt <= time_cnt + 1'b1; Tests: T1 T2 T3  | T1 T2 T3  241 1/2 ==> else if (time_cnt_set1) time_cnt <= 32'h1; Tests: T1 T2 T3  242 2/2 else if (time_cnt_clr) time_cnt <= 32'h0; Tests: T1 T2 T3  | T1 T2 T3  MISSING_ELSE 243 244 2/2 if (index_cnt_inc) index_cnt <= index_cnt + 1'b1; Tests: T1 T2 T3  | T1 T2 T3  245 2/2 else if (index_cnt_clr) index_cnt <= 32'h0; Tests: T1 T2 T3  | T1 T2 T3  MISSING_ELSE 246 end 247 end 248 249 always_comb begin 250 // state 251 1/1 st_d = st_q; Tests: T1 T2 T3  252 253 // internally consumed signals 254 1/1 index_limit_d = index_limit_q; Tests: T1 T2 T3  255 1/1 time_limit_d = time_limit_q; Tests: T1 T2 T3  256 1/1 prog_pend_d = prog_pend_q; Tests: T1 T2 T3  257 1/1 mem_req = '0; Tests: T1 T2 T3  258 1/1 mem_wr = '0; Tests: T1 T2 T3  259 1/1 mem_wdata = '0; Tests: T1 T2 T3  260 1/1 time_cnt_inc = '0; Tests: T1 T2 T3  261 1/1 time_cnt_clr = '0; Tests: T1 T2 T3  262 1/1 time_cnt_set1 = '0; Tests: T1 T2 T3  263 1/1 index_cnt_inc = '0; Tests: T1 T2 T3  264 1/1 index_cnt_clr = '0; Tests: T1 T2 T3  265 266 // i/o 267 1/1 init_busy_o = '0; Tests: T1 T2 T3  268 1/1 pop_cmd = '0; Tests: T1 T2 T3  269 1/1 done_o = '0; Tests: T1 T2 T3  270 271 1/1 unique case (st_q) Tests: T1 T2 T3  272 StReset: begin 273 1/1 init_busy_o = 1'b1; Tests: T1 T2 T3  274 1/1 if (init_i && flash_power_ready_h_i && !flash_power_down_h_i) begin Tests: T1 T2 T3  275 1/1 st_d = StInit; Tests: T1 T2 T3  276 end MISSING_ELSE 277 end 278 279 // Emulate flash initilaization with a wait timer 280 StInit: begin 281 1/1 init_busy_o = 1'h1; Tests: T1 T2 T3  282 1/1 if (index_cnt < InitCycles) begin Tests: T1 T2 T3  283 1/1 st_d = StInit; Tests: T1 T2 T3  284 1/1 index_cnt_inc = 1'b1; Tests: T1 T2 T3  285 end else begin 286 1/1 st_d = StIdle; Tests: T1 T2 T3  287 1/1 index_cnt_clr = 1'b1; Tests: T1 T2 T3  288 end 289 end 290 291 StIdle: begin 292 1/1 if (rd_req) begin Tests: T1 T2 T3  293 1/1 pop_cmd = 1'b1; Tests: T1 T2 T3  294 1/1 mem_req = 1'b1; Tests: T1 T2 T3  295 1/1 time_cnt_inc = 1'b1; Tests: T1 T2 T3  296 1/1 st_d = StRead; Tests: T1 T2 T3  297 1/1 end else if (prog_req) begin Tests: T1 T2 T3  298 1/1 mem_req = 1'b1; Tests: T3 T10 T11  299 1/1 prog_pend_d = 1'b1; Tests: T3 T10 T11  300 1/1 st_d = StRead; Tests: T3 T10 T11  301 1/1 end else if (pg_erase_req) begin Tests: T1 T2 T3  302 1/1 st_d = StErase; Tests: T3 T11 T17  303 1/1 index_limit_d = WordsPerPage; Tests: T3 T11 T17  304 1/1 time_limit_d = EraseLatency; Tests: T3 T11 T17  305 1/1 end else if (bk_erase_req) begin Tests: T1 T2 T3  306 1/1 st_d = StErase; Tests: T26 T27 T29  307 1/1 index_limit_d = WordsPerBank; Tests: T26 T27 T29  308 1/1 time_limit_d = BkEraseCycles; Tests: T26 T27 T29  309 end MISSING_ELSE 310 end 311 312 StRead: begin 313 1/1 if (time_cnt < ReadLatency) begin Tests: T1 T2 T3  314 1/1 time_cnt_inc = 1'b1; Tests: T3 T10 T11  315 316 1/1 end else if (!prog_pend_q) begin Tests: T1 T2 T3  317 1/1 done_o = 1'b1; Tests: T1 T2 T3  318 319 // if another request already pending 320 1/1 if (rd_req) begin Tests: T1 T2 T3  321 0/1 ==> pop_cmd = 1'b1; 322 0/1 ==> mem_req = 1'b1; 323 0/1 ==> time_cnt_set1 = 1'b1; 324 0/1 ==> st_d = StRead; 325 end else begin 326 1/1 time_cnt_clr = 1'b1; Tests: T1 T2 T3  327 1/1 st_d = StIdle; Tests: T1 T2 T3  328 end 329 330 1/1 end else if (prog_pend_q) begin Tests: T3 T10 T11  331 // this is the read performed before a program operation 332 1/1 prog_pend_d = 1'b0; Tests: T3 T10 T11  333 1/1 time_cnt_clr = 1'b1; Tests: T3 T10 T11  334 1/1 st_d = StProg; Tests: T3 T10 T11  335 end ==> MISSING_ELSE 336 end 337 338 StProg: begin 339 // if data is already 0, cannot program to 1 without erase 340 1/1 mem_wdata = cmd_q.prog_data & rd_data_q; Tests: T3 T10 T11  341 1/1 if (time_cnt < ProgLatency) begin Tests: T3 T10 T11  342 1/1 mem_req = 1'b1; Tests: T3 T10 T11  343 1/1 mem_wr = 1'b1; Tests: T3 T10 T11  344 1/1 time_cnt_inc = 1'b1; Tests: T3 T10 T11  345 end else begin 346 1/1 st_d = StIdle; Tests: T3 T10 T11  347 1/1 pop_cmd = 1'b1; Tests: T3 T10 T11  348 1/1 done_o = cmd_q.prog_last; Tests: T3 T10 T11  349 1/1 time_cnt_clr = 1'b1; Tests: T3 T10 T11  350 end 351 end 352 353 StErase: begin 354 // Actual erasing of the page 355 1/1 if (erase_suspend_req_i) begin Tests: T3 T11 T17  356 1/1 st_d = StErSuspend; Tests: T27 T65 T66  357 1/1 end else if (index_cnt < index_limit_q || time_cnt < time_limit_q) begin Tests: T3 T11 T17  358 1/1 mem_req = 1'b1; Tests: T3 T11 T17  359 1/1 mem_wr = 1'b1; Tests: T3 T11 T17  360 1/1 mem_wdata = {DataWidth{1'b1}}; Tests: T3 T11 T17  361 1/1 time_cnt_inc = (time_cnt < time_limit_q); Tests: T3 T11 T17  362 1/1 index_cnt_inc = (index_cnt < index_limit_q); Tests: T3 T11 T17  363 end else begin 364 1/1 st_d = StIdle; Tests: T3 T11 T17  365 1/1 pop_cmd = 1'b1; Tests: T3 T11 T17  366 1/1 done_o = 1'b1; Tests: T3 T11 T17  367 1/1 time_cnt_clr = 1'b1; Tests: T3 T11 T17  368 1/1 index_cnt_clr = 1'b1; Tests: T3 T11 T17  369 end 370 end // case: StErase 371 372 // The done can actually be signaled back in `StErase`, but move it 373 // to a different state to better model the ack_o/done_o timing separation 374 StErSuspend: begin 375 1/1 done_o = 1'b1; Tests: T27 T65 T66  376 1/1 pop_cmd = 1'b1; Tests: T27 T65 T66  377 1/1 time_cnt_clr = 1'b1; Tests: T27 T65 T66  378 1/1 index_cnt_clr = 1'b1; Tests: T27 T65 T66  379 1/1 st_d = StIdle; Tests: T27 T65 T66  380 end 381 382 383 default: begin 384 st_d = StIdle; 385 end 386 387 endcase // unique case (st_q) 388 389 // Emulate power down and power loss behavior 390 1/1 if (!flash_power_ready_h_i || flash_power_down_h_i) begin Tests: T1 T2 T3  391 1/1 st_d = StReset; Tests: T1 T2 T3  392 end MISSING_ELSE 393 394 end // always_comb 395 396 logic [DataWidth-1:0] rd_data_main, rd_data_info; 397 logic [InfoTypes-1:0][DataWidth-1:0] rd_nom_data_info; 398 399 // data memory is requested whenver it's a transaction targetted at the data partition 400 // OR if it's a bank erase 401 logic data_mem_req; 402 1/1 assign data_mem_req = mem_req & Tests: T1 T2 T3  403 (mem_part == flash_ctrl_pkg::FlashPartData | 404 mem_bk_erase); 405 406 prim_ram_1p #( 407 .Width(DataWidth), 408 .Depth(WordsPerBank), 409 .DataBitsPerMask(DataWidth) 410 ) u_mem ( 411 .clk_i, 412 .req_i (data_mem_req), 413 .write_i (mem_wr), 414 .addr_i (mem_addr), 415 .wdata_i (mem_wdata), 416 .wmask_i ({DataWidth{1'b1}}), 417 .rdata_o (rd_data_main), 418 .cfg_i ('0) 419 ); 420 421 for (genvar info_type = 0; info_type < InfoTypes; info_type++) begin : gen_info_types 422 423 // when info partitions are selected for bank erase, all info types are erased. 424 // if NOT bank erase, then only the selected info partition is erased 425 logic info_mem_req; 426 3/3 assign info_mem_req = mem_req & Tests: T1 T2 T3  | T1 T2 T3  | T1 T2 T3  427 (mem_part == flash_ctrl_pkg::FlashPartInfo) & 428 ((mem_info_sel == info_type) | mem_bk_erase); 429 430 prim_ram_1p #( 431 .Width(DataWidth), 432 .Depth(WordsPerInfoBank), 433 .DataBitsPerMask(DataWidth) 434 ) u_info_mem ( 435 .clk_i, 436 .req_i (info_mem_req), 437 .write_i (mem_wr), 438 .addr_i (mem_addr[0 +: InfoAddrW]), 439 .wdata_i (mem_wdata), 440 .wmask_i ({DataWidth{1'b1}}), 441 .rdata_o (rd_nom_data_info[info_type]), 442 .cfg_i ('0) 443 ); 444 end 445 446 1/1 assign rd_data_info = rd_nom_data_info[info_sel_q]; Tests: T1 T2 T3  447 1/1 assign rd_data_d = rd_part_q == flash_ctrl_pkg::FlashPartData ? rd_data_main : rd_data_info; Tests: T1 T2 T3  448 449 flash_ctrl_pkg::flash_prog_e unused_prog_type; 450 1/1 assign unused_prog_type = cmd_q.prog_type; Tests: T1 T2 T3  451 452 logic unused_he; 453 1/1 assign unused_he = he_i; Tests: T1 T2 T3 

Cond Coverage for Instance : tb.dut.u_eflash.u_flash.gen_generic.u_impl_generic.gen_prim_flash_banks[0].u_prim_flash_bank
TotalCoveredPercent
Conditions847892.86
Logical847892.86
Non-Logical00
Event00

 LINE       152
 EXPRESSION ((rd_i | prog_i | pg_erase_i | bk_erase_i) & ((!init_busy_o)))
             --------------------1--------------------   --------2-------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT30,T65,T85
11CoveredT1,T2,T3

 LINE       152
 SUB-EXPRESSION (rd_i | prog_i | pg_erase_i | bk_erase_i)
                 --1-   ---2--   -----3----   -----4----
-1--2--3--4-StatusTests
0000CoveredT1,T2,T3
0001CoveredT26,T27,T29
0010CoveredT3,T11,T17
0100CoveredT3,T10,T11
1000CoveredT1,T2,T3

 LINE       153
 EXPRESSION (ack & ((!init_busy_o)))
             -1-   --------2-------
-1--2-StatusTests
01CoveredT3,T10,T11
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       175
 EXPRESSION (cmd_valid & cmd_q.rd)
             ----1----   ----2---
-1--2-StatusTests
01Not Covered
10CoveredT3,T10,T11
11CoveredT1,T2,T3

 LINE       176
 EXPRESSION (cmd_valid & cmd_q.prog)
             ----1----   -----2----
-1--2-StatusTests
01Not Covered
10CoveredT1,T2,T3
11CoveredT3,T10,T11

 LINE       177
 EXPRESSION (cmd_valid & cmd_q.pg_erase)
             ----1----   -------2------
-1--2-StatusTests
01Not Covered
10CoveredT1,T2,T3
11CoveredT3,T11,T17

 LINE       178
 EXPRESSION (cmd_valid & cmd_q.bk_erase)
             ----1----   -------2------
-1--2-StatusTests
01Not Covered
10CoveredT1,T2,T3
11CoveredT26,T27,T29

 LINE       181
 EXPRESSION (mem_req & ((~mem_wr)))
             ---1---   -----2-----
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT3,T10,T11
11CoveredT1,T2,T3

 LINE       231
 EXPRESSION ((ReadLatency == 1) ? rd_data_d : rd_data_q)
             ---------1--------
-1-StatusTests
0CoveredT78,T37,T79
1CoveredT1,T2,T3

 LINE       231
 SUB-EXPRESSION (ReadLatency == 1)
                ---------1--------
-1-StatusTests
0CoveredT78,T37,T79
1CoveredT1,T2,T3

 LINE       274
 EXPRESSION (init_i && flash_power_ready_h_i && ((!flash_power_down_h_i)))
             ---1--    ----------2----------    ------------3------------
-1--2--3-StatusTests
011Unreachable
101CoveredT30,T65,T67
110CoveredT1,T2,T3
111CoveredT1,T2,T3

 LINE       357
 EXPRESSION ((index_cnt < index_limit_q) || (time_cnt < time_limit_q))
             -------------1-------------    ------------2------------
-1--2-StatusTests
00CoveredT3,T11,T17
01Not Covered
10CoveredT3,T11,T17

 LINE       390
 EXPRESSION (((!flash_power_ready_h_i)) || flash_power_down_h_i)
             -------------1------------    ----------2---------
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT1,T2,T3
10CoveredT30,T65,T67

 LINE       402
 EXPRESSION (mem_req & ((mem_part == FlashPartData) | mem_bk_erase))
             ---1---   ----------------------2---------------------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T3
11CoveredT2,T3,T10

 LINE       402
 SUB-EXPRESSION ((mem_part == FlashPartData) | mem_bk_erase)
                 -------------1-------------   ------2-----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT26,T29,T80
10CoveredT1,T2,T3

 LINE       402
 SUB-EXPRESSION (mem_part == FlashPartData)
                -------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       426
 EXPRESSION (mem_req & (mem_part == FlashPartInfo) & ((mem_info_sel == 0) | mem_bk_erase))
             ---1---   -------------2-------------   ------------------3-----------------
-1--2--3-StatusTests
011CoveredT11,T4,T18
101CoveredT2,T3,T10
110CoveredT18,T13,T48
111CoveredT1,T2,T3

 LINE       426
 SUB-EXPRESSION (mem_part == FlashPartInfo)
                -------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       426
 SUB-EXPRESSION ((mem_info_sel == 0) | mem_bk_erase)
                 ---------1---------   ------2-----
-1--2-StatusTests
00CoveredT18,T13,T48
01Not Covered
10CoveredT1,T2,T3

 LINE       426
 SUB-EXPRESSION (mem_info_sel == 0)
                ---------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       426
 EXPRESSION (mem_req & (mem_part == FlashPartInfo) & ((mem_info_sel == 1) | mem_bk_erase))
             ---1---   -------------2-------------   ------------------3-----------------
-1--2--3-StatusTests
011CoveredT26,T29,T80
101CoveredT13,T27,T48
110CoveredT1,T2,T3
111CoveredT18,T26,T49

 LINE       426
 SUB-EXPRESSION (mem_part == FlashPartInfo)
                -------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       426
 SUB-EXPRESSION ((mem_info_sel == 1) | mem_bk_erase)
                 ---------1---------   ------2-----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT26,T27,T29
10CoveredT18,T13,T48

 LINE       426
 SUB-EXPRESSION (mem_info_sel == 1)
                ---------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT18,T13,T48

 LINE       426
 EXPRESSION (mem_req & (mem_part == FlashPartInfo) & ((mem_info_sel == 2) | mem_bk_erase))
             ---1---   -------------2-------------   ------------------3-----------------
-1--2--3-StatusTests
011CoveredT18,T26,T50
101CoveredT13,T27,T48
110CoveredT1,T2,T3
111CoveredT18,T26,T13

 LINE       426
 SUB-EXPRESSION (mem_part == FlashPartInfo)
                -------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       426
 SUB-EXPRESSION ((mem_info_sel == 2) | mem_bk_erase)
                 ---------1---------   ------2-----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT26,T27,T29
10CoveredT18,T13,T48

 LINE       426
 SUB-EXPRESSION (mem_info_sel == 2)
                ---------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT18,T13,T48

 LINE       447
 EXPRESSION ((rd_part_q == FlashPartData) ? rd_data_main : rd_data_info)
             --------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       447
 SUB-EXPRESSION (rd_part_q == FlashPartData)
                --------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

FSM Coverage for Instance : tb.dut.u_eflash.u_flash.gen_generic.u_impl_generic.gen_prim_flash_banks[0].u_prim_flash_bank
Summary for FSM :: st_q
TotalCoveredPercent
States 7 7 100.00 (Not included in score)
Transitions 16 15 93.75
Sequences 0 0

State, Transition and Sequence Details for FSM :: st_q
statesLine No.CoveredTests
StErSuspend 356 Covered T27,T65,T66
StErase 302 Covered T3,T11,T17
StIdle 286 Covered T1,T2,T3
StInit 275 Covered T1,T2,T3
StProg 334 Covered T3,T10,T11
StRead 296 Covered T1,T2,T3
StReset 391 Covered T1,T2,T3


transitionsLine No.CoveredTests
StErSuspend->StIdle 379 Covered T27,T66,T31
StErSuspend->StReset 391 Covered T65,T85
StErase->StErSuspend 356 Covered T27,T65,T66
StErase->StIdle 364 Covered T3,T11,T17
StErase->StReset 391 Covered T4,T30,T65
StIdle->StErase 302 Covered T3,T11,T17
StIdle->StRead 296 Covered T1,T2,T3
StIdle->StReset 391 Covered T11,T4,T30
StInit->StIdle 286 Covered T1,T2,T3
StInit->StReset 391 Not Covered
StProg->StIdle 346 Covered T3,T10,T11
StProg->StReset 391 Covered T30,T81,T65
StRead->StIdle 327 Covered T1,T2,T3
StRead->StProg 334 Covered T3,T10,T11
StRead->StReset 391 Covered T82,T84,T86
StReset->StInit 275 Covered T1,T2,T3



Branch Coverage for Instance : tb.dut.u_eflash.u_flash.gen_generic.u_impl_generic.gen_prim_flash_banks[0].u_prim_flash_bank
Line No.TotalCoveredPercent
Branches 45 41 91.11
TERNARY 231 2 2 100.00
TERNARY 447 2 2 100.00
IF 189 2 2 100.00
IF 194 2 2 100.00
IF 210 3 3 100.00
IF 221 3 3 100.00
IF 236 8 7 87.50
CASE 271 21 18 85.71
IF 390 2 2 100.00


231 assign rd_data_o = ReadLatency == 1 ? rd_data_d : rd_data_q; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
0 Covered T78,T37,T79


447 assign rd_data_d = rd_part_q == flash_ctrl_pkg::FlashPartData ? rd_data_main : rd_data_info; -1- ==> ==>

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


189 if (!rst_ni) st_q <= StReset; -1- ==> 190 else st_q <= st_d; ==>

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


194 if (!rst_ni) begin -1- 195 time_limit_q <= 'h0; ==> 196 index_limit_q <= 'h0; 197 prog_pend_q <= 'h0; 198 mem_rd_q <= 'h0; 199 end else begin 200 time_limit_q <= time_limit_d; ==>

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


210 if (!rst_ni) begin -1- 211 rd_data_q <= '0; ==> 212 end else if (mem_rd_q) begin -2- 213 rd_data_q <= rd_data_d; ==> 214 end MISSING_ELSE ==>

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


221 if (!rst_ni) begin -1- 222 rd_part_q <= flash_ctrl_pkg::FlashPartData; ==> 223 info_sel_q <= '0; 224 end else if (mem_rd_d) begin -2- 225 rd_part_q <= cmd_q.part; ==> 226 info_sel_q <= cmd_q.info_sel; 227 end MISSING_ELSE ==>

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


236 if (!rst_ni) begin -1- 237 time_cnt <= 'h0; ==> 238 index_cnt <= 'h0; 239 end else begin 240 if (time_cnt_inc) time_cnt <= time_cnt + 1'b1; -2- ==> 241 else if (time_cnt_set1) time_cnt <= 32'h1; -3- ==> 242 else if (time_cnt_clr) time_cnt <= 32'h0; -4- ==> MISSING_ELSE ==> 243 244 if (index_cnt_inc) index_cnt <= index_cnt + 1'b1; -5- ==> 245 else if (index_cnt_clr) index_cnt <= 32'h0; -6- ==> MISSING_ELSE ==>

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


271 unique case (st_q) -1- 272 StReset: begin 273 init_busy_o = 1'b1; 274 if (init_i && flash_power_ready_h_i && !flash_power_down_h_i) begin -2- 275 st_d = StInit; ==> 276 end MISSING_ELSE ==> 277 end 278 279 // Emulate flash initilaization with a wait timer 280 StInit: begin 281 init_busy_o = 1'h1; 282 if (index_cnt < InitCycles) begin -3- 283 st_d = StInit; ==> 284 index_cnt_inc = 1'b1; 285 end else begin 286 st_d = StIdle; ==> 287 index_cnt_clr = 1'b1; 288 end 289 end 290 291 StIdle: begin 292 if (rd_req) begin -4- 293 pop_cmd = 1'b1; ==> 294 mem_req = 1'b1; 295 time_cnt_inc = 1'b1; 296 st_d = StRead; 297 end else if (prog_req) begin -5- 298 mem_req = 1'b1; ==> 299 prog_pend_d = 1'b1; 300 st_d = StRead; 301 end else if (pg_erase_req) begin -6- 302 st_d = StErase; ==> 303 index_limit_d = WordsPerPage; 304 time_limit_d = EraseLatency; 305 end else if (bk_erase_req) begin -7- 306 st_d = StErase; ==> 307 index_limit_d = WordsPerBank; 308 time_limit_d = BkEraseCycles; 309 end MISSING_ELSE ==> 310 end 311 312 StRead: begin 313 if (time_cnt < ReadLatency) begin -8- 314 time_cnt_inc = 1'b1; ==> 315 316 end else if (!prog_pend_q) begin -9- 317 done_o = 1'b1; 318 319 // if another request already pending 320 if (rd_req) begin -10- 321 pop_cmd = 1'b1; ==> 322 mem_req = 1'b1; 323 time_cnt_set1 = 1'b1; 324 st_d = StRead; 325 end else begin 326 time_cnt_clr = 1'b1; ==> 327 st_d = StIdle; 328 end 329 330 end else if (prog_pend_q) begin -11- 331 // this is the read performed before a program operation 332 prog_pend_d = 1'b0; ==> 333 time_cnt_clr = 1'b1; 334 st_d = StProg; 335 end MISSING_ELSE ==> 336 end 337 338 StProg: begin 339 // if data is already 0, cannot program to 1 without erase 340 mem_wdata = cmd_q.prog_data & rd_data_q; 341 if (time_cnt < ProgLatency) begin -12- 342 mem_req = 1'b1; ==> 343 mem_wr = 1'b1; 344 time_cnt_inc = 1'b1; 345 end else begin 346 st_d = StIdle; ==> 347 pop_cmd = 1'b1; 348 done_o = cmd_q.prog_last; 349 time_cnt_clr = 1'b1; 350 end 351 end 352 353 StErase: begin 354 // Actual erasing of the page 355 if (erase_suspend_req_i) begin -13- 356 st_d = StErSuspend; ==> 357 end else if (index_cnt < index_limit_q || time_cnt < time_limit_q) begin -14- 358 mem_req = 1'b1; ==> 359 mem_wr = 1'b1; 360 mem_wdata = {DataWidth{1'b1}}; 361 time_cnt_inc = (time_cnt < time_limit_q); 362 index_cnt_inc = (index_cnt < index_limit_q); 363 end else begin 364 st_d = StIdle; ==> 365 pop_cmd = 1'b1; 366 done_o = 1'b1; 367 time_cnt_clr = 1'b1; 368 index_cnt_clr = 1'b1; 369 end 370 end // case: StErase 371 372 // The done can actually be signaled back in `StErase`, but move it 373 // to a different state to better model the ack_o/done_o timing separation 374 StErSuspend: begin 375 done_o = 1'b1; ==> 376 pop_cmd = 1'b1; 377 time_cnt_clr = 1'b1; 378 index_cnt_clr = 1'b1; 379 st_d = StIdle; 380 end 381 382 383 default: begin 384 st_d = StIdle; ==>

Branches:
-1--2--3--4--5--6--7--8--9--10--11--12--13--14-StatusTests
StReset 1 - - - - - - - - - - - - Covered T1,T2,T3
StReset 0 - - - - - - - - - - - - Covered T1,T2,T3
StInit - 1 - - - - - - - - - - - Covered T1,T2,T3
StInit - 0 - - - - - - - - - - - Covered T1,T2,T3
StIdle - - 1 - - - - - - - - - - Covered T1,T2,T3
StIdle - - 0 1 - - - - - - - - - Covered T3,T10,T11
StIdle - - 0 0 1 - - - - - - - - Covered T3,T11,T17
StIdle - - 0 0 0 1 - - - - - - - Covered T26,T27,T29
StIdle - - 0 0 0 0 - - - - - - - Covered T1,T2,T3
StRead - - - - - - 1 - - - - - - Covered T3,T10,T11
StRead - - - - - - 0 1 1 - - - - Not Covered
StRead - - - - - - 0 1 0 - - - - Covered T1,T2,T3
StRead - - - - - - 0 0 - 1 - - - Covered T3,T10,T11
StRead - - - - - - 0 0 - 0 - - - Not Covered
StProg - - - - - - - - - - 1 - - Covered T3,T10,T11
StProg - - - - - - - - - - 0 - - Covered T3,T10,T11
StErase - - - - - - - - - - - 1 - Covered T27,T65,T66
StErase - - - - - - - - - - - 0 1 Covered T3,T11,T17
StErase - - - - - - - - - - - 0 0 Covered T3,T11,T17
StErSuspend - - - - - - - - - - - - - Covered T27,T65,T66
default - - - - - - - - - - - - - Not Covered


390 if (!flash_power_ready_h_i || flash_power_down_h_i) begin -1- 391 st_d = StReset; ==> 392 end MISSING_ELSE ==>

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

Line Coverage for Instance : tb.dut.u_eflash.u_flash.gen_generic.u_impl_generic.gen_prim_flash_banks[1].u_prim_flash_bank
Line No.TotalCoveredPercent
TOTAL14213796.48
CONT_ASSIGN12711100.00
CONT_ASSIGN15211100.00
CONT_ASSIGN15311100.00
CONT_ASSIGN17511100.00
CONT_ASSIGN17611100.00
CONT_ASSIGN17711100.00
CONT_ASSIGN17811100.00
CONT_ASSIGN18111100.00
CONT_ASSIGN18211100.00
CONT_ASSIGN18311100.00
CONT_ASSIGN18411100.00
CONT_ASSIGN18611100.00
ALWAYS18933100.00
ALWAYS19499100.00
ALWAYS21044100.00
ALWAYS22166100.00
CONT_ASSIGN23111100.00
ALWAYS236131292.31
ALWAYS251868295.35
CONT_ASSIGN40211100.00
CONT_ASSIGN42611100.00
CONT_ASSIGN42611100.00
CONT_ASSIGN42611100.00
CONT_ASSIGN44611100.00
CONT_ASSIGN44711100.00
CONT_ASSIGN45011100.00
CONT_ASSIGN45311100.00

126 127 1/1 assign cmd_d = '{ Tests: T1 T2 T3  128 rd : rd_i, 129 prog: prog_i, 130 prog_last: prog_last_i, 131 prog_type: prog_type_i, 132 pg_erase: pg_erase_i, 133 bk_erase: bk_erase_i, 134 addr: addr_i, 135 part: part_i, 136 info_sel: info_sel_i, 137 prog_data: prog_data_i 138 }; 139 140 // for read transactions, in order to reduce latency, the 141 // command fifo is popped early (before done_o). This is to ensure that when 142 // the current transaction is complete, during the same cycle 143 // a new read can be issued. As a result, the command is popped 144 // immediately after the read is issued, rather than waiting for 145 // the read to be completed. The same restrictions are not necessary 146 // for program / erase, which do not have the same performance 147 // requirements. 148 149 // when the flash is going through init, do not accept any transactions 150 logic wvalid; 151 logic ack; 152 1/1 assign wvalid = (rd_i | prog_i | pg_erase_i | bk_erase_i) & !init_busy_o; Tests: T1 T2 T3  153 1/1 assign ack_o = ack & !init_busy_o; Tests: T1 T2 T3  154 155 prim_fifo_sync #( 156 .Width ($bits(cmd_payload_t)), 157 .Pass (0), 158 .Depth (2) 159 ) u_cmd_fifo ( 160 .clk_i, 161 .rst_ni, 162 .clr_i (1'b0), 163 .wvalid_i(wvalid), 164 .wready_o(ack), 165 .wdata_i (cmd_d), 166 .depth_o (), 167 .full_o (), 168 .rvalid_o(cmd_valid), 169 .rready_i(pop_cmd), 170 .rdata_o (cmd_q), 171 .err_o () 172 ); 173 174 logic rd_req, prog_req, pg_erase_req, bk_erase_req; 175 1/1 assign rd_req = cmd_valid & cmd_q.rd; Tests: T1 T2 T3  176 1/1 assign prog_req = cmd_valid & cmd_q.prog; Tests: T1 T2 T3  177 1/1 assign pg_erase_req = cmd_valid & cmd_q.pg_erase; Tests: T1 T2 T3  178 1/1 assign bk_erase_req = cmd_valid & cmd_q.bk_erase; Tests: T1 T2 T3  179 180 // for read / program operations, the index cnt should be 0 181 1/1 assign mem_rd_d = mem_req & ~mem_wr; Tests: T1 T2 T3  182 1/1 assign mem_addr = cmd_q.addr + index_cnt[AddrW-1:0]; Tests: T1 T2 T3  183 1/1 assign mem_part = cmd_q.part; Tests: T1 T2 T3  184 1/1 assign mem_bk_erase = cmd_q.bk_erase; Tests: T1 T2 T3  185 186 1/1 assign mem_info_sel = cmd_q.info_sel; Tests: T1 T2 T3  187 188 always_ff @(posedge clk_i or negedge rst_ni) begin 189 2/2 if (!rst_ni) st_q <= StReset; Tests: T1 T2 T3  | T1 T2 T3  190 1/1 else st_q <= st_d; Tests: T1 T2 T3  191 end 192 193 always_ff @(posedge clk_i or negedge rst_ni) begin 194 1/1 if (!rst_ni) begin Tests: T1 T2 T3  195 1/1 time_limit_q <= 'h0; Tests: T1 T2 T3  196 1/1 index_limit_q <= 'h0; Tests: T1 T2 T3  197 1/1 prog_pend_q <= 'h0; Tests: T1 T2 T3  198 1/1 mem_rd_q <= 'h0; Tests: T1 T2 T3  199 end else begin 200 1/1 time_limit_q <= time_limit_d; Tests: T1 T2 T3  201 1/1 index_limit_q <= index_limit_d; Tests: T1 T2 T3  202 1/1 prog_pend_q <= prog_pend_d; Tests: T1 T2 T3  203 1/1 mem_rd_q <= mem_rd_d; Tests: T1 T2 T3  204 end 205 end 206 207 // latch read data from emulated memories the cycle after a read 208 logic [DataWidth-1:0] rd_data_q, rd_data_d; 209 always_ff @(posedge clk_i or negedge rst_ni) begin 210 1/1 if (!rst_ni) begin Tests: T1 T2 T3  211 1/1 rd_data_q <= '0; Tests: T1 T2 T3  212 1/1 end else if (mem_rd_q) begin Tests: T1 T2 T3  213 1/1 rd_data_q <= rd_data_d; Tests: T1 T10 T12  214 end MISSING_ELSE 215 end 216 217 // latch partiton being read since the command fifo is popped early 218 flash_ctrl_pkg::flash_part_e rd_part_q; 219 logic [InfoTypesWidth-1:0] info_sel_q; 220 always_ff @(posedge clk_i or negedge rst_ni) begin 221 1/1 if (!rst_ni) begin Tests: T1 T2 T3  222 1/1 rd_part_q <= flash_ctrl_pkg::FlashPartData; Tests: T1 T2 T3  223 1/1 info_sel_q <= '0; Tests: T1 T2 T3  224 1/1 end else if (mem_rd_d) begin Tests: T1 T2 T3  225 1/1 rd_part_q <= cmd_q.part; Tests: T1 T10 T12  226 1/1 info_sel_q <= cmd_q.info_sel; Tests: T1 T10 T12  227 end MISSING_ELSE 228 end 229 230 // if read cycle is only 1, we can expose the unlatched data directly 231 1/1 assign rd_data_o = ReadLatency == 1 ? rd_data_d : rd_data_q; Tests: T1 T2 T3  232 233 // prog_pend_q is necessary to emulate flash behavior that a bit written to 0 cannot be written 234 // back to 1 without an erase 235 always_ff @(posedge clk_i or negedge rst_ni) begin 236 1/1 if (!rst_ni) begin Tests: T1 T2 T3  237 1/1 time_cnt <= 'h0; Tests: T1 T2 T3  238 1/1 index_cnt <= 'h0; Tests: T1 T2 T3  239 end else begin 240 2/2 if (time_cnt_inc) time_cnt <= time_cnt + 1'b1; Tests: T1 T2 T3  | T1 T10 T12  241 1/2 ==> else if (time_cnt_set1) time_cnt <= 32'h1; Tests: T1 T2 T3  242 2/2 else if (time_cnt_clr) time_cnt <= 32'h0; Tests: T1 T2 T3  | T1 T10 T12  MISSING_ELSE 243 244 2/2 if (index_cnt_inc) index_cnt <= index_cnt + 1'b1; Tests: T1 T2 T3  | T1 T2 T3  245 2/2 else if (index_cnt_clr) index_cnt <= 32'h0; Tests: T1 T2 T3  | T1 T2 T3  MISSING_ELSE 246 end 247 end 248 249 always_comb begin 250 // state 251 1/1 st_d = st_q; Tests: T1 T2 T3  252 253 // internally consumed signals 254 1/1 index_limit_d = index_limit_q; Tests: T1 T2 T3  255 1/1 time_limit_d = time_limit_q; Tests: T1 T2 T3  256 1/1 prog_pend_d = prog_pend_q; Tests: T1 T2 T3  257 1/1 mem_req = '0; Tests: T1 T2 T3  258 1/1 mem_wr = '0; Tests: T1 T2 T3  259 1/1 mem_wdata = '0; Tests: T1 T2 T3  260 1/1 time_cnt_inc = '0; Tests: T1 T2 T3  261 1/1 time_cnt_clr = '0; Tests: T1 T2 T3  262 1/1 time_cnt_set1 = '0; Tests: T1 T2 T3  263 1/1 index_cnt_inc = '0; Tests: T1 T2 T3  264 1/1 index_cnt_clr = '0; Tests: T1 T2 T3  265 266 // i/o 267 1/1 init_busy_o = '0; Tests: T1 T2 T3  268 1/1 pop_cmd = '0; Tests: T1 T2 T3  269 1/1 done_o = '0; Tests: T1 T2 T3  270 271 1/1 unique case (st_q) Tests: T1 T2 T3  272 StReset: begin 273 1/1 init_busy_o = 1'b1; Tests: T1 T2 T3  274 1/1 if (init_i && flash_power_ready_h_i && !flash_power_down_h_i) begin Tests: T1 T2 T3  275 1/1 st_d = StInit; Tests: T1 T2 T3  276 end MISSING_ELSE 277 end 278 279 // Emulate flash initilaization with a wait timer 280 StInit: begin 281 1/1 init_busy_o = 1'h1; Tests: T1 T2 T3  282 1/1 if (index_cnt < InitCycles) begin Tests: T1 T2 T3  283 1/1 st_d = StInit; Tests: T1 T2 T3  284 1/1 index_cnt_inc = 1'b1; Tests: T1 T2 T3  285 end else begin 286 1/1 st_d = StIdle; Tests: T1 T2 T3  287 1/1 index_cnt_clr = 1'b1; Tests: T1 T2 T3  288 end 289 end 290 291 StIdle: begin 292 1/1 if (rd_req) begin Tests: T1 T2 T3  293 1/1 pop_cmd = 1'b1; Tests: T10 T12 T18  294 1/1 mem_req = 1'b1; Tests: T10 T12 T18  295 1/1 time_cnt_inc = 1'b1; Tests: T10 T12 T18  296 1/1 st_d = StRead; Tests: T10 T12 T18  297 1/1 end else if (prog_req) begin Tests: T1 T2 T3  298 1/1 mem_req = 1'b1; Tests: T1 T10 T18  299 1/1 prog_pend_d = 1'b1; Tests: T1 T10 T18  300 1/1 st_d = StRead; Tests: T1 T10 T18  301 1/1 end else if (pg_erase_req) begin Tests: T1 T2 T3  302 1/1 st_d = StErase; Tests: T18 T30 T26  303 1/1 index_limit_d = WordsPerPage; Tests: T18 T30 T26  304 1/1 time_limit_d = EraseLatency; Tests: T18 T30 T26  305 1/1 end else if (bk_erase_req) begin Tests: T1 T2 T3  306 1/1 st_d = StErase; Tests: T28 T29 T31  307 1/1 index_limit_d = WordsPerBank; Tests: T28 T29 T31  308 1/1 time_limit_d = BkEraseCycles; Tests: T28 T29 T31  309 end MISSING_ELSE 310 end 311 312 StRead: begin 313 1/1 if (time_cnt < ReadLatency) begin Tests: T1 T10 T12  314 1/1 time_cnt_inc = 1'b1; Tests: T1 T10 T18  315 316 1/1 end else if (!prog_pend_q) begin Tests: T1 T10 T12  317 1/1 done_o = 1'b1; Tests: T10 T12 T18  318 319 // if another request already pending 320 1/1 if (rd_req) begin Tests: T10 T12 T18  321 0/1 ==> pop_cmd = 1'b1; 322 0/1 ==> mem_req = 1'b1; 323 0/1 ==> time_cnt_set1 = 1'b1; 324 0/1 ==> st_d = StRead; 325 end else begin 326 1/1 time_cnt_clr = 1'b1; Tests: T10 T12 T18  327 1/1 st_d = StIdle; Tests: T10 T12 T18  328 end 329 330 1/1 end else if (prog_pend_q) begin Tests: T1 T10 T18  331 // this is the read performed before a program operation 332 1/1 prog_pend_d = 1'b0; Tests: T1 T10 T18  333 1/1 time_cnt_clr = 1'b1; Tests: T1 T10 T18  334 1/1 st_d = StProg; Tests: T1 T10 T18  335 end ==> MISSING_ELSE 336 end 337 338 StProg: begin 339 // if data is already 0, cannot program to 1 without erase 340 1/1 mem_wdata = cmd_q.prog_data & rd_data_q; Tests: T1 T10 T18  341 1/1 if (time_cnt < ProgLatency) begin Tests: T1 T10 T18  342 1/1 mem_req = 1'b1; Tests: T1 T10 T18  343 1/1 mem_wr = 1'b1; Tests: T1 T10 T18  344 1/1 time_cnt_inc = 1'b1; Tests: T1 T10 T18  345 end else begin 346 1/1 st_d = StIdle; Tests: T1 T10 T18  347 1/1 pop_cmd = 1'b1; Tests: T1 T10 T18  348 1/1 done_o = cmd_q.prog_last; Tests: T1 T10 T18  349 1/1 time_cnt_clr = 1'b1; Tests: T1 T10 T18  350 end 351 end 352 353 StErase: begin 354 // Actual erasing of the page 355 1/1 if (erase_suspend_req_i) begin Tests: T18 T30 T26  356 1/1 st_d = StErSuspend; Tests: T30 T27 T67  357 1/1 end else if (index_cnt < index_limit_q || time_cnt < time_limit_q) begin Tests: T18 T30 T26  358 1/1 mem_req = 1'b1; Tests: T18 T30 T26  359 1/1 mem_wr = 1'b1; Tests: T18 T30 T26  360 1/1 mem_wdata = {DataWidth{1'b1}}; Tests: T18 T30 T26  361 1/1 time_cnt_inc = (time_cnt < time_limit_q); Tests: T18 T30 T26  362 1/1 index_cnt_inc = (index_cnt < index_limit_q); Tests: T18 T30 T26  363 end else begin 364 1/1 st_d = StIdle; Tests: T18 T30 T26  365 1/1 pop_cmd = 1'b1; Tests: T18 T30 T26  366 1/1 done_o = 1'b1; Tests: T18 T30 T26  367 1/1 time_cnt_clr = 1'b1; Tests: T18 T30 T26  368 1/1 index_cnt_clr = 1'b1; Tests: T18 T30 T26  369 end 370 end // case: StErase 371 372 // The done can actually be signaled back in `StErase`, but move it 373 // to a different state to better model the ack_o/done_o timing separation 374 StErSuspend: begin 375 1/1 done_o = 1'b1; Tests: T30 T27 T67  376 1/1 pop_cmd = 1'b1; Tests: T30 T27 T67  377 1/1 time_cnt_clr = 1'b1; Tests: T30 T27 T67  378 1/1 index_cnt_clr = 1'b1; Tests: T30 T27 T67  379 1/1 st_d = StIdle; Tests: T30 T27 T67  380 end 381 382 383 default: begin 384 st_d = StIdle; 385 end 386 387 endcase // unique case (st_q) 388 389 // Emulate power down and power loss behavior 390 1/1 if (!flash_power_ready_h_i || flash_power_down_h_i) begin Tests: T1 T2 T3  391 1/1 st_d = StReset; Tests: T1 T2 T3  392 end MISSING_ELSE 393 394 end // always_comb 395 396 logic [DataWidth-1:0] rd_data_main, rd_data_info; 397 logic [InfoTypes-1:0][DataWidth-1:0] rd_nom_data_info; 398 399 // data memory is requested whenver it's a transaction targetted at the data partition 400 // OR if it's a bank erase 401 logic data_mem_req; 402 1/1 assign data_mem_req = mem_req & Tests: T1 T2 T3  403 (mem_part == flash_ctrl_pkg::FlashPartData | 404 mem_bk_erase); 405 406 prim_ram_1p #( 407 .Width(DataWidth), 408 .Depth(WordsPerBank), 409 .DataBitsPerMask(DataWidth) 410 ) u_mem ( 411 .clk_i, 412 .req_i (data_mem_req), 413 .write_i (mem_wr), 414 .addr_i (mem_addr), 415 .wdata_i (mem_wdata), 416 .wmask_i ({DataWidth{1'b1}}), 417 .rdata_o (rd_data_main), 418 .cfg_i ('0) 419 ); 420 421 for (genvar info_type = 0; info_type < InfoTypes; info_type++) begin : gen_info_types 422 423 // when info partitions are selected for bank erase, all info types are erased. 424 // if NOT bank erase, then only the selected info partition is erased 425 logic info_mem_req; 426 3/3 assign info_mem_req = mem_req & Tests: T1 T2 T3  | T1 T2 T3  | T1 T2 T3  427 (mem_part == flash_ctrl_pkg::FlashPartInfo) & 428 ((mem_info_sel == info_type) | mem_bk_erase); 429 430 prim_ram_1p #( 431 .Width(DataWidth), 432 .Depth(WordsPerInfoBank), 433 .DataBitsPerMask(DataWidth) 434 ) u_info_mem ( 435 .clk_i, 436 .req_i (info_mem_req), 437 .write_i (mem_wr), 438 .addr_i (mem_addr[0 +: InfoAddrW]), 439 .wdata_i (mem_wdata), 440 .wmask_i ({DataWidth{1'b1}}), 441 .rdata_o (rd_nom_data_info[info_type]), 442 .cfg_i ('0) 443 ); 444 end 445 446 1/1 assign rd_data_info = rd_nom_data_info[info_sel_q]; Tests: T1 T2 T3  447 1/1 assign rd_data_d = rd_part_q == flash_ctrl_pkg::FlashPartData ? rd_data_main : rd_data_info; Tests: T1 T2 T3  448 449 flash_ctrl_pkg::flash_prog_e unused_prog_type; 450 1/1 assign unused_prog_type = cmd_q.prog_type; Tests: T1 T2 T3  451 452 logic unused_he; 453 1/1 assign unused_he = he_i; Tests: T1 T2 T3 

Cond Coverage for Instance : tb.dut.u_eflash.u_flash.gen_generic.u_impl_generic.gen_prim_flash_banks[1].u_prim_flash_bank
TotalCoveredPercent
Conditions847892.86
Logical847892.86
Non-Logical00
Event00

 LINE       152
 EXPRESSION ((rd_i | prog_i | pg_erase_i | bk_erase_i) & ((!init_busy_o)))
             --------------------1--------------------   --------2-------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT30,T65,T67
11CoveredT1,T10,T12

 LINE       152
 SUB-EXPRESSION (rd_i | prog_i | pg_erase_i | bk_erase_i)
                 --1-   ---2--   -----3----   -----4----
-1--2--3--4-StatusTests
0000CoveredT1,T2,T3
0001CoveredT28,T29,T31
0010CoveredT18,T30,T26
0100CoveredT1,T10,T18
1000CoveredT10,T12,T18

 LINE       153
 EXPRESSION (ack & ((!init_busy_o)))
             -1-   --------2-------
-1--2-StatusTests
01CoveredT1,T10,T18
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       175
 EXPRESSION (cmd_valid & cmd_q.rd)
             ----1----   ----2---
-1--2-StatusTests
01Not Covered
10CoveredT1,T10,T18
11CoveredT10,T12,T18

 LINE       176
 EXPRESSION (cmd_valid & cmd_q.prog)
             ----1----   -----2----
-1--2-StatusTests
01Not Covered
10CoveredT10,T12,T18
11CoveredT1,T10,T18

 LINE       177
 EXPRESSION (cmd_valid & cmd_q.pg_erase)
             ----1----   -------2------
-1--2-StatusTests
01Not Covered
10CoveredT1,T10,T12
11CoveredT18,T30,T26

 LINE       178
 EXPRESSION (cmd_valid & cmd_q.bk_erase)
             ----1----   -------2------
-1--2-StatusTests
01Not Covered
10CoveredT1,T10,T12
11CoveredT28,T29,T31

 LINE       181
 EXPRESSION (mem_req & ((~mem_wr)))
             ---1---   -----2-----
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T10,T18
11CoveredT1,T10,T12

 LINE       231
 EXPRESSION ((ReadLatency == 1) ? rd_data_d : rd_data_q)
             ---------1--------
-1-StatusTests
0CoveredT78,T37,T79
1CoveredT1,T2,T3

 LINE       231
 SUB-EXPRESSION (ReadLatency == 1)
                ---------1--------
-1-StatusTests
0CoveredT78,T37,T79
1CoveredT1,T2,T3

 LINE       274
 EXPRESSION (init_i && flash_power_ready_h_i && ((!flash_power_down_h_i)))
             ---1--    ----------2----------    ------------3------------
-1--2--3-StatusTests
011Unreachable
101CoveredT30,T65,T67
110CoveredT1,T2,T3
111CoveredT1,T2,T3

 LINE       357
 EXPRESSION ((index_cnt < index_limit_q) || (time_cnt < time_limit_q))
             -------------1-------------    ------------2------------
-1--2-StatusTests
00CoveredT18,T30,T26
01Not Covered
10CoveredT18,T30,T26

 LINE       390
 EXPRESSION (((!flash_power_ready_h_i)) || flash_power_down_h_i)
             -------------1------------    ----------2---------
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT1,T2,T3
10CoveredT30,T65,T67

 LINE       402
 EXPRESSION (mem_req & ((mem_part == FlashPartData) | mem_bk_erase))
             ---1---   ----------------------2---------------------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT18,T26,T87
11CoveredT1,T10,T12

 LINE       402
 SUB-EXPRESSION ((mem_part == FlashPartData) | mem_bk_erase)
                 -------------1-------------   ------2-----
-1--2-StatusTests
00CoveredT18,T26,T87
01CoveredT29,T88,T89
10CoveredT1,T2,T3

 LINE       402
 SUB-EXPRESSION (mem_part == FlashPartData)
                -------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       426
 EXPRESSION (mem_req & (mem_part == FlashPartInfo) & ((mem_info_sel == 0) | mem_bk_erase))
             ---1---   -------------2-------------   ------------------3-----------------
-1--2--3-StatusTests
011CoveredT18,T26,T87
101CoveredT1,T10,T12
110CoveredT18,T87,T90
111CoveredT18,T26,T87

 LINE       426
 SUB-EXPRESSION (mem_part == FlashPartInfo)
                -------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT18,T26,T87

 LINE       426
 SUB-EXPRESSION ((mem_info_sel == 0) | mem_bk_erase)
                 ---------1---------   ------2-----
-1--2-StatusTests
00CoveredT18,T13,T48
01Not Covered
10CoveredT1,T2,T3

 LINE       426
 SUB-EXPRESSION (mem_info_sel == 0)
                ---------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       426
 EXPRESSION (mem_req & (mem_part == FlashPartInfo) & ((mem_info_sel == 1) | mem_bk_erase))
             ---1---   -------------2-------------   ------------------3-----------------
-1--2--3-StatusTests
011CoveredT29,T88,T89
101CoveredT13,T48,T50
110CoveredT18,T26,T87
111CoveredT18,T87,T90

 LINE       426
 SUB-EXPRESSION (mem_part == FlashPartInfo)
                -------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT18,T26,T87

 LINE       426
 SUB-EXPRESSION ((mem_info_sel == 1) | mem_bk_erase)
                 ---------1---------   ------2-----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT28,T29,T31
10CoveredT18,T13,T48

 LINE       426
 SUB-EXPRESSION (mem_info_sel == 1)
                ---------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT18,T13,T48

 LINE       426
 EXPRESSION (mem_req & (mem_part == FlashPartInfo) & ((mem_info_sel == 2) | mem_bk_erase))
             ---1---   -------------2-------------   ------------------3-----------------
-1--2--3-StatusTests
011CoveredT18,T87,T90
101CoveredT13,T48,T50
110CoveredT18,T26,T87
111CoveredT18,T87,T90

 LINE       426
 SUB-EXPRESSION (mem_part == FlashPartInfo)
                -------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT18,T26,T87

 LINE       426
 SUB-EXPRESSION ((mem_info_sel == 2) | mem_bk_erase)
                 ---------1---------   ------2-----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT28,T29,T31
10CoveredT18,T13,T48

 LINE       426
 SUB-EXPRESSION (mem_info_sel == 2)
                ---------1---------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT18,T13,T48

 LINE       447
 EXPRESSION ((rd_part_q == FlashPartData) ? rd_data_main : rd_data_info)
             --------------1-------------
-1-StatusTests
0CoveredT18,T26,T87
1CoveredT1,T2,T3

 LINE       447
 SUB-EXPRESSION (rd_part_q == FlashPartData)
                --------------1-------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

FSM Coverage for Instance : tb.dut.u_eflash.u_flash.gen_generic.u_impl_generic.gen_prim_flash_banks[1].u_prim_flash_bank
Summary for FSM :: st_q
TotalCoveredPercent
States 7 7 100.00 (Not included in score)
Transitions 16 15 93.75
Sequences 0 0

State, Transition and Sequence Details for FSM :: st_q
statesLine No.CoveredTests
StErSuspend 356 Covered T30,T27,T67
StErase 302 Covered T18,T30,T26
StIdle 286 Covered T1,T2,T3
StInit 275 Covered T1,T2,T3
StProg 334 Covered T1,T10,T18
StRead 296 Covered T1,T10,T12
StReset 391 Covered T1,T2,T3


transitionsLine No.CoveredTests
StErSuspend->StIdle 379 Covered T27,T66,T31
StErSuspend->StReset 391 Covered T30,T67,T91
StErase->StErSuspend 356 Covered T30,T27,T67
StErase->StIdle 364 Covered T18,T30,T26
StErase->StReset 391 Covered T30,T65,T67
StIdle->StErase 302 Covered T18,T30,T26
StIdle->StRead 296 Covered T1,T10,T12
StIdle->StReset 391 Covered T11,T4,T30
StInit->StIdle 286 Covered T1,T2,T3
StInit->StReset 391 Not Covered
StProg->StIdle 346 Covered T1,T10,T18
StProg->StReset 391 Covered T30,T65,T67
StRead->StIdle 327 Covered T10,T12,T18
StRead->StProg 334 Covered T1,T10,T18
StRead->StReset 391 Covered T83,T92
StReset->StInit 275 Covered T1,T2,T3



Branch Coverage for Instance : tb.dut.u_eflash.u_flash.gen_generic.u_impl_generic.gen_prim_flash_banks[1].u_prim_flash_bank
Line No.TotalCoveredPercent
Branches 45 41 91.11
TERNARY 231 2 2 100.00
TERNARY 447 2 2 100.00
IF 189 2 2 100.00
IF 194 2 2 100.00
IF 210 3 3 100.00
IF 221 3 3 100.00
IF 236 8 7 87.50
CASE 271 21 18 85.71
IF 390 2 2 100.00


231 assign rd_data_o = ReadLatency == 1 ? rd_data_d : rd_data_q; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
0 Covered T78,T37,T79


447 assign rd_data_d = rd_part_q == flash_ctrl_pkg::FlashPartData ? rd_data_main : rd_data_info; -1- ==> ==>

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


189 if (!rst_ni) st_q <= StReset; -1- ==> 190 else st_q <= st_d; ==>

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


194 if (!rst_ni) begin -1- 195 time_limit_q <= 'h0; ==> 196 index_limit_q <= 'h0; 197 prog_pend_q <= 'h0; 198 mem_rd_q <= 'h0; 199 end else begin 200 time_limit_q <= time_limit_d; ==>

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


210 if (!rst_ni) begin -1- 211 rd_data_q <= '0; ==> 212 end else if (mem_rd_q) begin -2- 213 rd_data_q <= rd_data_d; ==> 214 end MISSING_ELSE ==>

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


221 if (!rst_ni) begin -1- 222 rd_part_q <= flash_ctrl_pkg::FlashPartData; ==> 223 info_sel_q <= '0; 224 end else if (mem_rd_d) begin -2- 225 rd_part_q <= cmd_q.part; ==> 226 info_sel_q <= cmd_q.info_sel; 227 end MISSING_ELSE ==>

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


236 if (!rst_ni) begin -1- 237 time_cnt <= 'h0; ==> 238 index_cnt <= 'h0; 239 end else begin 240 if (time_cnt_inc) time_cnt <= time_cnt + 1'b1; -2- ==> 241 else if (time_cnt_set1) time_cnt <= 32'h1; -3- ==> 242 else if (time_cnt_clr) time_cnt <= 32'h0; -4- ==> MISSING_ELSE ==> 243 244 if (index_cnt_inc) index_cnt <= index_cnt + 1'b1; -5- ==> 245 else if (index_cnt_clr) index_cnt <= 32'h0; -6- ==> MISSING_ELSE ==>

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


271 unique case (st_q) -1- 272 StReset: begin 273 init_busy_o = 1'b1; 274 if (init_i && flash_power_ready_h_i && !flash_power_down_h_i) begin -2- 275 st_d = StInit; ==> 276 end MISSING_ELSE ==> 277 end 278 279 // Emulate flash initilaization with a wait timer 280 StInit: begin 281 init_busy_o = 1'h1; 282 if (index_cnt < InitCycles) begin -3- 283 st_d = StInit; ==> 284 index_cnt_inc = 1'b1; 285 end else begin 286 st_d = StIdle; ==> 287 index_cnt_clr = 1'b1; 288 end 289 end 290 291 StIdle: begin 292 if (rd_req) begin -4- 293 pop_cmd = 1'b1; ==> 294 mem_req = 1'b1; 295 time_cnt_inc = 1'b1; 296 st_d = StRead; 297 end else if (prog_req) begin -5- 298 mem_req = 1'b1; ==> 299 prog_pend_d = 1'b1; 300 st_d = StRead; 301 end else if (pg_erase_req) begin -6- 302 st_d = StErase; ==> 303 index_limit_d = WordsPerPage; 304 time_limit_d = EraseLatency; 305 end else if (bk_erase_req) begin -7- 306 st_d = StErase; ==> 307 index_limit_d = WordsPerBank; 308 time_limit_d = BkEraseCycles; 309 end MISSING_ELSE ==> 310 end 311 312 StRead: begin 313 if (time_cnt < ReadLatency) begin -8- 314 time_cnt_inc = 1'b1; ==> 315 316 end else if (!prog_pend_q) begin -9- 317 done_o = 1'b1; 318 319 // if another request already pending 320 if (rd_req) begin -10- 321 pop_cmd = 1'b1; ==> 322 mem_req = 1'b1; 323 time_cnt_set1 = 1'b1; 324 st_d = StRead; 325 end else begin 326 time_cnt_clr = 1'b1; ==> 327 st_d = StIdle; 328 end 329 330 end else if (prog_pend_q) begin -11- 331 // this is the read performed before a program operation 332 prog_pend_d = 1'b0; ==> 333 time_cnt_clr = 1'b1; 334 st_d = StProg; 335 end MISSING_ELSE ==> 336 end 337 338 StProg: begin 339 // if data is already 0, cannot program to 1 without erase 340 mem_wdata = cmd_q.prog_data & rd_data_q; 341 if (time_cnt < ProgLatency) begin -12- 342 mem_req = 1'b1; ==> 343 mem_wr = 1'b1; 344 time_cnt_inc = 1'b1; 345 end else begin 346 st_d = StIdle; ==> 347 pop_cmd = 1'b1; 348 done_o = cmd_q.prog_last; 349 time_cnt_clr = 1'b1; 350 end 351 end 352 353 StErase: begin 354 // Actual erasing of the page 355 if (erase_suspend_req_i) begin -13- 356 st_d = StErSuspend; ==> 357 end else if (index_cnt < index_limit_q || time_cnt < time_limit_q) begin -14- 358 mem_req = 1'b1; ==> 359 mem_wr = 1'b1; 360 mem_wdata = {DataWidth{1'b1}}; 361 time_cnt_inc = (time_cnt < time_limit_q); 362 index_cnt_inc = (index_cnt < index_limit_q); 363 end else begin 364 st_d = StIdle; ==> 365 pop_cmd = 1'b1; 366 done_o = 1'b1; 367 time_cnt_clr = 1'b1; 368 index_cnt_clr = 1'b1; 369 end 370 end // case: StErase 371 372 // The done can actually be signaled back in `StErase`, but move it 373 // to a different state to better model the ack_o/done_o timing separation 374 StErSuspend: begin 375 done_o = 1'b1; ==> 376 pop_cmd = 1'b1; 377 time_cnt_clr = 1'b1; 378 index_cnt_clr = 1'b1; 379 st_d = StIdle; 380 end 381 382 383 default: begin 384 st_d = StIdle; ==>

Branches:
-1--2--3--4--5--6--7--8--9--10--11--12--13--14-StatusTests
StReset 1 - - - - - - - - - - - - Covered T1,T2,T3
StReset 0 - - - - - - - - - - - - Covered T1,T2,T3
StInit - 1 - - - - - - - - - - - Covered T1,T2,T3
StInit - 0 - - - - - - - - - - - Covered T1,T2,T3
StIdle - - 1 - - - - - - - - - - Covered T10,T12,T18
StIdle - - 0 1 - - - - - - - - - Covered T1,T10,T18
StIdle - - 0 0 1 - - - - - - - - Covered T18,T30,T26
StIdle - - 0 0 0 1 - - - - - - - Covered T28,T29,T31
StIdle - - 0 0 0 0 - - - - - - - Covered T1,T2,T3
StRead - - - - - - 1 - - - - - - Covered T1,T10,T18
StRead - - - - - - 0 1 1 - - - - Not Covered
StRead - - - - - - 0 1 0 - - - - Covered T10,T12,T18
StRead - - - - - - 0 0 - 1 - - - Covered T1,T10,T18
StRead - - - - - - 0 0 - 0 - - - Not Covered
StProg - - - - - - - - - - 1 - - Covered T1,T10,T18
StProg - - - - - - - - - - 0 - - Covered T1,T10,T18
StErase - - - - - - - - - - - 1 - Covered T30,T27,T67
StErase - - - - - - - - - - - 0 1 Covered T18,T30,T26
StErase - - - - - - - - - - - 0 0 Covered T18,T30,T26
StErSuspend - - - - - - - - - - - - - Covered T30,T27,T67
default - - - - - - - - - - - - - Not Covered


390 if (!flash_power_ready_h_i || flash_power_down_h_i) begin -1- 391 st_d = StReset; ==> 392 end MISSING_ELSE ==>

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

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