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: T2 T3 T9  299 1/1 prog_pend_d = 1'b1; Tests: T2 T3 T9  300 1/1 st_d = StRead; Tests: T2 T3 T9  301 1/1 end else if (pg_erase_req) begin Tests: T1 T2 T3  302 1/1 st_d = StErase; Tests: T2 T9 T18  303 1/1 index_limit_d = WordsPerPage; Tests: T2 T9 T18  304 1/1 time_limit_d = EraseLatency; Tests: T2 T9 T18  305 1/1 end else if (bk_erase_req) begin Tests: T1 T2 T3  306 1/1 st_d = StErase; Tests: T28 T29 T30  307 1/1 index_limit_d = WordsPerBank; Tests: T28 T29 T30  308 1/1 time_limit_d = BkEraseCycles; Tests: T28 T29 T30  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: T2 T3 T9  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: T2 T3 T9  331 // this is the read performed before a program operation 332 1/1 prog_pend_d = 1'b0; Tests: T2 T3 T9  333 1/1 time_cnt_clr = 1'b1; Tests: T2 T3 T9  334 1/1 st_d = StProg; Tests: T2 T3 T9  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: T2 T3 T9  341 1/1 if (time_cnt < ProgLatency) begin Tests: T2 T3 T9  342 1/1 mem_req = 1'b1; Tests: T2 T3 T9  343 1/1 mem_wr = 1'b1; Tests: T2 T3 T9  344 1/1 time_cnt_inc = 1'b1; Tests: T2 T3 T9  345 end else begin 346 1/1 st_d = StIdle; Tests: T2 T3 T9  347 1/1 pop_cmd = 1'b1; Tests: T2 T3 T9  348 1/1 done_o = cmd_q.prog_last; Tests: T2 T3 T9  349 1/1 time_cnt_clr = 1'b1; Tests: T2 T3 T9  350 end 351 end 352 353 StErase: begin 354 // Actual erasing of the page 355 1/1 if (erase_suspend_req_i) begin Tests: T2 T9 T18  356 1/1 st_d = StErSuspend; Tests: T11 T28 T67  357 1/1 end else if (index_cnt < index_limit_q || time_cnt < time_limit_q) begin Tests: T2 T9 T18  358 1/1 mem_req = 1'b1; Tests: T2 T9 T18  359 1/1 mem_wr = 1'b1; Tests: T2 T9 T18  360 1/1 mem_wdata = {DataWidth{1'b1}}; Tests: T2 T9 T18  361 1/1 time_cnt_inc = (time_cnt < time_limit_q); Tests: T2 T9 T18  362 1/1 index_cnt_inc = (index_cnt < index_limit_q); Tests: T2 T9 T18  363 end else begin 364 1/1 st_d = StIdle; Tests: T2 T9 T18  365 1/1 pop_cmd = 1'b1; Tests: T2 T9 T18  366 1/1 done_o = 1'b1; Tests: T2 T9 T18  367 1/1 time_cnt_clr = 1'b1; Tests: T2 T9 T18  368 1/1 index_cnt_clr = 1'b1; Tests: T2 T9 T18  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: T11 T28 T67  376 1/1 pop_cmd = 1'b1; Tests: T11 T28 T67  377 1/1 time_cnt_clr = 1'b1; Tests: T11 T28 T67  378 1/1 index_cnt_clr = 1'b1; Tests: T11 T28 T67  379 1/1 st_d = StIdle; Tests: T11 T28 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 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
10CoveredT67,T78,T79
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
0001CoveredT28,T29,T30
0010CoveredT2,T9,T18
0100CoveredT2,T3,T9
1000CoveredT1,T2,T3

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

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

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

 LINE       177
 EXPRESSION (cmd_valid & cmd_q.pg_erase)
             ----1----   -------2------
-1--2-StatusTests
01Not Covered
10CoveredT1,T2,T3
11CoveredT2,T9,T18

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

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

 LINE       231
 EXPRESSION ((ReadLatency == 1) ? rd_data_d : rd_data_q)
             ---------1--------
-1-StatusTests
0CoveredT38,T46,T80
1CoveredT1,T2,T3

 LINE       231
 SUB-EXPRESSION (ReadLatency == 1)
                ---------1--------
