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



Module Instance : tb.dut.u_spi_tpm.u_cmdaddr_buffer

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
92.15 100.00 76.92 91.67 100.00


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
92.67 100.00 76.92 93.75 100.00


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
95.79 99.29 91.20 91.67 96.77 100.00 u_spi_tpm


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
sync_rptr 100.00 100.00 100.00
sync_wptr 100.00 100.00 100.00



Module Instance : tb.dut.u_spid_status.u_sw_status_update_sync

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
99.00 100.00 96.00 100.00 100.00


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
99.00 100.00 96.00 100.00 100.00


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
99.31 100.00 100.00 97.22 100.00 u_spid_status


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
sync_rptr 100.00 100.00 100.00
sync_wptr 100.00 100.00 100.00

Line Coverage for Module : prim_fifo_async
Line No.TotalCoveredPercent
TOTAL4646100.00
CONT_ASSIGN5311100.00
CONT_ASSIGN5611100.00
ALWAYS5944100.00
ALWAYS6844100.00
CONT_ASSIGN8611100.00
CONT_ASSIGN8911100.00
ALWAYS9244100.00
ALWAYS10144100.00
ALWAYS11733100.00
CONT_ASSIGN13011100.00
CONT_ASSIGN13111100.00
CONT_ASSIGN13211100.00
CONT_ASSIGN14211100.00
CONT_ASSIGN14311100.00
CONT_ASSIGN14411100.00
CONT_ASSIGN14511100.00
CONT_ASSIGN14611100.00
CONT_ASSIGN15611100.00
CONT_ASSIGN15711100.00
CONT_ASSIGN15811100.00
CONT_ASSIGN15911100.00
CONT_ASSIGN16011100.00
CONT_ASSIGN17111100.00
CONT_ASSIGN17211100.00
ALWAYS18222100.00
CONT_ASSIGN18711100.00
CONT_ASSIGN20711100.00
CONT_ASSIGN27611100.00
CONT_ASSIGN27711100.00
CONT_ASSIGN27911100.00
CONT_ASSIGN28011100.00

52 53 1/1 assign fifo_incr_wptr = wvalid_i & wready_o; Tests: T1 T2 T3  54 55 // decimal version 56 1/1 assign fifo_wptr_d = fifo_wptr_q + PTR_WIDTH'(1'b1); Tests: T1 T2 T3  57 58 always_ff @(posedge clk_wr_i or negedge rst_wr_ni) begin 59 1/1 if (!rst_wr_ni) begin Tests: T1 T2 T3  60 1/1 fifo_wptr_q <= '0; Tests: T1 T2 T3  61 1/1 end else if (fifo_incr_wptr) begin Tests: T1 T2 T3  62 1/1 fifo_wptr_q <= fifo_wptr_d; Tests: T6 T7 T9  63 end MISSING_ELSE 64 end 65 66 // gray-coded version 67 always_ff @(posedge clk_wr_i or negedge rst_wr_ni) begin 68 1/1 if (!rst_wr_ni) begin Tests: T1 T2 T3  69 1/1 fifo_wptr_gray_q <= '0; Tests: T1 T2 T3  70 1/1 end else if (fifo_incr_wptr) begin Tests: T1 T2 T3  71 1/1 fifo_wptr_gray_q <= fifo_wptr_gray_d; Tests: T6 T7 T9  72 end MISSING_ELSE 73 end 74 75 // sync gray-coded pointer to read clk 76 prim_flop_2sync #(.Width(PTR_WIDTH)) sync_wptr ( 77 .clk_i (clk_rd_i), 78 .rst_ni (rst_rd_ni), 79 .d_i (fifo_wptr_gray_q), 80 .q_o (fifo_wptr_gray_sync)); 81 82 ////////////////// 83 // Read Pointer // 84 ////////////////// 85 86 1/1 assign fifo_incr_rptr = rvalid_o & rready_i; Tests: T1 T2 T3  87 88 // decimal version 89 1/1 assign fifo_rptr_d = fifo_rptr_q + PTR_WIDTH'(1'b1); Tests: T1 T2 T3  90 91 always_ff @(posedge clk_rd_i or negedge rst_rd_ni) begin 92 1/1 if (!rst_rd_ni) begin Tests: T1 T2 T3  93 1/1 fifo_rptr_q <= '0; Tests: T1 T2 T3  94 1/1 end else if (fifo_incr_rptr) begin Tests: T1 T2 T3  95 1/1 fifo_rptr_q <= fifo_rptr_d; Tests: T6 T7 T9  96 end MISSING_ELSE 97 end 98 99 // gray-coded version 100 always_ff @(posedge clk_rd_i or negedge rst_rd_ni) begin 101 1/1 if (!rst_rd_ni) begin Tests: T1 T2 T3  102 1/1 fifo_rptr_gray_q <= '0; Tests: T1 T2 T3  103 1/1 end else if (fifo_incr_rptr) begin Tests: T1 T2 T3  104 1/1 fifo_rptr_gray_q <= fifo_rptr_gray_d; Tests: T6 T7 T9  105 end MISSING_ELSE 106 end 107 108 // sync gray-coded pointer to write clk 109 prim_flop_2sync #(.Width(PTR_WIDTH)) sync_rptr ( 110 .clk_i (clk_wr_i), 111 .rst_ni (rst_wr_ni), 112 .d_i (fifo_rptr_gray_q), 113 .q_o (fifo_rptr_gray_sync)); 114 115 // Registered version of synced read pointer 116 always_ff @(posedge clk_wr_i or negedge rst_wr_ni) begin 117 1/1 if (!rst_wr_ni) begin Tests: T1 T2 T3  118 1/1 fifo_rptr_sync_q <= '0; Tests: T1 T2 T3  119 end else begin 120 1/1 fifo_rptr_sync_q <= fifo_rptr_sync_combi; Tests: T1 T2 T3  121 end 122 end 123 124 ////////////////// 125 // Empty / Full // 126 ////////////////// 127 128 logic [PTR_WIDTH-1:0] xor_mask; 129 assign xor_mask = PTR_WIDTH'(1'b1) << (PTR_WIDTH-1); 130 1/1 assign full_wclk = (fifo_wptr_q == (fifo_rptr_sync_q ^ xor_mask)); Tests: T1 T2 T3  131 1/1 assign full_rclk = (fifo_wptr_sync_combi == (fifo_rptr_q ^ xor_mask)); Tests: T1 T2 T3  132 1/1 assign empty_rclk = (fifo_wptr_sync_combi == fifo_rptr_q); Tests: T1 T2 T3  133 134 if (Depth > 1) begin : g_depth_calc 135 136 // Current depth in the write clock side 137 logic wptr_msb; 138 logic rptr_sync_msb; 139 logic [PTRV_W-1:0] wptr_value; 140 logic [PTRV_W-1:0] rptr_sync_value; 141 142 1/1 assign wptr_msb = fifo_wptr_q[PTR_WIDTH-1]; Tests: T1 T2 T3  143 1/1 assign rptr_sync_msb = fifo_rptr_sync_q[PTR_WIDTH-1]; Tests: T1 T2 T3  144 1/1 assign wptr_value = fifo_wptr_q[0+:PTRV_W]; Tests: T1 T2 T3  145 1/1 assign rptr_sync_value = fifo_rptr_sync_q[0+:PTRV_W]; Tests: T1 T2 T3  146 1/1 assign wdepth_o = (full_wclk) ? DepthW'(Depth) : Tests: T1 T2 T3  147 (wptr_msb == rptr_sync_msb) ? DepthW'(wptr_value) - DepthW'(rptr_sync_value) : 148 (DepthW'(Depth) - DepthW'(rptr_sync_value) + DepthW'(wptr_value)) ; 149 150 // Current depth in the read clock side 151 logic rptr_msb; 152 logic wptr_sync_msb; 153 logic [PTRV_W-1:0] rptr_value; 154 logic [PTRV_W-1:0] wptr_sync_value; 155 156 1/1 assign wptr_sync_msb = fifo_wptr_sync_combi[PTR_WIDTH-1]; Tests: T1 T2 T3  157 1/1 assign rptr_msb = fifo_rptr_q[PTR_WIDTH-1]; Tests: T1 T2 T3  158 1/1 assign wptr_sync_value = fifo_wptr_sync_combi[0+:PTRV_W]; Tests: T1 T2 T3  159 1/1 assign rptr_value = fifo_rptr_q[0+:PTRV_W]; Tests: T1 T2 T3  160 1/1 assign rdepth_o = (full_rclk) ? DepthW'(Depth) : Tests: T1 T2 T3  161 (wptr_sync_msb == rptr_msb) ? DepthW'(wptr_sync_value) - DepthW'(rptr_value) : 162 (DepthW'(Depth) - DepthW'(rptr_value) + DepthW'(wptr_sync_value)) ; 163 164 end else begin : g_no_depth_calc 165 166 assign rdepth_o = full_rclk; 167 assign wdepth_o = full_wclk; 168 169 end 170 171 1/1 assign wready_o = ~full_wclk; Tests: T1 T2 T3  172 1/1 assign rvalid_o = ~empty_rclk; Tests: T1 T2 T3  173 174 ///////////// 175 // Storage // 176 ///////////// 177 178 logic [Width-1:0] rdata_int; 179 if (Depth > 1) begin : g_storage_mux 180 181 always_ff @(posedge clk_wr_i) begin 182 1/1 if (fifo_incr_wptr) begin Tests: T1 T2 T3  183 1/1 storage[fifo_wptr_q[PTRV_W-1:0]] <= wdata_i; Tests: T6 T7 T9  184 end MISSING_ELSE 185 end 186 187 1/1 assign rdata_int = storage[fifo_rptr_q[PTRV_W-1:0]]; Tests: T1 T2 T3  188 189 end else begin : g_storage_simple 190 191 always_ff @(posedge clk_wr_i) begin 192 if (fifo_incr_wptr) begin 193 storage[0] <= wdata_i; 194 end 195 end 196 197 assign rdata_int = storage[0]; 198 199 end 200 201 // rdata_o is qualified with rvalid_o to avoid CDC error 202 if (OutputZeroIfEmpty == 1'b1) begin : gen_output_zero 203 if (OutputZeroIfInvalid == 1'b1) begin : gen_invalid_zero 204 assign rdata_o = empty_rclk ? '0 : (rvalid_o ? rdata_int : '0); 205 end 206 else begin : gen_invalid_non_zero 207 1/1 assign rdata_o = empty_rclk ? '0 : rdata_int; Tests: T1 T2 T3  208 end 209 end else begin : gen_no_output_zero 210 if (OutputZeroIfInvalid == 1'b1) begin : gen_invalid_zero 211 assign rdata_o = rvalid_o ? rdata_int : '0; 212 end 213 else begin : gen_invalid_non_zero 214 assign rdata_o = rdata_int; 215 end 216 end 217 218 ////////////////////////////////////// 219 // Decimal <-> Gray-code Conversion // 220 ////////////////////////////////////// 221 222 // This code is all in a generate context to avoid lint errors when Depth <= 2 223 if (Depth > 2) begin : g_full_gray_conversion 224 225 function automatic [PTR_WIDTH-1:0] dec2gray(input logic [PTR_WIDTH-1:0] decval); 226 logic [PTR_WIDTH-1:0] decval_sub; 227 logic [PTR_WIDTH-1:0] decval_in; 228 logic unused_decval_msb; 229 230 decval_sub = (PTR_WIDTH)'(Depth) - {1'b0, decval[PTR_WIDTH-2:0]} - 1'b1; 231 232 decval_in = decval[PTR_WIDTH-1] ? decval_sub : decval; 233 234 // We do not care about the MSB, hence we mask it out 235 unused_decval_msb = decval_in[PTR_WIDTH-1]; 236 decval_in[PTR_WIDTH-1] = 1'b0; 237 238 // Perform the XOR conversion 239 dec2gray = decval_in; 240 dec2gray ^= (decval_in >> 1); 241 242 // Override the MSB 243 dec2gray[PTR_WIDTH-1] = decval[PTR_WIDTH-1]; 244 endfunction 245 246 // Algorithm walks up from 0..N-1 then flips the upper bit and walks down from N-1 to 0. 247 function automatic [PTR_WIDTH-1:0] gray2dec(input logic [PTR_WIDTH-1:0] grayval); 248 logic [PTR_WIDTH-1:0] dec_tmp, dec_tmp_sub; 249 logic unused_decsub_msb; 250 251 dec_tmp = '0; 252 for (int i = PTR_WIDTH-2; i >= 0; i--) begin 253 dec_tmp[i] = dec_tmp[i+1] ^ grayval[i]; 254 end 255 dec_tmp_sub = (PTR_WIDTH)'(Depth) - dec_tmp - 1'b1; 256 if (grayval[PTR_WIDTH-1]) begin 257 gray2dec = dec_tmp_sub; 258 // Override MSB 259 gray2dec[PTR_WIDTH-1] = 1'b1; 260 unused_decsub_msb = dec_tmp_sub[PTR_WIDTH-1]; 261 end else begin 262 gray2dec = dec_tmp; 263 end 264 endfunction 265 266 // decimal version of read pointer in write domain 267 assign fifo_rptr_sync_combi = gray2dec(fifo_rptr_gray_sync); 268 // decimal version of write pointer in read domain 269 assign fifo_wptr_sync_combi = gray2dec(fifo_wptr_gray_sync); 270 271 assign fifo_rptr_gray_d = dec2gray(fifo_rptr_d); 272 assign fifo_wptr_gray_d = dec2gray(fifo_wptr_d); 273 274 end else if (Depth == 2) begin : g_simple_gray_conversion 275 276 1/1 assign fifo_rptr_sync_combi = {fifo_rptr_gray_sync[PTR_WIDTH-1], ^fifo_rptr_gray_sync}; Tests: T1 T2 T3  277 1/1 assign fifo_wptr_sync_combi = {fifo_wptr_gray_sync[PTR_WIDTH-1], ^fifo_wptr_gray_sync}; Tests: T1 T2 T3  278 279 1/1 assign fifo_rptr_gray_d = {fifo_rptr_d[PTR_WIDTH-1], ^fifo_rptr_d}; Tests: T1 T2 T3  280 1/1 assign fifo_wptr_gray_d = {fifo_wptr_d[PTR_WIDTH-1], ^fifo_wptr_d}; Tests: T1 T2 T3 