-1-StatusTests
0CoveredT38,T46,T80
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
101CoveredT11,T67,T81
110CoveredT1,T2,T3
111CoveredT1,T2,T3

 LINE       357
 EXPRESSION ((index_cnt < index_limit_q) || (time_cnt < time_limit_q))
             -------------1-------------    ------------2------------
-1--2-StatusTests
00CoveredT2,T9,T18
01Not Covered
10CoveredT2,T9,T18

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

 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
01CoveredT29,T82,T83
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
011CoveredT9,T4,T10
101CoveredT1,T2,T3
110CoveredT32,T49,T70
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
00CoveredT32,T49,T70
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,T82,T83
101CoveredT28,T50,T61
110CoveredT1,T2,T3
111CoveredT32,T50,T29

 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
01CoveredT28,T29,T30
10CoveredT32,T50,T61

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

 LINE       426
 EXPRESSION (mem_req & (mem_part == FlashPartInfo) & ((mem_info_sel == 2) | mem_bk_erase))
             ---1---   -------------2-------------   ------------------3-----------------
-1--2--3-StatusTests
011CoveredT32,T70,T50
101CoveredT49,T28,T50
110CoveredT1,T2,T3
111CoveredT32,T49,T70

 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
01CoveredT28,T29,T30
10CoveredT32,T49,T70

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

 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 T11,T28,T67
StErase 302 Covered T2,T9,T18
StIdle 286 Covered T1,T2,T3
StInit 275 Covered T1,T2,T3
StProg 334 Covered T2,T3,T9
StRead 296 Covered T1,T2,T3
StReset 391 Covered T1,T2,T3


transitionsLine No.CoveredTests
StErSuspend->StIdle 379 Covered T11,T28,T31
StErSuspend->StReset 391 Covered T67,T78
StErase->StErSuspend 356 Covered T11,T28,T67
StErase->StIdle 364 Covered T2,T9,T18
StErase->StReset 391 Covered T4,T11,T84
StIdle->StErase 302 Covered T2,T9,T18
StIdle->StRead 296 Covered T1,T2,T3
StIdle->StReset 391 Covered T9,T4,T11
StInit->StIdle 286 Covered T1,T2,T3
StInit->StReset 391 Not Covered
StProg->StIdle 346 Covered T2,T3,T9
StProg->StReset 391 Covered T11,T85,T68
StRead->StIdle 327 Covered T1,T2,T3
StRead->StProg 334 Covered T2,T3,T9
StRead->StReset 391 Covered T67,T86,T81
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 T38,T46,T80


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 T2,T3,T9
StIdle - - 0 0 1 - - - - - - - - Covered T2,T9,T18
StIdle - - 0 0 0 1 - - - - - - - Covered T28,T29,T30
StIdle - - 0 0 0 0 - - - - - - - Covered T1,T2,T3
StRead - - - - - - 1 - - - - - - Covered T2,T3,T9
StRead - - - - - - 0 1 1 - - - - Not Covered
StRead - - - - - - 0 1 0 - - - - Covered T1,T2,T3
StRead - - - - - - 0 0 - 1 - - - Covered T2,T3,T9
StRead - - - - - - 0 0 - 0 - - - Not Covered
StProg - - - - - - - - - - 1 - - Covered T2,T3,T9
StProg - - - - - - - - - - 0 - - Covered T2,T3,T9
StErase - - - - - - - - - - - 1 - Covered T11,T28,T67
StErase - - - - - - - - - - - 0 1 Covered T2,T9,T18
StErase - - - - - - - - - - - 0 0 Covered T2,T9,T18
StErSuspend - - - - - - - - - - - - - Covered T11,T28,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

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: T2 T3 T9  299 1/1 prog_pend_d = 1'b1; Tests: T2 T3 T9  300 1/1 st_d = StRead; Tests: T2 T3 T9  301 1/1 end else if (pg_erase_req) begin Tests: T1 T2 T3  302 1/1 st_d = StErase; Tests: T2 T9 T4  303 1/1 index_limit_d = WordsPerPage; Tests: T2 T9 T4  304 1/1 time_limit_d = EraseLatency; Tests: T2 T9 T4  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 T2 T3  314 1/1 time_cnt_inc = 1'b1; Tests: T2 T3 T9  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: T2 T3 T9  331 // this is the read performed before a program operation 332 1/1 prog_pend_d = 1'b0; Tests: T2 T3 T9  333 1/1 time_cnt_clr = 1'b1; Tests: T2 T3 T9  334 1/1 st_d = StProg; Tests: T2 T3 T9  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: T2 T3 T9  341 1/1 if (time_cnt < ProgLatency) begin Tests: T2 T3 T9  342 1/1 mem_req = 1'b1; Tests: T2 T3 T9  343 1/1 mem_wr = 1'b1; Tests: T2 T3 T9  344 1/1 time_cnt_inc = 1'b1; Tests: T2 T3 T9  345 end else begin 346 1/1 st_d = StIdle; Tests: T2 T3 T9  347 1/1 pop_cmd = 1'b1; Tests: T2 T3 T9  348 1/1 done_o = cmd_q.prog_last; Tests: T2 T3 T9  349 1/1 time_cnt_clr = 1'b1; Tests: T2 T3 T9  350 end 351 end 352 353 StErase: begin 354 // Actual erasing of the page 355 1/1 if (erase_suspend_req_i) begin Tests: T2 T9 T4  356 1/1 st_d = StErSuspend; Tests: T28 T67 T31  357 1/1 end else if (index_cnt < index_limit_q || time_cnt < time_limit_q) begin Tests: T2 T9 T4  358 1/1 mem_req = 1'b1; Tests: T2 T9 T4  359 1/1 mem_wr = 1'b1; Tests: T2 T9 T4  360 1/1 mem_wdata = {DataWidth{1'b1}}; Tests: T2 T9 T4  361 1/1 time_cnt_inc = (time_cnt < time_limit_q); Tests: T2 T9 T4  362 1/1 index_cnt_inc = (index_cnt < index_limit_q); Tests: T2 T9 T4  363 end else begin 364 1/1 st_d = StIdle; Tests: T2 T9 T32  365 1/1 pop_cmd = 1'b1; Tests: T2 T9 T32  366 1/1 done_o = 1'b1; Tests: T2 T9 T32  367 1/1 time_cnt_clr = 1'b1; Tests: T2 T9 T32  368 1/1 index_cnt_clr = 1'b1; Tests: T2 T9 T32  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: T28 T67 T31  376 1/1 pop_cmd = 1'b1; Tests: T28 T67 T31  377 1/1 time_cnt_clr = 1'b1; Tests: T28 T67 T31  378 1/1 index_cnt_clr = 1'b1; Tests: T28 T67 T31  379 1/1 st_d = StIdle; Tests: T28 T67 T31  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
10CoveredT78,T79
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
0001CoveredT28,T29,T31
0010CoveredT2,T9,T4
0100CoveredT2,T3,T9
1000CoveredT1,T2,T3

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

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

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

 LINE       177
 EXPRESSION (cmd_valid & cmd_q.pg_erase)
             ----1----   -------2------
-1--2-StatusTests
01Not Covered
10CoveredT1,T2,T3
11CoveredT2,T9,T4

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

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

 LINE       231
 EXPRESSION ((ReadLatency == 1) ? rd_data_d : rd_data_q)
             ---------1--------
-1-StatusTests
0CoveredT38,T46,T80
1CoveredT1,T2,T3

 LINE       231
 SUB-EXPRESSION (ReadLatency == 1)
                ---------1--------
-1-StatusTests
0CoveredT38,T46,T80
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
101CoveredT11,T67,T81
110CoveredT1,T2,T3
111CoveredT1,T2,T3

 LINE       357
 EXPRESSION ((index_cnt < index_limit_q) || (time_cnt < time_limit_q))
             -------------1-------------    ------------2------------
-1--2-StatusTests
00CoveredT2,T9,T32
01Not Covered
10CoveredT2,T9,T32

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

 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
01CoveredT29,T82,T87
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
011CoveredT9,T4,T10
101CoveredT1,T2,T3
110CoveredT32,T49,T70
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
00CoveredT32,T49,T70
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,T82,T87
101CoveredT28,T50,T61
110CoveredT1,T2,T3
111CoveredT32,T50,T29

 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
01CoveredT28,T29,T31
10CoveredT32,T50,T61

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

 LINE       426
 EXPRESSION (mem_req & (mem_part == FlashPartInfo) & ((mem_info_sel == 2) | mem_bk_erase))
             ---1---   -------------2-------------   ------------------3-----------------
-1--2--3-StatusTests
011CoveredT32,T70,T50
101CoveredT49,T28,T50
110CoveredT1,T2,T3
111CoveredT32,T49,T70

 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
01CoveredT28,T29,T31
10CoveredT32,T49,T70

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

 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 T28,T67,T31