Cond Coverage for Module : prim_fifo_async ( parameter Width=24,Depth=2,OutputZeroIfEmpty=1,OutputZeroIfInvalid=0,DepthW=2,PTRV_W=1,PTR_WIDTH=2 )
Cond Coverage for Module self-instances :
SCORECOND
99.00 96.00
tb.dut.u_spid_status.u_sw_status_update_sync

TotalCoveredPercent
Conditions252496.00
Logical252496.00
Non-Logical00
Event00

 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10Not Covered
11CoveredT9,T11,T12

 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10Unreachable
11CoveredT9,T11,T12

 LINE       130
 EXPRESSION (fifo_wptr_q == (fifo_rptr_sync_q ^ xor_mask))
            -----------------------1----------------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT22,T112,T113

 LINE       131
 EXPRESSION (fifo_wptr_sync_combi == (fifo_rptr_q ^ xor_mask))
            -------------------------1------------------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT22,T114,T115

 LINE       132
 EXPRESSION (fifo_wptr_sync_combi == fifo_rptr_q)
            ------------------1------------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       146
 EXPRESSION 
 Number  Term
      1  full_wclk ? (2'(Depth)) : ((g_depth_calc.wptr_msb == g_depth_calc.rptr_sync_msb) ? ((2'(g_depth_calc.wptr_value) - 2'(g_depth_calc.rptr_sync_value))) : (((2'(Depth) - 2'(g_depth_calc.rptr_sync_value)) + 2'(g_depth_calc.wptr_value)))))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT22,T112,T113

 LINE       146
 SUB-EXPRESSION 
 Number  Term
      1  (g_depth_calc.wptr_msb == g_depth_calc.rptr_sync_msb) ? ((2'(g_depth_calc.wptr_value) - 2'(g_depth_calc.rptr_sync_value))) : (((2'(Depth) - 2'(g_depth_calc.rptr_sync_value)) + 2'(g_depth_calc.wptr_value))))
-1-StatusTests
0CoveredT9,T11,T12
1CoveredT1,T2,T3

 LINE       146
 SUB-EXPRESSION (g_depth_calc.wptr_msb == g_depth_calc.rptr_sync_msb)
                --------------------------1--------------------------
-1-StatusTests
0CoveredT9,T11,T12
1CoveredT1,T2,T3

 LINE       160
 EXPRESSION 
 Number  Term
      1  full_rclk ? (2'(Depth)) : ((g_depth_calc.wptr_sync_msb == g_depth_calc.rptr_msb) ? ((2'(g_depth_calc.wptr_sync_value) - 2'(g_depth_calc.rptr_value))) : (((2'(Depth) - 2'(g_depth_calc.rptr_value)) + 2'(g_depth_calc.wptr_sync_value)))))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT22,T114,T115

 LINE       160
 SUB-EXPRESSION 
 Number  Term
      1  (g_depth_calc.wptr_sync_msb == g_depth_calc.rptr_msb) ? ((2'(g_depth_calc.wptr_sync_value) - 2'(g_depth_calc.rptr_value))) : (((2'(Depth) - 2'(g_depth_calc.rptr_value)) + 2'(g_depth_calc.wptr_sync_value))))
-1-StatusTests
0CoveredT9,T11,T12
1CoveredT1,T2,T3

 LINE       160
 SUB-EXPRESSION (g_depth_calc.wptr_sync_msb == g_depth_calc.rptr_msb)
                --------------------------1--------------------------
-1-StatusTests
0CoveredT9,T11,T12
1CoveredT1,T2,T3

 LINE       207
 EXPRESSION (empty_rclk ? '0 : rdata_int)
             -----1----
-1-StatusTests
0CoveredT9,T11,T12
1CoveredT1,T2,T3

Cond Coverage for Module : prim_fifo_async ( parameter Width=32,Depth=2,OutputZeroIfEmpty=1,OutputZeroIfInvalid=0,DepthW=2,PTRV_W=1,PTR_WIDTH=2 )
Cond Coverage for Module self-instances :
SCORECOND
92.15 76.92
tb.dut.u_spi_tpm.u_cmdaddr_buffer

TotalCoveredPercent
Conditions262076.92
Logical262076.92
Non-Logical00
Event00

 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10Not Covered
11CoveredT6,T7,T25

 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
-1--2-StatusTests
01Not Covered
10CoveredT6,T7,T25
11CoveredT6,T7,T25

 LINE       130
 EXPRESSION (fifo_wptr_q == (fifo_rptr_sync_q ^ xor_mask))
            -----------------------1----------------------
-1-StatusTests
0CoveredT1,T2,T3
1Not Covered

 LINE       131
 EXPRESSION (fifo_wptr_sync_combi == (fifo_rptr_q ^ xor_mask))
            -------------------------1------------------------
-1-StatusTests
0CoveredT1,T2,T3
1Not Covered

 LINE       132
 EXPRESSION (fifo_wptr_sync_combi == fifo_rptr_q)
            ------------------1------------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       146
 EXPRESSION 
 Number  Term
      1  full_wclk ? (2'(Depth)) : ((g_depth_calc.wptr_msb == g_depth_calc.rptr_sync_msb) ? ((2'(g_depth_calc.wptr_value) - 2'(g_depth_calc.rptr_sync_value))) : (((2'(Depth) - 2'(g_depth_calc.rptr_sync_value)) + 2'(g_depth_calc.wptr_value)))))