StErase 302 Covered T2,T9,T4
StIdle 286 Covered T1,T2,T3
StInit 275 Covered T1,T2,T3
StProg 334 Covered T2,T3,T9
StRead 296 Covered T1,T2,T3
StReset 391 Covered T1,T2,T3


transitionsLine No.CoveredTests
StErSuspend->StIdle 379 Covered T28,T31,T81
StErSuspend->StReset 391 Covered T67
StErase->StErSuspend 356 Covered T28,T67,T31
StErase->StIdle 364 Covered T2,T9,T32
StErase->StReset 391 Covered T4,T11,T84
StIdle->StErase 302 Covered T2,T9,T4
StIdle->StRead 296 Covered T1,T2,T3
StIdle->StReset 391 Covered T9,T4,T11
StInit->StIdle 286 Covered T1,T2,T3
StInit->StReset 391 Not Covered
StProg->StIdle 346 Covered T2,T3,T9
StProg->StReset 391 Covered T11,T85,T68
StRead->StIdle 327 Covered T1,T2,T3
StRead->StProg 334 Covered T2,T3,T9
StRead->StReset 391 Covered T67,T86,T81
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 T38,T46,T80


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 T2,T3,T9
StIdle - - 0 0 1 - - - - - - - - Covered T2,T9,T4
StIdle - - 0 0 0 1 - - - - - - - Covered T28,T29,T31
StIdle - - 0 0 0 0 - - - - - - - Covered T1,T2,T3
StRead - - - - - - 1 - - - - - - Covered T2,T3,T9
StRead - - - - - - 0 1 1 - - - - Not Covered
StRead - - - - - - 0 1 0 - - - - Covered T1,T2,T3
StRead - - - - - - 0 0 - 1 - - - Covered T2,T3,T9
StRead - - - - - - 0 0 - 0 - - - Not Covered
StProg - - - - - - - - - - 1 - - Covered T2,T3,T9
StProg - - - - - - - - - - 0 - - Covered T2,T3,T9
StErase - - - - - - - - - - - 1 - Covered T28,T67,T31
StErase - - - - - - - - - - - 0 1 Covered T2,T9,T4
StErase - - - - - - - - - - - 0 0 Covered T2,T9,T32
StErSuspend - - - - - - - - - - - - - Covered T28,T67,T31
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: T17 T12 T18  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: T17 T12 T18  226 1/1 info_sel_q <= cmd_q.info_sel; Tests: T17 T12 T18  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  | T17 T12 T18  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  | T17 T12 T18  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: T17 T12 T18  294 1/1 mem_req = 1'b1; Tests: T17 T12 T18  295 1/1 time_cnt_inc = 1'b1; Tests: T17 T12 T18  296 1/1 st_d = StRead; Tests: T17 T12 T18  297 1/1 end else if (prog_req) begin Tests: T1 T2 T3  298 1/1 mem_req = 1'b1; Tests: T18 T32 T11  299 1/1 prog_pend_d = 1'b1; Tests: T18 T32 T11  300 1/1 st_d = StRead; Tests: T18 T32 T11  301 1/1 end else if (pg_erase_req) begin Tests: T1 T2 T3  302 1/1 st_d = StErase; Tests: T18 T32 T11  303 1/1 index_limit_d = WordsPerPage; Tests: T18 T32 T11  304 1/1 time_limit_d = EraseLatency; Tests: T18 T32 T11  305 1/1 end else if (bk_erase_req) begin Tests: T1 T2 T3  306 1/1 st_d = StErase; Tests: T28 T29 T30  307 1/1 index_limit_d = WordsPerBank; Tests: T28 T29 T30  308 1/1 time_limit_d = BkEraseCycles; Tests: T28 T29 T30  309 end MISSING_ELSE 310 end 311 312 StRead: begin 313 1/1 if (time_cnt < ReadLatency) begin Tests: T17 T12 T18  314 1/1 time_cnt_inc = 1'b1; Tests: T18 T32 T11  315 316 1/1 end else if (!prog_pend_q) begin Tests: T17 T12 T18  317 1/1 done_o = 1'b1; Tests: T17 T12 T18  318 319 // if another request already pending 320 1/1 if (rd_req) begin Tests: T17 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: T17 T12 T18  327 1/1 st_d = StIdle; Tests: T17 T12 T18  328 end 329 330 1/1 end else if (prog_pend_q) begin Tests: T18 T32 T11  331 // this is the read performed before a program operation 332 1/1 prog_pend_d = 1'b0; Tests: T18 T32 T11  333 1/1 time_cnt_clr = 1'b1; Tests: T18 T32 T11  334 1/1 st_d = StProg; Tests: T18 T32 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: T18 T32 T11  341 1/1 if (time_cnt < ProgLatency) begin Tests: T18 T32 T11  342 1/1 mem_req = 1'b1; Tests: T18 T32 T11  343 1/1 mem_wr = 1'b1; Tests: T18 T32 T11  344 1/1 time_cnt_inc = 1'b1; Tests: T18 T32 T11  345 end else begin 346 1/1 st_d = StIdle; Tests: T18 T32 T11  347 1/1 pop_cmd = 1'b1; Tests: T18 T32 T11  348 1/1 done_o = cmd_q.prog_last; Tests: T18 T32 T11  349 1/1 time_cnt_clr = 1'b1; Tests: T18 T32 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: T18 T32 T11  356 1/1 st_d = StErSuspend; Tests: T11 T28 T31  357 1/1 end else if (index_cnt < index_limit_q || time_cnt < time_limit_q) begin Tests: T18 T32 T11  358 1/1 mem_req = 1'b1; Tests: T18 T32 T11  359 1/1 mem_wr = 1'b1; Tests: T18 T32 T11  360 1/1 mem_wdata = {DataWidth{1'b1}}; Tests: T18 T32 T11  361 1/1 time_cnt_inc = (time_cnt < time_limit_q); Tests: T18 T32 T11  362 1/1 index_cnt_inc = (index_cnt < index_limit_q); Tests: T18 T32 T11  363 end else begin 364 1/1 st_d = StIdle; Tests: T18 T32 T11  365 1/1 pop_cmd = 1'b1; Tests: T18 T32 T11  366 1/1 done_o = 1'b1; Tests: T18 T32 T11  367 1/1 time_cnt_clr = 1'b1; Tests: T18 T32 T11  368 1/1 index_cnt_clr = 1'b1; Tests: T18 T32 T11  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: T11 T28 T31  376 1/1 pop_cmd = 1'b1; Tests: T11 T28 T31  377 1/1 time_cnt_clr = 1'b1; Tests: T11 T28 T31  378 1/1 index_cnt_clr = 1'b1; Tests: T11 T28 T31  379 1/1 st_d = StIdle; Tests: T11 T28 T31  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
10CoveredT67,T78,T79
11CoveredT17,T12,T18

 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,T30
0010CoveredT18,T32,T11
0100CoveredT18,T32,T11
1000CoveredT17,T12,T18

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

 LINE       175
 EXPRESSION (cmd_valid & cmd_q.rd)
             ----1----   ----2---
-1--2-StatusTests
01Not Covered
10CoveredT18,T32,T11
11CoveredT17,T12,T18

 LINE       176
 EXPRESSION (cmd_valid & cmd_q.prog)
             ----1----   -----2----
-1--2-StatusTests
01Not Covered
10CoveredT17,T12,T18
11CoveredT18,T32,T11

 LINE       177
 EXPRESSION (cmd_valid & cmd_q.pg_erase)
             ----1----   -------2------
-1--2-StatusTests
01Not Covered
10CoveredT17,T12,T18
11CoveredT18,T32,T11

 LINE       178
 EXPRESSION (cmd_valid & cmd_q.bk_erase)
             ----1----   -------2------
-1--2-StatusTests
01Not Covered
10CoveredT17,T12,T18
11CoveredT28,T29,T30

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

 LINE       231
 EXPRESSION ((ReadLatency == 1) ? rd_data_d : rd_data_q)
             ---------1--------
-1-StatusTests
0CoveredT38,T46,T80
1CoveredT1,T2,T3

 LINE       231
 SUB-EXPRESSION (ReadLatency == 1)
                ---------1--------
-1-StatusTests
0CoveredT38,T46,T80
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
101CoveredT11,T67,T81
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,T32,T11
01Not Covered
10CoveredT18,T32,T11

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

 LINE       402
 EXPRESSION (mem_req & ((mem_part == FlashPartData) | mem_bk_erase))
             ---1---   ----------------------2---------------------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT32,T29,T34