-1-StatusTests
0CoveredT1,T2,T3
1Not Covered

 LINE       146
 SUB-EXPRESSION 
 Number  Term
      1  (g_depth_calc.wptr_msb == g_depth_calc.rptr_sync_msb) ? ((2'(g_depth_calc.wptr_value) - 2'(g_depth_calc.rptr_sync_value))) : (((2'(Depth) - 2'(g_depth_calc.rptr_sync_value)) + 2'(g_depth_calc.wptr_value))))
-1-StatusTests
0CoveredT6,T7,T25
1CoveredT1,T2,T3

 LINE       146
 SUB-EXPRESSION (g_depth_calc.wptr_msb == g_depth_calc.rptr_sync_msb)
                --------------------------1--------------------------
-1-StatusTests
0CoveredT6,T7,T25
1CoveredT1,T2,T3

 LINE       160
 EXPRESSION 
 Number  Term
      1  full_rclk ? (2'(Depth)) : ((g_depth_calc.wptr_sync_msb == g_depth_calc.rptr_msb) ? ((2'(g_depth_calc.wptr_sync_value) - 2'(g_depth_calc.rptr_value))) : (((2'(Depth) - 2'(g_depth_calc.rptr_value)) + 2'(g_depth_calc.wptr_sync_value)))))