11CoveredT17,T12,T18

 LINE       402
 SUB-EXPRESSION ((mem_part == FlashPartData) | mem_bk_erase)
                 -------------1-------------   ------2-----
-1--2-StatusTests
00CoveredT32,T29,T34
01CoveredT29,T83,T88
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
011CoveredT32,T29,T37
101CoveredT17,T12,T18
110CoveredT32,T35,T89
111CoveredT32,T29,T34

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

 LINE       426
 SUB-EXPRESSION ((mem_info_sel == 0) | mem_bk_erase)
                 ---------1---------   ------2-----
-1--2-StatusTests
00CoveredT32,T49,T50
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,T83,T88
101CoveredT28,T50,T61
110CoveredT32,T29,T34
111CoveredT32,T29,T89

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

 LINE       426
 SUB-EXPRESSION ((mem_info_sel == 1) | mem_bk_erase)
                 ---------1---------   ------2-----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT28,T29,T30
10CoveredT32,T50,T61

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

 LINE       426
 EXPRESSION (mem_req & (mem_part == FlashPartInfo) & ((mem_info_sel == 2) | mem_bk_erase))
             ---1---   -------------2-------------   ------------------3-----------------
-1--2--3-StatusTests
011CoveredT32,T29,T35
101CoveredT49,T28,T50
110CoveredT32,T29,T34
111CoveredT32,T29,T35

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

 LINE       426
 SUB-EXPRESSION ((mem_info_sel == 2) | mem_bk_erase)
                 ---------1---------   ------2-----
-1--2-StatusTests
00CoveredT1,T2,T3
01CoveredT28,T29,T30
10CoveredT32,T49,T50

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

 LINE       447
 EXPRESSION ((rd_part_q == FlashPartData) ? rd_data_main : rd_data_info)
             --------------1-------------
-1-StatusTests
0CoveredT32,T29,T34
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 T11,T28,T31
StErase 302 Covered T18,T32,T11
StIdle 286 Covered T1,T2,T3
StInit 275 Covered T1,T2,T3
StProg 334 Covered T18,T32,T11
StRead 296 Covered T17,T12,T18
StReset 391 Covered T1,T2,T3


transitionsLine No.CoveredTests
StErSuspend->StIdle 379 Covered T11,T28,T31
StErSuspend->StReset 391 Covered T78
StErase->StErSuspend 356 Covered T11,T28,T31
StErase->StIdle 364 Covered T18,T32,T11
StErase->StReset 391 Covered T11,T67,T81
StIdle->StErase 302 Covered T18,T32,T11
StIdle->StRead 296 Covered T17,T12,T18
StIdle->StReset 391 Covered T9,T4,T11
StInit->StIdle 286 Covered T1,T2,T3
StInit->StReset 391 Not Covered
StProg->StIdle 346 Covered T18,T32,T11
StProg->StReset 391 Covered T11,T67,T81
StRead->StIdle 327 Covered T17,T12,T18
StRead->StProg 334 Covered T18,T32,T11
StRead->StReset 391 Covered T67,T81,T90
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 T38,T46,T80


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 T32,T29,T34


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 T17,T12,T18
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 T17,T12,T18
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 T17,T12,T18
0 0 1 - - - Not Covered
0 0 0 1 - - Covered T17,T12,T18
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 T17,T12,T18
StIdle - - 0 1 - - - - - - - - - Covered T18,T32,T11
StIdle - - 0 0 1 - - - - - - - - Covered T18,T32,T11
StIdle - - 0 0 0 1 - - - - - - - Covered T28,T29,T30
StIdle - - 0 0 0 0 - - - - - - - Covered T1,T2,T3
StRead - - - - - - 1 - - - - - - Covered T18,T32,T11
StRead - - - - - - 0 1 1 - - - - Not Covered
StRead - - - - - - 0 1 0 - - - - Covered T17,T12,T18
StRead - - - - - - 0 0 - 1 - - - Covered T18,T32,T11
StRead - - - - - - 0 0 - 0 - - - Not Covered
StProg - - - - - - - - - - 1 - - Covered T18,T32,T11
StProg - - - - - - - - - - 0 - - Covered T18,T32,T11
StErase - - - - - - - - - - - 1 - Covered T11,T28,T31
StErase - - - - - - - - - - - 0 1 Covered T18,T32,T11
StErase - - - - - - - - - - - 0 0 Covered T18,T32,T11
StErSuspend - - - - - - - - - - - - - Covered T11,T28,T31
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%