-1-StatusTests
0CoveredT1,T2,T3
1Not Covered

 LINE       160
 SUB-EXPRESSION 
 Number  Term
      1  (g_depth_calc.wptr_sync_msb == g_depth_calc.rptr_msb) ? ((2'(g_depth_calc.wptr_sync_value) - 2'(g_depth_calc.rptr_value))) : (((2'(Depth) - 2'(g_depth_calc.rptr_value)) + 2'(g_depth_calc.wptr_sync_value))))
-1-StatusTests
0CoveredT6,T7,T25
1CoveredT1,T2,T3

 LINE       160
 SUB-EXPRESSION (g_depth_calc.wptr_sync_msb == g_depth_calc.rptr_msb)
                --------------------------1--------------------------
-1-StatusTests
0CoveredT6,T7,T25
1CoveredT1,T2,T3

 LINE       207
 EXPRESSION (empty_rclk ? '0 : rdata_int)
             -----1----
-1-StatusTests
0CoveredT6,T7,T25
1CoveredT1,T2,T3

Branch Coverage for Module : prim_fifo_async
Line No.TotalCoveredPercent
Branches 24 24 100.00
TERNARY 146 3 3 100.00
TERNARY 160 3 3 100.00
TERNARY 207 2 2 100.00
IF 59 3 3 100.00
IF 68 3 3 100.00
IF 92 3 3 100.00
IF 101 3 3 100.00
IF 117 2 2 100.00
IF 182 2 2 100.00


146 assign wdepth_o = (full_wclk) ? DepthW'(Depth) : -1- ==> 147 (wptr_msb == rptr_sync_msb) ? DepthW'(wptr_value) - DepthW'(rptr_sync_value) : -2- ==> ==>

Branches:
-1--2-StatusTests
1 - Covered T22,T112,T113
0 1 Covered T1,T2,T3
0 0 Covered T6,T7,T9


160 assign rdepth_o = (full_rclk) ? DepthW'(Depth) : -1- ==> 161 (wptr_sync_msb == rptr_msb) ? DepthW'(wptr_sync_value) - DepthW'(rptr_value) : -2- ==> ==>

Branches:
-1--2-StatusTests
1 - Covered T22,T114,T115
0 1 Covered T1,T2,T3
0 0 Covered T6,T7,T9


207 assign rdata_o = empty_rclk ? '0 : rdata_int; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
0 Covered T6,T7,T9


59 if (!rst_wr_ni) begin -1- 60 fifo_wptr_q <= '0; ==> 61 end else if (fifo_incr_wptr) begin -2- 62 fifo_wptr_q <= fifo_wptr_d; ==> 63 end MISSING_ELSE ==>

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


68 if (!rst_wr_ni) begin -1- 69 fifo_wptr_gray_q <= '0; ==> 70 end else if (fifo_incr_wptr) begin -2- 71 fifo_wptr_gray_q <= fifo_wptr_gray_d; ==> 72 end MISSING_ELSE ==>

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


92 if (!rst_rd_ni) begin -1- 93 fifo_rptr_q <= '0; ==> 94 end else if (fifo_incr_rptr) begin -2- 95 fifo_rptr_q <= fifo_rptr_d; ==> 96 end MISSING_ELSE ==>

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


101 if (!rst_rd_ni) begin -1- 102 fifo_rptr_gray_q <= '0; ==> 103 end else if (fifo_incr_rptr) begin -2- 104 fifo_rptr_gray_q <= fifo_rptr_gray_d; ==> 105 end MISSING_ELSE ==>

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


117 if (!rst_wr_ni) begin -1- 118 fifo_rptr_sync_q <= '0; ==> 119 end else begin 120 fifo_rptr_sync_q <= fifo_rptr_sync_combi; ==>

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


182 if (fifo_incr_wptr) begin -1- 183 storage[fifo_wptr_q[PTRV_W-1:0]] <= wdata_i; ==> 184 end MISSING_ELSE ==>

Branches:
-1-StatusTests
1 Covered T6,T7,T9
0 Covered T1,T2,T3


Assert Coverage for Module : prim_fifo_async
TotalAttemptedPercentSucceeded/MatchedPercent
Assertions 3 3 100.00 3 100.00
Cover properties 0 0 0
Cover sequences 0 0 0
Total 3 3 100.00 3 100.00




Assertion Details

NameAttemptsReal SuccessesFailuresIncomplete
GrayRptr_A 621537142 621446014 0 0
GrayWptr_A 621537142 621446014 0 0
ParamCheckDepth_A 1952 1952 0 0


GrayRptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 621537142 621446014 0 0
T1 1357 1274 0 0
T2 2099 2016 0 0
T3 1462 1365 0 0
T4 3035 2971 0 0
T5 40333 40249 0 0
T6 13957 13859 0 0
T7 155001 154944 0 0
T8 80496 80400 0 0
T9 31751 31685 0 0
T10 429833 429745 0 0
T11 57370 57369 0 0
T12 25375 25374 0 0
T15 288 287 0 0

GrayWptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 621537142 621446014 0 0
T1 1357 1274 0 0
T2 2099 2016 0 0
T3 1462 1365 0 0
T4 3035 2971 0 0
T5 40333 40249 0 0
T6 13957 13859 0 0
T7 155001 154944 0 0
T8 80496 80400 0 0
T9 31751 31685 0 0
T10 429833 429745 0 0
T11 57370 57369 0 0
T12 25375 25374 0 0
T15 288 287 0 0

ParamCheckDepth_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 1952 1952 0 0
T1 2 2 0 0
T2 2 2 0 0
T3 2 2 0 0
T4 2 2 0 0
T5 2 2 0 0
T6 2 2 0 0
T7 2 2 0 0
T8 2 2 0 0
T9 2 2 0 0
T10 2 2 0 0

Line Coverage for Instance : tb.dut.u_spi_tpm.u_cmdaddr_buffer
Line No.TotalCoveredPercent
TOTAL4646100.00
CONT_ASSIGN5311100.00
CONT_ASSIGN5611100.00
ALWAYS5944100.00
ALWAYS6844100.00
CONT_ASSIGN8611100.00
CONT_ASSIGN8911100.00
ALWAYS9244100.00
ALWAYS10144100.00
ALWAYS11733100.00
CONT_ASSIGN13011100.00
CONT_ASSIGN13111100.00
CONT_ASSIGN13211100.00
CONT_ASSIGN14211100.00
CONT_ASSIGN14311100.00
CONT_ASSIGN14411100.00
CONT_ASSIGN14511100.00
CONT_ASSIGN14611100.00
CONT_ASSIGN15611100.00
CONT_ASSIGN15711100.00
CONT_ASSIGN15811100.00
CONT_ASSIGN15911100.00
CONT_ASSIGN16011100.00
CONT_ASSIGN17111100.00
CONT_ASSIGN17211100.00
ALWAYS18222100.00
CONT_ASSIGN18711100.00
CONT_ASSIGN20711100.00
CONT_ASSIGN27611100.00
CONT_ASSIGN27711100.00
CONT_ASSIGN27911100.00
CONT_ASSIGN28011100.00

52 53 1/1 assign fifo_incr_wptr = wvalid_i & wready_o; Tests: T1 T2 T3  54 55 // decimal version 56 1/1 assign fifo_wptr_d = fifo_wptr_q + PTR_WIDTH'(1'b1); Tests: T1 T2 T3  57 58 always_ff @(posedge clk_wr_i or negedge rst_wr_ni) begin 59 1/1 if (!rst_wr_ni) begin Tests: T1 T2 T3  60 1/1 fifo_wptr_q <= '0; Tests: T1 T2 T3  61 1/1 end else if (fifo_incr_wptr) begin Tests: T4 T5 T6  62 1/1 fifo_wptr_q <= fifo_wptr_d; Tests: T6 T7 T25  63 end MISSING_ELSE 64 end 65 66 // gray-coded version 67 always_ff @(posedge clk_wr_i or negedge rst_wr_ni) begin 68 1/1 if (!rst_wr_ni) begin Tests: T1 T2 T3  69 1/1 fifo_wptr_gray_q <= '0; Tests: T1 T2 T3  70 1/1 end else if (fifo_incr_wptr) begin Tests: T4 T5 T6  71 1/1 fifo_wptr_gray_q <= fifo_wptr_gray_d; Tests: T6 T7 T25  72 end MISSING_ELSE 73 end 74 75 // sync gray-coded pointer to read clk 76 prim_flop_2sync #(.Width(PTR_WIDTH)) sync_wptr ( 77 .clk_i (clk_rd_i), 78 .rst_ni (rst_rd_ni), 79 .d_i (fifo_wptr_gray_q), 80 .q_o (fifo_wptr_gray_sync)); 81 82 ////////////////// 83 // Read Pointer // 84 ////////////////// 85 86 1/1 assign fifo_incr_rptr = rvalid_o & rready_i; Tests: T1 T2 T3  87 88 // decimal version 89 1/1 assign fifo_rptr_d = fifo_rptr_q + PTR_WIDTH'(1'b1); Tests: T1 T2 T3  90 91 always_ff @(posedge clk_rd_i or negedge rst_rd_ni) begin 92 1/1 if (!rst_rd_ni) begin Tests: T1 T2 T3  93 1/1 fifo_rptr_q <= '0; Tests: T1 T2 T3  94 1/1 end else if (fifo_incr_rptr) begin Tests: T1 T2 T3  95 1/1 fifo_rptr_q <= fifo_rptr_d; Tests: T6 T7 T25  96 end MISSING_ELSE 97 end 98 99 // gray-coded version 100 always_ff @(posedge clk_rd_i or negedge rst_rd_ni) begin 101 1/1 if (!rst_rd_ni) begin Tests: T1 T2 T3  102 1/1 fifo_rptr_gray_q <= '0; Tests: T1 T2 T3  103 1/1 end else if (fifo_incr_rptr) begin Tests: T1 T2 T3  104 1/1 fifo_rptr_gray_q <= fifo_rptr_gray_d; Tests: T6 T7 T25  105 end MISSING_ELSE 106 end 107 108 // sync gray-coded pointer to write clk 109 prim_flop_2sync #(.Width(PTR_WIDTH)) sync_rptr ( 110 .clk_i (clk_wr_i), 111 .rst_ni (rst_wr_ni), 112 .d_i (fifo_rptr_gray_q), 113 .q_o (fifo_rptr_gray_sync)); 114 115 // Registered version of synced read pointer 116 always_ff @(posedge clk_wr_i or negedge rst_wr_ni) begin 117 1/1 if (!rst_wr_ni) begin Tests: T1 T2 T3  118 1/1 fifo_rptr_sync_q <= '0; Tests: T1 T2 T3  119 end else begin 120 1/1 fifo_rptr_sync_q <= fifo_rptr_sync_combi; Tests: T4 T5 T6  121 end 122 end 123 124 ////////////////// 125 // Empty / Full // 126 ////////////////// 127 128 logic [PTR_WIDTH-1:0] xor_mask; 129 assign xor_mask = PTR_WIDTH'(1'b1) << (PTR_WIDTH-1); 130 1/1 assign full_wclk = (fifo_wptr_q == (fifo_rptr_sync_q ^ xor_mask)); Tests: T1 T2 T3  131 1/1 assign full_rclk = (fifo_wptr_sync_combi == (fifo_rptr_q ^ xor_mask)); Tests: T1 T2 T3  132 1/1 assign empty_rclk = (fifo_wptr_sync_combi == fifo_rptr_q); Tests: T1 T2 T3  133 134 if (Depth > 1) begin : g_depth_calc 135 136 // Current depth in the write clock side 137 logic wptr_msb; 138 logic rptr_sync_msb; 139 logic [PTRV_W-1:0] wptr_value; 140 logic [PTRV_W-1:0] rptr_sync_value; 141 142 1/1 assign wptr_msb = fifo_wptr_q[PTR_WIDTH-1]; Tests: T1 T2 T3  143 1/1 assign rptr_sync_msb = fifo_rptr_sync_q[PTR_WIDTH-1]; Tests: T1 T2 T3  144 1/1 assign wptr_value = fifo_wptr_q[0+:PTRV_W]; Tests: T1 T2 T3  145 1/1 assign rptr_sync_value = fifo_rptr_sync_q[0+:PTRV_W]; Tests: T1 T2 T3  146 1/1 assign wdepth_o = (full_wclk) ? DepthW'(Depth) : Tests: T1 T2 T3  147 (wptr_msb == rptr_sync_msb) ? DepthW'(wptr_value) - DepthW'(rptr_sync_value) : 148 (DepthW'(Depth) - DepthW'(rptr_sync_value) + DepthW'(wptr_value)) ; 149 150 // Current depth in the read clock side 151 logic rptr_msb; 152 logic wptr_sync_msb; 153 logic [PTRV_W-1:0] rptr_value; 154 logic [PTRV_W-1:0] wptr_sync_value; 155 156 1/1 assign wptr_sync_msb = fifo_wptr_sync_combi[PTR_WIDTH-1]; Tests: T1 T2 T3  157 1/1 assign rptr_msb = fifo_rptr_q[PTR_WIDTH-1]; Tests: T1 T2 T3  158 1/1 assign wptr_sync_value = fifo_wptr_sync_combi[0+:PTRV_W]; Tests: T1 T2 T3  159 1/1 assign rptr_value = fifo_rptr_q[0+:PTRV_W]; Tests: T1 T2 T3  160 1/1 assign rdepth_o = (full_rclk) ? DepthW'(Depth) : Tests: T1 T2 T3  161 (wptr_sync_msb == rptr_msb) ? DepthW'(wptr_sync_value) - DepthW'(rptr_value) : 162 (DepthW'(Depth) - DepthW'(rptr_value) + DepthW'(wptr_sync_value)) ; 163 164 end else begin : g_no_depth_calc 165 166 assign rdepth_o = full_rclk; 167 assign wdepth_o = full_wclk; 168 169 end 170 171 1/1 assign wready_o = ~full_wclk; Tests: T1 T2 T3  172 1/1 assign rvalid_o = ~empty_rclk; Tests: T1 T2 T3  173 174 ///////////// 175 // Storage // 176 ///////////// 177 178 logic [Width-1:0] rdata_int; 179 if (Depth > 1) begin : g_storage_mux 180 181 always_ff @(posedge clk_wr_i) begin 182 1/1 if (fifo_incr_wptr) begin Tests: T4 T5 T6  183 1/1 storage[fifo_wptr_q[PTRV_W-1:0]] <= wdata_i; Tests: T6 T7 T25  184 end MISSING_ELSE 185 end 186 187 1/1 assign rdata_int = storage[fifo_rptr_q[PTRV_W-1:0]]; Tests: T1 T2 T3  188 189 end else begin : g_storage_simple 190 191 always_ff @(posedge clk_wr_i) begin 192 if (fifo_incr_wptr) begin 193 storage[0] <= wdata_i; 194 end 195 end 196 197 assign rdata_int = storage[0]; 198 199 end 200 201 // rdata_o is qualified with rvalid_o to avoid CDC error 202 if (OutputZeroIfEmpty == 1'b1) begin : gen_output_zero 203 if (OutputZeroIfInvalid == 1'b1) begin : gen_invalid_zero 204 assign rdata_o = empty_rclk ? '0 : (rvalid_o ? rdata_int : '0); 205 end 206 else begin : gen_invalid_non_zero 207 1/1 assign rdata_o = empty_rclk ? '0 : rdata_int; Tests: T1 T2 T3  208 end 209 end else begin : gen_no_output_zero 210 if (OutputZeroIfInvalid == 1'b1) begin : gen_invalid_zero 211 assign rdata_o = rvalid_o ? rdata_int : '0; 212 end 213 else begin : gen_invalid_non_zero 214 assign rdata_o = rdata_int; 215 end 216 end 217 218 ////////////////////////////////////// 219 // Decimal <-> Gray-code Conversion // 220 ////////////////////////////////////// 221 222 // This code is all in a generate context to avoid lint errors when Depth <= 2 223 if (Depth > 2) begin : g_full_gray_conversion 224 225 function automatic [PTR_WIDTH-1:0] dec2gray(input logic [PTR_WIDTH-1:0] decval); 226 logic [PTR_WIDTH-1:0] decval_sub; 227 logic [PTR_WIDTH-1:0] decval_in; 228 logic unused_decval_msb; 229 230 decval_sub = (PTR_WIDTH)'(Depth) - {1'b0, decval[PTR_WIDTH-2:0]} - 1'b1; 231 232 decval_in = decval[PTR_WIDTH-1] ? decval_sub : decval; 233 234 // We do not care about the MSB, hence we mask it out 235 unused_decval_msb = decval_in[PTR_WIDTH-1]; 236 decval_in[PTR_WIDTH-1] = 1'b0; 237 238 // Perform the XOR conversion 239 dec2gray = decval_in; 240 dec2gray ^= (decval_in >> 1); 241 242 // Override the MSB 243 dec2gray[PTR_WIDTH-1] = decval[PTR_WIDTH-1]; 244 endfunction 245 246 // Algorithm walks up from 0..N-1 then flips the upper bit and walks down from N-1 to 0. 247 function automatic [PTR_WIDTH-1:0] gray2dec(input logic [PTR_WIDTH-1:0] grayval); 248 logic [PTR_WIDTH-1:0] dec_tmp, dec_tmp_sub; 249 logic unused_decsub_msb; 250 251 dec_tmp = '0; 252 for (int i = PTR_WIDTH-2; i >= 0; i--) begin 253 dec_tmp[i] = dec_tmp[i+1] ^ grayval[i]; 254 end 255 dec_tmp_sub = (PTR_WIDTH)'(Depth) - dec_tmp - 1'b1; 256 if (grayval[PTR_WIDTH-1]) begin 257 gray2dec = dec_tmp_sub; 258 // Override MSB 259 gray2dec[PTR_WIDTH-1] = 1'b1; 260 unused_decsub_msb = dec_tmp_sub[PTR_WIDTH-1]; 261 end else begin 262 gray2dec = dec_tmp; 263 end 264 endfunction 265 266 // decimal version of read pointer in write domain 267 assign fifo_rptr_sync_combi = gray2dec(fifo_rptr_gray_sync); 268 // decimal version of write pointer in read domain 269 assign fifo_wptr_sync_combi = gray2dec(fifo_wptr_gray_sync); 270 271 assign fifo_rptr_gray_d = dec2gray(fifo_rptr_d); 272 assign fifo_wptr_gray_d = dec2gray(fifo_wptr_d); 273 274 end else if (Depth == 2) begin : g_simple_gray_conversion 275 276 1/1 assign fifo_rptr_sync_combi = {fifo_rptr_gray_sync[PTR_WIDTH-1], ^fifo_rptr_gray_sync}; Tests: T1 T2 T3  277 1/1 assign fifo_wptr_sync_combi = {fifo_wptr_gray_sync[PTR_WIDTH-1], ^fifo_wptr_gray_sync}; Tests: T1 T2 T3  278 279 1/1 assign fifo_rptr_gray_d = {fifo_rptr_d[PTR_WIDTH-1], ^fifo_rptr_d}; Tests: T1 T2 T3  280 1/1 assign fifo_wptr_gray_d = {fifo_wptr_d[PTR_WIDTH-1], ^fifo_wptr_d}; Tests: T1 T2 T3 

Cond Coverage for Instance : tb.dut.u_spi_tpm.u_cmdaddr_buffer
TotalCoveredPercent
Conditions262076.92
Logical262076.92
Non-Logical00
Event00

 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10Not Covered
11CoveredT6,T7,T25

 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
-1--2-StatusTests
01Not Covered
10CoveredT6,T7,T25
11CoveredT6,T7,T25

 LINE       130
 EXPRESSION (fifo_wptr_q == (fifo_rptr_sync_q ^ xor_mask))
            -----------------------1----------------------
-1-StatusTests
0CoveredT1,T2,T3
1Not Covered

 LINE       131
 EXPRESSION (fifo_wptr_sync_combi == (fifo_rptr_q ^ xor_mask))
            -------------------------1------------------------
-1-StatusTests
0CoveredT1,T2,T3
1Not Covered

 LINE       132
 EXPRESSION (fifo_wptr_sync_combi == fifo_rptr_q)
            ------------------1------------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       146
 EXPRESSION 
 Number  Term
      1  full_wclk ? (2'(Depth)) : ((g_depth_calc.wptr_msb == g_depth_calc.rptr_sync_msb) ? ((2'(g_depth_calc.wptr_value) - 2'(g_depth_calc.rptr_sync_value))) : (((2'(Depth) - 2'(g_depth_calc.rptr_sync_value)) + 2'(g_depth_calc.wptr_value)))))
-1-StatusTests
0CoveredT1,T2,T3
1Not Covered

 LINE       146
 SUB-EXPRESSION 
 Number  Term
      1  (g_depth_calc.wptr_msb == g_depth_calc.rptr_sync_msb) ? ((2'(g_depth_calc.wptr_value) - 2'(g_depth_calc.rptr_sync_value))) : (((2'(Depth) - 2'(g_depth_calc.rptr_sync_value)) + 2'(g_depth_calc.wptr_value))))
-1-StatusTests
0CoveredT6,T7,T25
1CoveredT1,T2,T3

 LINE       146
 SUB-EXPRESSION (g_depth_calc.wptr_msb == g_depth_calc.rptr_sync_msb)
                --------------------------1--------------------------
-1-StatusTests
0CoveredT6,T7,T25
1CoveredT1,T2,T3

 LINE       160
 EXPRESSION 
 Number  Term
      1  full_rclk ? (2'(Depth)) : ((g_depth_calc.wptr_sync_msb == g_depth_calc.rptr_msb) ? ((2'(g_depth_calc.wptr_sync_value) - 2'(g_depth_calc.rptr_value))) : (((2'(Depth) - 2'(g_depth_calc.rptr_value)) + 2'(g_depth_calc.wptr_sync_value)))))
-1-StatusTests
0CoveredT1,T2,T3
1Not Covered

 LINE       160
 SUB-EXPRESSION 
 Number  Term
      1  (g_depth_calc.wptr_sync_msb == g_depth_calc.rptr_msb) ? ((2'(g_depth_calc.wptr_sync_value) - 2'(g_depth_calc.rptr_value))) : (((2'(Depth) - 2'(g_depth_calc.rptr_value)) + 2'(g_depth_calc.wptr_sync_value))))
-1-StatusTests
0CoveredT6,T7,T25
1CoveredT1,T2,T3

 LINE       160
 SUB-EXPRESSION (g_depth_calc.wptr_sync_msb == g_depth_calc.rptr_msb)
                --------------------------1--------------------------
-1-StatusTests
0CoveredT6,T7,T25
1CoveredT1,T2,T3

 LINE       207
 EXPRESSION (empty_rclk ? '0 : rdata_int)
             -----1----
-1-StatusTests
0CoveredT6,T7,T25
1CoveredT1,T2,T3

Branch Coverage for Instance : tb.dut.u_spi_tpm.u_cmdaddr_buffer
Line No.TotalCoveredPercent
Branches 24 22 91.67
TERNARY 146 3 2 66.67
TERNARY 160 3 2 66.67
TERNARY 207 2 2 100.00
IF 59 3 3 100.00
IF 68 3 3 100.00
IF 92 3 3 100.00
IF 101 3 3 100.00
IF 117 2 2 100.00
IF 182 2 2 100.00


146 assign wdepth_o = (full_wclk) ? DepthW'(Depth) : -1- ==> 147 (wptr_msb == rptr_sync_msb) ? DepthW'(wptr_value) - DepthW'(rptr_sync_value) : -2- ==> ==>

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


160 assign rdepth_o = (full_rclk) ? DepthW'(Depth) : -1- ==> 161 (wptr_sync_msb == rptr_msb) ? DepthW'(wptr_sync_value) - DepthW'(rptr_value) : -2- ==> ==>

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


207 assign rdata_o = empty_rclk ? '0 : rdata_int; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
0 Covered T6,T7,T25


59 if (!rst_wr_ni) begin -1- 60 fifo_wptr_q <= '0; ==> 61 end else if (fifo_incr_wptr) begin -2- 62 fifo_wptr_q <= fifo_wptr_d; ==> 63 end MISSING_ELSE ==>

Branches:
-1--2-StatusTests
1 - Covered T1,T2,T3
0 1 Covered T6,T7,T25
0 0 Covered T4,T5,T6


68 if (!rst_wr_ni) begin -1- 69 fifo_wptr_gray_q <= '0; ==> 70 end else if (fifo_incr_wptr) begin -2- 71 fifo_wptr_gray_q <= fifo_wptr_gray_d; ==> 72 end MISSING_ELSE ==>

Branches:
-1--2-StatusTests
1 - Covered T1,T2,T3
0 1 Covered T6,T7,T25
0 0 Covered T4,T5,T6


92 if (!rst_rd_ni) begin -1- 93 fifo_rptr_q <= '0; ==> 94 end else if (fifo_incr_rptr) begin -2- 95 fifo_rptr_q <= fifo_rptr_d; ==> 96 end MISSING_ELSE ==>

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


101 if (!rst_rd_ni) begin -1- 102 fifo_rptr_gray_q <= '0; ==> 103 end else if (fifo_incr_rptr) begin -2- 104 fifo_rptr_gray_q <= fifo_rptr_gray_d; ==> 105 end MISSING_ELSE ==>

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


117 if (!rst_wr_ni) begin -1- 118 fifo_rptr_sync_q <= '0; ==> 119 end else begin 120 fifo_rptr_sync_q <= fifo_rptr_sync_combi; ==>

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


182 if (fifo_incr_wptr) begin -1- 183 storage[fifo_wptr_q[PTRV_W-1:0]] <= wdata_i; ==> 184 end MISSING_ELSE ==>

Branches:
-1-StatusTests
1 Covered T6,T7,T25
0 Covered T4,T5,T6


Assert Coverage for Instance : tb.dut.u_spi_tpm.u_cmdaddr_buffer
TotalAttemptedPercentSucceeded/MatchedPercent
Assertions 3 3 100.00 3 100.00
Cover properties 0 0 0
Cover sequences 0 0 0
Total 3 3 100.00 3 100.00




Assertion Details

NameAttemptsReal SuccessesFailuresIncomplete
GrayRptr_A 470389319 470299012 0 0
GrayWptr_A 151147823 151147002 0 0
ParamCheckDepth_A 976 976 0 0


GrayRptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 470389319 470299012 0 0
T1 1357 1274 0 0
T2 2099 2016 0 0
T3 1462 1365 0 0
T4 2459 2396 0 0
T5 13662 13579 0 0
T6 11901 11804 0 0
T7 130782 130726 0 0
T8 33680 33585 0 0
T9 26037 25972 0 0
T10 358623 358536 0 0

GrayWptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 151147823 151147002 0 0
T4 576 575 0 0
T5 26671 26670 0 0
T6 2056 2055 0 0
T7 24219 24218 0 0
T8 46816 46815 0 0
T9 5714 5713 0 0
T10 71210 71209 0 0
T11 57370 57369 0 0
T12 25375 25374 0 0
T15 288 287 0 0

ParamCheckDepth_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 976 976 0 0
T1 1 1 0 0
T2 1 1 0 0
T3 1 1 0 0
T4 1 1 0 0
T5 1 1 0 0
T6 1 1 0 0
T7 1 1 0 0
T8 1 1 0 0
T9 1 1 0 0
T10 1 1 0 0

Line Coverage for Instance : tb.dut.u_spid_status.u_sw_status_update_sync
Line No.TotalCoveredPercent
TOTAL4646100.00
CONT_ASSIGN5311100.00
CONT_ASSIGN5611100.00
ALWAYS5944100.00
ALWAYS6844100.00
CONT_ASSIGN8611100.00
CONT_ASSIGN8911100.00
ALWAYS9244100.00
ALWAYS10144100.00
ALWAYS11733100.00
CONT_ASSIGN13011100.00
CONT_ASSIGN13111100.00
CONT_ASSIGN13211100.00
CONT_ASSIGN14211100.00
CONT_ASSIGN14311100.00
CONT_ASSIGN14411100.00
CONT_ASSIGN14511100.00
CONT_ASSIGN14611100.00
CONT_ASSIGN15611100.00
CONT_ASSIGN15711100.00
CONT_ASSIGN15811100.00
CONT_ASSIGN15911100.00
CONT_ASSIGN16011100.00
CONT_ASSIGN17111100.00
CONT_ASSIGN17211100.00
ALWAYS18222100.00
CONT_ASSIGN18711100.00
CONT_ASSIGN20711100.00
CONT_ASSIGN27611100.00
CONT_ASSIGN27711100.00
CONT_ASSIGN27911100.00
CONT_ASSIGN28011100.00

52 53 1/1 assign fifo_incr_wptr = wvalid_i & wready_o; Tests: T1 T2 T3  54 55 // decimal version 56 1/1 assign fifo_wptr_d = fifo_wptr_q + PTR_WIDTH'(1'b1); Tests: T1 T2 T3  57 58 always_ff @(posedge clk_wr_i or negedge rst_wr_ni) begin 59 1/1 if (!rst_wr_ni) begin Tests: T1 T2 T3  60 1/1 fifo_wptr_q <= '0; Tests: T1 T2 T3  61 1/1 end else if (fifo_incr_wptr) begin Tests: T1 T2 T3  62 1/1 fifo_wptr_q <= fifo_wptr_d; Tests: T9 T11 T12  63 end MISSING_ELSE 64 end 65 66 // gray-coded version 67 always_ff @(posedge clk_wr_i or negedge rst_wr_ni) begin 68 1/1 if (!rst_wr_ni) begin Tests: T1 T2 T3  69 1/1 fifo_wptr_gray_q <= '0; Tests: T1 T2 T3  70 1/1 end else if (fifo_incr_wptr) begin Tests: T1 T2 T3  71 1/1 fifo_wptr_gray_q <= fifo_wptr_gray_d; Tests: T9 T11 T12  72 end MISSING_ELSE 73 end 74 75 // sync gray-coded pointer to read clk 76 prim_flop_2sync #(.Width(PTR_WIDTH)) sync_wptr ( 77 .clk_i (clk_rd_i), 78 .rst_ni (rst_rd_ni), 79 .d_i (fifo_wptr_gray_q), 80 .q_o (fifo_wptr_gray_sync)); 81 82 ////////////////// 83 // Read Pointer // 84 ////////////////// 85 86 1/1 assign fifo_incr_rptr = rvalid_o & rready_i; Tests: T1 T2 T3  87 88 // decimal version 89 1/1 assign fifo_rptr_d = fifo_rptr_q + PTR_WIDTH'(1'b1); Tests: T1 T2 T3  90 91 always_ff @(posedge clk_rd_i or negedge rst_rd_ni) begin 92 1/1 if (!rst_rd_ni) begin Tests: T1 T2 T3  93 1/1 fifo_rptr_q <= '0; Tests: T1 T2 T3  94 1/1 end else if (fifo_incr_rptr) begin Tests: T4 T5 T6  95 1/1 fifo_rptr_q <= fifo_rptr_d; Tests: T9 T11 T12  96 end MISSING_ELSE 97 end 98 99 // gray-coded version 100 always_ff @(posedge clk_rd_i or negedge rst_rd_ni) begin 101 1/1 if (!rst_rd_ni) begin Tests: T1 T2 T3  102 1/1 fifo_rptr_gray_q <= '0; Tests: T1 T2 T3  103 1/1 end else if (fifo_incr_rptr) begin Tests: T4 T5 T6  104 1/1 fifo_rptr_gray_q <= fifo_rptr_gray_d; Tests: T9 T11 T12  105 end MISSING_ELSE 106 end 107 108 // sync gray-coded pointer to write clk 109 prim_flop_2sync #(.Width(PTR_WIDTH)) sync_rptr ( 110 .clk_i (clk_wr_i), 111 .rst_ni (rst_wr_ni), 112 .d_i (fifo_rptr_gray_q), 113 .q_o (fifo_rptr_gray_sync)); 114 115 // Registered version of synced read pointer 116 always_ff @(posedge clk_wr_i or negedge rst_wr_ni) begin 117 1/1 if (!rst_wr_ni) begin Tests: T1 T2 T3  118 1/1 fifo_rptr_sync_q <= '0; Tests: T1 T2 T3  119 end else begin 120 1/1 fifo_rptr_sync_q <= fifo_rptr_sync_combi; Tests: T1 T2 T3  121 end 122 end 123 124 ////////////////// 125 // Empty / Full // 126 ////////////////// 127 128 logic [PTR_WIDTH-1:0] xor_mask; 129 assign xor_mask = PTR_WIDTH'(1'b1) << (PTR_WIDTH-1); 130 1/1 assign full_wclk = (fifo_wptr_q == (fifo_rptr_sync_q ^ xor_mask)); Tests: T1 T2 T3  131 1/1 assign full_rclk = (fifo_wptr_sync_combi == (fifo_rptr_q ^ xor_mask)); Tests: T1 T2 T3  132 1/1 assign empty_rclk = (fifo_wptr_sync_combi == fifo_rptr_q); Tests: T1 T2 T3  133 134 if (Depth > 1) begin : g_depth_calc 135 136 // Current depth in the write clock side 137 logic wptr_msb; 138 logic rptr_sync_msb; 139 logic [PTRV_W-1:0] wptr_value; 140 logic [PTRV_W-1:0] rptr_sync_value; 141 142 1/1 assign wptr_msb = fifo_wptr_q[PTR_WIDTH-1]; Tests: T1 T2 T3  143 1/1 assign rptr_sync_msb = fifo_rptr_sync_q[PTR_WIDTH-1]; Tests: T1 T2 T3  144 1/1 assign wptr_value = fifo_wptr_q[0+:PTRV_W]; Tests: T1 T2 T3  145 1/1 assign rptr_sync_value = fifo_rptr_sync_q[0+:PTRV_W]; Tests: T1 T2 T3  146 1/1 assign wdepth_o = (full_wclk) ? DepthW'(Depth) : Tests: T1 T2 T3  147 (wptr_msb == rptr_sync_msb) ? DepthW'(wptr_value) - DepthW'(rptr_sync_value) : 148 (DepthW'(Depth) - DepthW'(rptr_sync_value) + DepthW'(wptr_value)) ; 149 150 // Current depth in the read clock side 151 logic rptr_msb; 152 logic wptr_sync_msb; 153 logic [PTRV_W-1:0] rptr_value; 154 logic [PTRV_W-1:0] wptr_sync_value; 155 156 1/1 assign wptr_sync_msb = fifo_wptr_sync_combi[PTR_WIDTH-1]; Tests: T1 T2 T3  157 1/1 assign rptr_msb = fifo_rptr_q[PTR_WIDTH-1]; Tests: T1 T2 T3  158 1/1 assign wptr_sync_value = fifo_wptr_sync_combi[0+:PTRV_W]; Tests: T1 T2 T3  159 1/1 assign rptr_value = fifo_rptr_q[0+:PTRV_W]; Tests: T1 T2 T3  160 1/1 assign rdepth_o = (full_rclk) ? DepthW'(Depth) : Tests: T1 T2 T3  161 (wptr_sync_msb == rptr_msb) ? DepthW'(wptr_sync_value) - DepthW'(rptr_value) : 162 (DepthW'(Depth) - DepthW'(rptr_value) + DepthW'(wptr_sync_value)) ; 163 164 end else begin : g_no_depth_calc 165 166 assign rdepth_o = full_rclk; 167 assign wdepth_o = full_wclk; 168 169 end 170 171 1/1 assign wready_o = ~full_wclk; Tests: T1 T2 T3  172 1/1 assign rvalid_o = ~empty_rclk; Tests: T1 T2 T3  173 174 ///////////// 175 // Storage // 176 ///////////// 177 178 logic [Width-1:0] rdata_int; 179 if (Depth > 1) begin : g_storage_mux 180 181 always_ff @(posedge clk_wr_i) begin 182 1/1 if (fifo_incr_wptr) begin Tests: T1 T2 T3  183 1/1 storage[fifo_wptr_q[PTRV_W-1:0]] <= wdata_i; Tests: T9 T11 T12  184 end MISSING_ELSE 185 end 186 187 1/1 assign rdata_int = storage[fifo_rptr_q[PTRV_W-1:0]]; Tests: T1 T2 T3  188 189 end else begin : g_storage_simple 190 191 always_ff @(posedge clk_wr_i) begin 192 if (fifo_incr_wptr) begin 193 storage[0] <= wdata_i; 194 end 195 end 196 197 assign rdata_int = storage[0]; 198 199 end 200 201 // rdata_o is qualified with rvalid_o to avoid CDC error 202 if (OutputZeroIfEmpty == 1'b1) begin : gen_output_zero 203 if (OutputZeroIfInvalid == 1'b1) begin : gen_invalid_zero 204 assign rdata_o = empty_rclk ? '0 : (rvalid_o ? rdata_int : '0); 205 end 206 else begin : gen_invalid_non_zero 207 1/1 assign rdata_o = empty_rclk ? '0 : rdata_int; Tests: T1 T2 T3  208 end 209 end else begin : gen_no_output_zero 210 if (OutputZeroIfInvalid == 1'b1) begin : gen_invalid_zero 211 assign rdata_o = rvalid_o ? rdata_int : '0; 212 end 213 else begin : gen_invalid_non_zero 214 assign rdata_o = rdata_int; 215 end 216 end 217 218 ////////////////////////////////////// 219 // Decimal <-> Gray-code Conversion // 220 ////////////////////////////////////// 221 222 // This code is all in a generate context to avoid lint errors when Depth <= 2 223 if (Depth > 2) begin : g_full_gray_conversion 224 225 function automatic [PTR_WIDTH-1:0] dec2gray(input logic [PTR_WIDTH-1:0] decval); 226 logic [PTR_WIDTH-1:0] decval_sub; 227 logic [PTR_WIDTH-1:0] decval_in; 228 logic unused_decval_msb; 229 230 decval_sub = (PTR_WIDTH)'(Depth) - {1'b0, decval[PTR_WIDTH-2:0]} - 1'b1; 231 232 decval_in = decval[PTR_WIDTH-1] ? decval_sub : decval; 233 234 // We do not care about the MSB, hence we mask it out 235 unused_decval_msb = decval_in[PTR_WIDTH-1]; 236 decval_in[PTR_WIDTH-1] = 1'b0; 237 238 // Perform the XOR conversion 239 dec2gray = decval_in; 240 dec2gray ^= (decval_in >> 1); 241 242 // Override the MSB 243 dec2gray[PTR_WIDTH-1] = decval[PTR_WIDTH-1]; 244 endfunction 245 246 // Algorithm walks up from 0..N-1 then flips the upper bit and walks down from N-1 to 0. 247 function automatic [PTR_WIDTH-1:0] gray2dec(input logic [PTR_WIDTH-1:0] grayval); 248 logic [PTR_WIDTH-1:0] dec_tmp, dec_tmp_sub; 249 logic unused_decsub_msb; 250 251 dec_tmp = '0; 252 for (int i = PTR_WIDTH-2; i >= 0; i--) begin 253 dec_tmp[i] = dec_tmp[i+1] ^ grayval[i]; 254 end 255 dec_tmp_sub = (PTR_WIDTH)'(Depth) - dec_tmp - 1'b1; 256 if (grayval[PTR_WIDTH-1]) begin 257 gray2dec = dec_tmp_sub; 258 // Override MSB 259 gray2dec[PTR_WIDTH-1] = 1'b1; 260 unused_decsub_msb = dec_tmp_sub[PTR_WIDTH-1]; 261 end else begin 262 gray2dec = dec_tmp; 263 end 264 endfunction 265 266 // decimal version of read pointer in write domain 267 assign fifo_rptr_sync_combi = gray2dec(fifo_rptr_gray_sync); 268 // decimal version of write pointer in read domain 269 assign fifo_wptr_sync_combi = gray2dec(fifo_wptr_gray_sync); 270 271 assign fifo_rptr_gray_d = dec2gray(fifo_rptr_d); 272 assign fifo_wptr_gray_d = dec2gray(fifo_wptr_d); 273 274 end else if (Depth == 2) begin : g_simple_gray_conversion 275 276 1/1 assign fifo_rptr_sync_combi = {fifo_rptr_gray_sync[PTR_WIDTH-1], ^fifo_rptr_gray_sync}; Tests: T1 T2 T3  277 1/1 assign fifo_wptr_sync_combi = {fifo_wptr_gray_sync[PTR_WIDTH-1], ^fifo_wptr_gray_sync}; Tests: T1 T2 T3  278 279 1/1 assign fifo_rptr_gray_d = {fifo_rptr_d[PTR_WIDTH-1], ^fifo_rptr_d}; Tests: T1 T2 T3  280 1/1 assign fifo_wptr_gray_d = {fifo_wptr_d[PTR_WIDTH-1], ^fifo_wptr_d}; Tests: T1 T2 T3 

Cond Coverage for Instance : tb.dut.u_spid_status.u_sw_status_update_sync
TotalCoveredPercent
Conditions252496.00
Logical252496.00
Non-Logical00
Event00

 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10Not Covered
11CoveredT9,T11,T12

 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10Unreachable
11CoveredT9,T11,T12

 LINE       130
 EXPRESSION (fifo_wptr_q == (fifo_rptr_sync_q ^ xor_mask))
            -----------------------1----------------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT22,T112,T113

 LINE       131
 EXPRESSION (fifo_wptr_sync_combi == (fifo_rptr_q ^ xor_mask))
            -------------------------1------------------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT22,T114,T115

 LINE       132
 EXPRESSION (fifo_wptr_sync_combi == fifo_rptr_q)
            ------------------1------------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       146
 EXPRESSION 
 Number  Term
      1  full_wclk ? (2'(Depth)) : ((g_depth_calc.wptr_msb == g_depth_calc.rptr_sync_msb) ? ((2'(g_depth_calc.wptr_value) - 2'(g_depth_calc.rptr_sync_value))) : (((2'(Depth) - 2'(g_depth_calc.rptr_sync_value)) + 2'(g_depth_calc.wptr_value)))))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT22,T112,T113

 LINE       146
 SUB-EXPRESSION 
 Number  Term
      1  (g_depth_calc.wptr_msb == g_depth_calc.rptr_sync_msb) ? ((2'(g_depth_calc.wptr_value) - 2'(g_depth_calc.rptr_sync_value))) : (((2'(Depth) - 2'(g_depth_calc.rptr_sync_value)) + 2'(g_depth_calc.wptr_value))))
-1-StatusTests
0CoveredT9,T11,T12
1CoveredT1,T2,T3

 LINE       146
 SUB-EXPRESSION (g_depth_calc.wptr_msb == g_depth_calc.rptr_sync_msb)
                --------------------------1--------------------------
-1-StatusTests
0CoveredT9,T11,T12
1CoveredT1,T2,T3

 LINE       160
 EXPRESSION 
 Number  Term
      1  full_rclk ? (2'(Depth)) : ((g_depth_calc.wptr_sync_msb == g_depth_calc.rptr_msb) ? ((2'(g_depth_calc.wptr_sync_value) - 2'(g_depth_calc.rptr_value))) : (((2'(Depth) - 2'(g_depth_calc.rptr_value)) + 2'(g_depth_calc.wptr_sync_value)))))
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT22,T114,T115

 LINE       160
 SUB-EXPRESSION 
 Number  Term
      1  (g_depth_calc.wptr_sync_msb == g_depth_calc.rptr_msb) ? ((2'(g_depth_calc.wptr_sync_value) - 2'(g_depth_calc.rptr_value))) : (((2'(Depth) - 2'(g_depth_calc.rptr_value)) + 2'(g_depth_calc.wptr_sync_value))))
-1-StatusTests
0CoveredT9,T11,T12
1CoveredT1,T2,T3

 LINE       160
 SUB-EXPRESSION (g_depth_calc.wptr_sync_msb == g_depth_calc.rptr_msb)
                --------------------------1--------------------------
-1-StatusTests
0CoveredT9,T11,T12
1CoveredT1,T2,T3

 LINE       207
 EXPRESSION (empty_rclk ? '0 : rdata_int)
             -----1----
-1-StatusTests
0CoveredT9,T11,T12
1CoveredT1,T2,T3

Branch Coverage for Instance : tb.dut.u_spid_status.u_sw_status_update_sync
Line No.TotalCoveredPercent
Branches 24 24 100.00
TERNARY 146 3 3 100.00
TERNARY 160 3 3 100.00
TERNARY 207 2 2 100.00
IF 59 3 3 100.00
IF 68 3 3 100.00
IF 92 3 3 100.00
IF 101 3 3 100.00
IF 117 2 2 100.00
IF 182 2 2 100.00


146 assign wdepth_o = (full_wclk) ? DepthW'(Depth) : -1- ==> 147 (wptr_msb == rptr_sync_msb) ? DepthW'(wptr_value) - DepthW'(rptr_sync_value) : -2- ==> ==>

Branches:
-1--2-StatusTests
1 - Covered T22,T112,T113
0 1 Covered T1,T2,T3
0 0 Covered T9,T11,T12


160 assign rdepth_o = (full_rclk) ? DepthW'(Depth) : -1- ==> 161 (wptr_sync_msb == rptr_msb) ? DepthW'(wptr_sync_value) - DepthW'(rptr_value) : -2- ==> ==>

Branches:
-1--2-StatusTests
1 - Covered T22,T114,T115
0 1 Covered T1,T2,T3
0 0 Covered T9,T11,T12


207 assign rdata_o = empty_rclk ? '0 : rdata_int; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
0 Covered T9,T11,T12


59 if (!rst_wr_ni) begin -1- 60 fifo_wptr_q <= '0; ==> 61 end else if (fifo_incr_wptr) begin -2- 62 fifo_wptr_q <= fifo_wptr_d; ==> 63 end MISSING_ELSE ==>

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


68 if (!rst_wr_ni) begin -1- 69 fifo_wptr_gray_q <= '0; ==> 70 end else if (fifo_incr_wptr) begin -2- 71 fifo_wptr_gray_q <= fifo_wptr_gray_d; ==> 72 end MISSING_ELSE ==>

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


92 if (!rst_rd_ni) begin -1- 93 fifo_rptr_q <= '0; ==> 94 end else if (fifo_incr_rptr) begin -2- 95 fifo_rptr_q <= fifo_rptr_d; ==> 96 end MISSING_ELSE ==>

Branches:
-1--2-StatusTests
1 - Covered T1,T2,T3
0 1 Covered T9,T11,T12
0 0 Covered T4,T5,T6


101 if (!rst_rd_ni) begin -1- 102 fifo_rptr_gray_q <= '0; ==> 103 end else if (fifo_incr_rptr) begin -2- 104 fifo_rptr_gray_q <= fifo_rptr_gray_d; ==> 105 end MISSING_ELSE ==>

Branches:
-1--2-StatusTests
1 - Covered T1,T2,T3
0 1 Covered T9,T11,T12
0 0 Covered T4,T5,T6


117 if (!rst_wr_ni) begin -1- 118 fifo_rptr_sync_q <= '0; ==> 119 end else begin 120 fifo_rptr_sync_q <= fifo_rptr_sync_combi; ==>

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


182 if (fifo_incr_wptr) begin -1- 183 storage[fifo_wptr_q[PTRV_W-1:0]] <= wdata_i; ==> 184 end MISSING_ELSE ==>

Branches:
-1-StatusTests
1 Covered T9,T11,T12
0 Covered T1,T2,T3


Assert Coverage for Instance : tb.dut.u_spid_status.u_sw_status_update_sync
TotalAttemptedPercentSucceeded/MatchedPercent
Assertions 3 3 100.00 3 100.00
Cover properties 0 0 0
Cover sequences 0 0 0
Total 3 3 100.00 3 100.00




Assertion Details

NameAttemptsReal SuccessesFailuresIncomplete
GrayRptr_A 151147823 151147002 0 0
GrayWptr_A 470389319 470299012 0 0
ParamCheckDepth_A 976 976 0 0


GrayRptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 151147823 151147002 0 0
T4 576 575 0 0
T5 26671 26670 0 0
T6 2056 2055 0 0
T7 24219 24218 0 0
T8 46816 46815 0 0
T9 5714 5713 0 0
T10 71210 71209 0 0
T11 57370 57369 0 0
T12 25375 25374 0 0
T15 288 287 0 0

GrayWptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 470389319 470299012 0 0
T1 1357 1274 0 0
T2 2099 2016 0 0
T3 1462 1365 0 0
T4 2459 2396 0 0
T5 13662 13579 0 0
T6 11901 11804 0 0
T7 130782 130726 0 0
T8 33680 33585 0 0
T9 26037 25972 0 0
T10 358623 358536 0 0

ParamCheckDepth_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 976 976 0 0
T1 1 1 0 0
T2 1 1 0 0
T3 1 1 0 0
T4 1 1 0 0
T5 1 1 0 0
T6 1 1 0 0
T7 1 1 0 0
T8 1 1 0 0
T9 1 1 0 0
T10 1 1 0 0

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