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



Module Instance : tb.dut.u_asf_35.rspfifo

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
98.21 100.00 92.86 100.00 100.00


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
98.21 100.00 92.86 100.00 100.00


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
u_asf_35


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
sync_rptr 100.00 100.00 100.00
sync_wptr 100.00 100.00 100.00



Module Instance : tb.dut.u_asf_37.rspfifo

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
98.21 100.00 92.86 100.00 100.00


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
98.21 100.00 92.86 100.00 100.00


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
u_asf_37


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
sync_rptr 100.00 100.00 100.00
sync_wptr 100.00 100.00 100.00



Module Instance : tb.dut.u_asf_39.rspfifo

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
98.21 100.00 92.86 100.00 100.00


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
98.21 100.00 92.86 100.00 100.00


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
u_asf_39


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
sync_rptr 100.00 100.00 100.00
sync_wptr 100.00 100.00 100.00



Module Instance : tb.dut.u_asf_41.rspfifo

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
98.21 100.00 92.86 100.00 100.00


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
98.21 100.00 92.86 100.00 100.00


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
u_asf_41


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
sync_rptr 100.00 100.00 100.00
sync_wptr 100.00 100.00 100.00



Module Instance : tb.dut.u_asf_35.reqfifo

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
100.00 100.00 100.00 100.00 100.00


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
100.00 100.00 100.00 100.00 100.00


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
u_asf_35


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
sync_rptr 100.00 100.00 100.00
sync_wptr 100.00 100.00 100.00



Module Instance : tb.dut.u_asf_37.reqfifo

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
100.00 100.00 100.00 100.00 100.00


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
100.00 100.00 100.00 100.00 100.00


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
u_asf_37


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
sync_rptr 100.00 100.00 100.00
sync_wptr 100.00 100.00 100.00



Module Instance : tb.dut.u_asf_39.reqfifo

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
100.00 100.00 100.00 100.00 100.00


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
100.00 100.00 100.00 100.00 100.00


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
u_asf_39


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
sync_rptr 100.00 100.00 100.00
sync_wptr 100.00 100.00 100.00



Module Instance : tb.dut.u_asf_41.reqfifo

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
100.00 100.00 100.00 100.00 100.00


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
100.00 100.00 100.00 100.00 100.00


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
u_asf_41


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
TOTAL3838100.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_ASSIGN16611100.00
CONT_ASSIGN16711100.00
CONT_ASSIGN17111100.00
CONT_ASSIGN17211100.00
ALWAYS19222100.00
CONT_ASSIGN19711100.00
CONT_ASSIGN21111100.00
CONT_ASSIGN28411100.00
CONT_ASSIGN28511100.00
CONT_ASSIGN28711100.00
CONT_ASSIGN28811100.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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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 assign wptr_msb = fifo_wptr_q[PTR_WIDTH-1]; 143 assign rptr_sync_msb = fifo_rptr_sync_q[PTR_WIDTH-1]; 144 assign wptr_value = fifo_wptr_q[0+:PTRV_W]; 145 assign rptr_sync_value = fifo_rptr_sync_q[0+:PTRV_W]; 146 assign wdepth_o = (full_wclk) ? DepthW'(Depth) : 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 assign wptr_sync_msb = fifo_wptr_sync_combi[PTR_WIDTH-1]; 157 assign rptr_msb = fifo_rptr_q[PTR_WIDTH-1]; 158 assign wptr_sync_value = fifo_wptr_sync_combi[0+:PTRV_W]; 159 assign rptr_value = fifo_rptr_q[0+:PTRV_W]; 160 assign rdepth_o = (full_rclk) ? DepthW'(Depth) : 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 1/1 assign rdepth_o = full_rclk; Tests: T1 T2 T3  167 1/1 assign wdepth_o = full_wclk; Tests: T1 T2 T3  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 if (fifo_incr_wptr) begin 183 storage[fifo_wptr_q[PTRV_W-1:0]] <= wdata_i; 184 end 185 end 186 187 assign rdata_int = storage[fifo_rptr_q[PTRV_W-1:0]]; 188 189 end else begin : g_storage_simple 190 191 always_ff @(posedge clk_wr_i) begin 192 1/1 if (fifo_incr_wptr) begin Tests: T1 T2 T3  193 1/1 storage[0] <= wdata_i; Tests: T1 T2 T3  194 end MISSING_ELSE 195 end 196 197 1/1 assign rdata_int = storage[0]; Tests: T1 T2 T3  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 assign rdata_o = empty_rclk ? '0 : rdata_int; 208 end 209 end else begin : gen_no_output_zero 210 if (OutputZeroIfInvalid == 1'b1) begin : gen_invalid_zero 211 1/1 assign rdata_o = rvalid_o ? rdata_int : '0; Tests: T1 T2 T3  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 assign fifo_rptr_sync_combi = {fifo_rptr_gray_sync[PTR_WIDTH-1], ^fifo_rptr_gray_sync}; 277 assign fifo_wptr_sync_combi = {fifo_wptr_gray_sync[PTR_WIDTH-1], ^fifo_wptr_gray_sync}; 278 279 assign fifo_rptr_gray_d = {fifo_rptr_d[PTR_WIDTH-1], ^fifo_rptr_d}; 280 assign fifo_wptr_gray_d = {fifo_wptr_d[PTR_WIDTH-1], ^fifo_wptr_d}; 281 282 end else begin : g_no_gray_conversion 283 284 1/1 assign fifo_rptr_sync_combi = fifo_rptr_gray_sync; Tests: T1 T2 T3  285 1/1 assign fifo_wptr_sync_combi = fifo_wptr_gray_sync; Tests: T1 T2 T3  286 287 1/1 assign fifo_rptr_gray_d = fifo_rptr_d; Tests: T1 T2 T3  288 1/1 assign fifo_wptr_gray_d = fifo_wptr_d; Tests: T1 T2 T3 

Cond Coverage for Module : prim_fifo_async ( parameter Width=107,Depth=1,OutputZeroIfEmpty=0,OutputZeroIfInvalid=1,DepthW=1,PTRV_W=1,PTR_WIDTH=1 )
Cond Coverage for Module self-instances :
SCORECOND
100.00 100.00
tb.dut.u_asf_35.reqfifo

SCORECOND
100.00 100.00
tb.dut.u_asf_37.reqfifo

SCORECOND
100.00 100.00
tb.dut.u_asf_39.reqfifo

SCORECOND
100.00 100.00
tb.dut.u_asf_41.reqfifo

TotalCoveredPercent
Conditions1414100.00
Logical1414100.00
Non-Logical00
Event00

 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT3,T7,T8
11CoveredT1,T2,T3

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

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

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

 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

Cond Coverage for Module : prim_fifo_async ( parameter Width=64,Depth=1,OutputZeroIfEmpty=0,OutputZeroIfInvalid=1,DepthW=1,PTRV_W=1,PTR_WIDTH=1 )
Cond Coverage for Module self-instances :
SCORECOND
98.21 92.86
tb.dut.u_asf_35.rspfifo

SCORECOND
98.21 92.86
tb.dut.u_asf_37.rspfifo

SCORECOND
98.21 92.86
tb.dut.u_asf_39.rspfifo

SCORECOND
98.21 92.86
tb.dut.u_asf_41.rspfifo

TotalCoveredPercent
Conditions141392.86
Logical141392.86
Non-Logical00
Event00

 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
-1--2-StatusTests
01Not Covered
10CoveredT3,T9,T7
11CoveredT1,T2,T3

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

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

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

 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

Branch Coverage for Module : prim_fifo_async
Line No.TotalCoveredPercent
Branches 18 18 100.00
TERNARY 211 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 192 2 2 100.00


211 assign rdata_o = rvalid_o ? rdata_int : '0; -1- ==> ==>

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


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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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


192 if (fifo_incr_wptr) begin -1- 193 storage[0] <= wdata_i; ==> 194 end MISSING_ELSE ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
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 2147483647 2147483647 0 0
GrayWptr_A 2147483647 2147483647 0 0
ParamCheckDepth_A 7200 7200 0 0


GrayRptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 2147483647 2147483647 0 0
T1 18343 17757 0 0
T2 20622 20336 0 0
T3 273239 272736 0 0
T7 67600 67117 0 0
T8 333971 333566 0 0
T9 69093 68841 0 0
T10 16706 16164 0 0
T11 146777 146542 0 0
T12 57468 57102 0 0
T13 1675265 1674755 0 0

GrayWptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 2147483647 2147483647 0 0
T1 18343 17757 0 0
T2 20622 20336 0 0
T3 273239 272736 0 0
T7 67600 67117 0 0
T8 333971 333566 0 0
T9 69093 68841 0 0
T10 16706 16164 0 0
T11 146777 146542 0 0
T12 57468 57102 0 0
T13 1675265 1674755 0 0

ParamCheckDepth_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 7200 7200 0 0
T1 8 8 0 0
T2 8 8 0 0
T3 8 8 0 0
T7 8 8 0 0
T8 8 8 0 0
T9 8 8 0 0
T10 8 8 0 0
T11 8 8 0 0
T12 8 8 0 0
T13 8 8 0 0

Line Coverage for Instance : tb.dut.u_asf_35.rspfifo
Line No.TotalCoveredPercent
TOTAL3838100.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_ASSIGN16611100.00
CONT_ASSIGN16711100.00
CONT_ASSIGN17111100.00
CONT_ASSIGN17211100.00
ALWAYS19222100.00
CONT_ASSIGN19711100.00
CONT_ASSIGN21111100.00
CONT_ASSIGN28411100.00
CONT_ASSIGN28511100.00
CONT_ASSIGN28711100.00
CONT_ASSIGN28811100.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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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 assign wptr_msb = fifo_wptr_q[PTR_WIDTH-1]; 143 assign rptr_sync_msb = fifo_rptr_sync_q[PTR_WIDTH-1]; 144 assign wptr_value = fifo_wptr_q[0+:PTRV_W]; 145 assign rptr_sync_value = fifo_rptr_sync_q[0+:PTRV_W]; 146 assign wdepth_o = (full_wclk) ? DepthW'(Depth) : 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 assign wptr_sync_msb = fifo_wptr_sync_combi[PTR_WIDTH-1]; 157 assign rptr_msb = fifo_rptr_q[PTR_WIDTH-1]; 158 assign wptr_sync_value = fifo_wptr_sync_combi[0+:PTRV_W]; 159 assign rptr_value = fifo_rptr_q[0+:PTRV_W]; 160 assign rdepth_o = (full_rclk) ? DepthW'(Depth) : 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 1/1 assign rdepth_o = full_rclk; Tests: T1 T2 T3  167 1/1 assign wdepth_o = full_wclk; Tests: T1 T2 T3  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 if (fifo_incr_wptr) begin 183 storage[fifo_wptr_q[PTRV_W-1:0]] <= wdata_i; 184 end 185 end 186 187 assign rdata_int = storage[fifo_rptr_q[PTRV_W-1:0]]; 188 189 end else begin : g_storage_simple 190 191 always_ff @(posedge clk_wr_i) begin 192 1/1 if (fifo_incr_wptr) begin Tests: T1 T2 T3  193 1/1 storage[0] <= wdata_i; Tests: T1 T2 T3  194 end MISSING_ELSE 195 end 196 197 1/1 assign rdata_int = storage[0]; Tests: T1 T2 T3  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 assign rdata_o = empty_rclk ? '0 : rdata_int; 208 end 209 end else begin : gen_no_output_zero 210 if (OutputZeroIfInvalid == 1'b1) begin : gen_invalid_zero 211 1/1 assign rdata_o = rvalid_o ? rdata_int : '0; Tests: T1 T2 T3  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 assign fifo_rptr_sync_combi = {fifo_rptr_gray_sync[PTR_WIDTH-1], ^fifo_rptr_gray_sync}; 277 assign fifo_wptr_sync_combi = {fifo_wptr_gray_sync[PTR_WIDTH-1], ^fifo_wptr_gray_sync}; 278 279 assign fifo_rptr_gray_d = {fifo_rptr_d[PTR_WIDTH-1], ^fifo_rptr_d}; 280 assign fifo_wptr_gray_d = {fifo_wptr_d[PTR_WIDTH-1], ^fifo_wptr_d}; 281 282 end else begin : g_no_gray_conversion 283 284 1/1 assign fifo_rptr_sync_combi = fifo_rptr_gray_sync; Tests: T1 T2 T3  285 1/1 assign fifo_wptr_sync_combi = fifo_wptr_gray_sync; Tests: T1 T2 T3  286 287 1/1 assign fifo_rptr_gray_d = fifo_rptr_d; Tests: T1 T2 T3  288 1/1 assign fifo_wptr_gray_d = fifo_wptr_d; Tests: T1 T2 T3 

Cond Coverage for Instance : tb.dut.u_asf_35.rspfifo
TotalCoveredPercent
Conditions141392.86
Logical141392.86
Non-Logical00
Event00

 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
-1--2-StatusTests
01Not Covered
10CoveredT7,T8,T22
11CoveredT1,T2,T3

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

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

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

 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

Branch Coverage for Instance : tb.dut.u_asf_35.rspfifo
Line No.TotalCoveredPercent
Branches 18 18 100.00
TERNARY 211 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 192 2 2 100.00


211 assign rdata_o = rvalid_o ? rdata_int : '0; -1- ==> ==>

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


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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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


192 if (fifo_incr_wptr) begin -1- 193 storage[0] <= wdata_i; ==> 194 end MISSING_ELSE ==>

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


Assert Coverage for Instance : tb.dut.u_asf_35.rspfifo
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 415890009 415770294 0 0
GrayWptr_A 602589685 602472925 0 0
ParamCheckDepth_A 900 900 0 0


GrayRptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 415890009 415770294 0 0
T1 2713 2626 0 0
T2 2232 2201 0 0
T3 46294 46209 0 0
T7 10531 10456 0 0
T8 26919 26886 0 0
T9 8831 8799 0 0
T10 2221 2149 0 0
T11 16085 16059 0 0
T12 8440 8386 0 0
T13 277109 277025 0 0

GrayWptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 602589685 602472925 0 0
T1 2264 2192 0 0
T2 2764 2726 0 0
T3 12580 12557 0 0
T7 8112 8054 0 0
T8 26919 26886 0 0
T9 9351 9317 0 0
T10 2503 2422 0 0
T11 7238 7226 0 0
T12 7100 7055 0 0
T13 154306 154258 0 0

ParamCheckDepth_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 900 900 0 0
T1 1 1 0 0
T2 1 1 0 0
T3 1 1 0 0
T7 1 1 0 0
T8 1 1 0 0
T9 1 1 0 0
T10 1 1 0 0
T11 1 1 0 0
T12 1 1 0 0
T13 1 1 0 0

Line Coverage for Instance : tb.dut.u_asf_37.rspfifo
Line No.TotalCoveredPercent
TOTAL3838100.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_ASSIGN16611100.00
CONT_ASSIGN16711100.00
CONT_ASSIGN17111100.00
CONT_ASSIGN17211100.00
ALWAYS19222100.00
CONT_ASSIGN19711100.00
CONT_ASSIGN21111100.00
CONT_ASSIGN28411100.00
CONT_ASSIGN28511100.00
CONT_ASSIGN28711100.00
CONT_ASSIGN28811100.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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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 assign wptr_msb = fifo_wptr_q[PTR_WIDTH-1]; 143 assign rptr_sync_msb = fifo_rptr_sync_q[PTR_WIDTH-1]; 144 assign wptr_value = fifo_wptr_q[0+:PTRV_W]; 145 assign rptr_sync_value = fifo_rptr_sync_q[0+:PTRV_W]; 146 assign wdepth_o = (full_wclk) ? DepthW'(Depth) : 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 assign wptr_sync_msb = fifo_wptr_sync_combi[PTR_WIDTH-1]; 157 assign rptr_msb = fifo_rptr_q[PTR_WIDTH-1]; 158 assign wptr_sync_value = fifo_wptr_sync_combi[0+:PTRV_W]; 159 assign rptr_value = fifo_rptr_q[0+:PTRV_W]; 160 assign rdepth_o = (full_rclk) ? DepthW'(Depth) : 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 1/1 assign rdepth_o = full_rclk; Tests: T1 T2 T3  167 1/1 assign wdepth_o = full_wclk; Tests: T1 T2 T3  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 if (fifo_incr_wptr) begin 183 storage[fifo_wptr_q[PTRV_W-1:0]] <= wdata_i; 184 end 185 end 186 187 assign rdata_int = storage[fifo_rptr_q[PTRV_W-1:0]]; 188 189 end else begin : g_storage_simple 190 191 always_ff @(posedge clk_wr_i) begin 192 1/1 if (fifo_incr_wptr) begin Tests: T1 T2 T3  193 1/1 storage[0] <= wdata_i; Tests: T1 T2 T3  194 end MISSING_ELSE 195 end 196 197 1/1 assign rdata_int = storage[0]; Tests: T1 T2 T3  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 assign rdata_o = empty_rclk ? '0 : rdata_int; 208 end 209 end else begin : gen_no_output_zero 210 if (OutputZeroIfInvalid == 1'b1) begin : gen_invalid_zero 211 1/1 assign rdata_o = rvalid_o ? rdata_int : '0; Tests: T1 T2 T3  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 assign fifo_rptr_sync_combi = {fifo_rptr_gray_sync[PTR_WIDTH-1], ^fifo_rptr_gray_sync}; 277 assign fifo_wptr_sync_combi = {fifo_wptr_gray_sync[PTR_WIDTH-1], ^fifo_wptr_gray_sync}; 278 279 assign fifo_rptr_gray_d = {fifo_rptr_d[PTR_WIDTH-1], ^fifo_rptr_d}; 280 assign fifo_wptr_gray_d = {fifo_wptr_d[PTR_WIDTH-1], ^fifo_wptr_d}; 281 282 end else begin : g_no_gray_conversion 283 284 1/1 assign fifo_rptr_sync_combi = fifo_rptr_gray_sync; Tests: T1 T2 T3  285 1/1 assign fifo_wptr_sync_combi = fifo_wptr_gray_sync; Tests: T1 T2 T3  286 287 1/1 assign fifo_rptr_gray_d = fifo_rptr_d; Tests: T1 T2 T3  288 1/1 assign fifo_wptr_gray_d = fifo_wptr_d; Tests: T1 T2 T3 

Cond Coverage for Instance : tb.dut.u_asf_37.rspfifo
TotalCoveredPercent
Conditions141392.86
Logical141392.86
Non-Logical00
Event00

 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
-1--2-StatusTests
01Not Covered
10CoveredT3,T9,T7
11CoveredT1,T2,T3

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

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

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

 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

Branch Coverage for Instance : tb.dut.u_asf_37.rspfifo
Line No.TotalCoveredPercent
Branches 18 18 100.00
TERNARY 211 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 192 2 2 100.00


211 assign rdata_o = rvalid_o ? rdata_int : '0; -1- ==> ==>

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


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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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


192 if (fifo_incr_wptr) begin -1- 193 storage[0] <= wdata_i; ==> 194 end MISSING_ELSE ==>

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


Assert Coverage for Instance : tb.dut.u_asf_37.rspfifo
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 415890009 415770294 0 0
GrayWptr_A 600248024 600118045 0 0
ParamCheckDepth_A 900 900 0 0


GrayRptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 415890009 415770294 0 0
T1 2713 2626 0 0
T2 2232 2201 0 0
T3 46294 46209 0 0
T7 10531 10456 0 0
T8 26919 26886 0 0
T9 8831 8799 0 0
T10 2221 2149 0 0
T11 16085 16059 0 0
T12 8440 8386 0 0
T13 277109 277025 0 0

GrayWptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 600248024 600118045 0 0
T1 2488 2409 0 0
T2 637 628 0 0
T3 30193 30137 0 0
T7 2419 2401 0 0
T8 44585 44531 0 0
T9 4416 4399 0 0
T10 720 696 0 0
T11 13672 13650 0 0
T12 6831 6788 0 0
T13 144857 144813 0 0

ParamCheckDepth_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 900 900 0 0
T1 1 1 0 0
T2 1 1 0 0
T3 1 1 0 0
T7 1 1 0 0
T8 1 1 0 0
T9 1 1 0 0
T10 1 1 0 0
T11 1 1 0 0
T12 1 1 0 0
T13 1 1 0 0

Line Coverage for Instance : tb.dut.u_asf_39.rspfifo
Line No.TotalCoveredPercent
TOTAL3838100.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_ASSIGN16611100.00
CONT_ASSIGN16711100.00
CONT_ASSIGN17111100.00
CONT_ASSIGN17211100.00
ALWAYS19222100.00
CONT_ASSIGN19711100.00
CONT_ASSIGN21111100.00
CONT_ASSIGN28411100.00
CONT_ASSIGN28511100.00
CONT_ASSIGN28711100.00
CONT_ASSIGN28811100.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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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 assign wptr_msb = fifo_wptr_q[PTR_WIDTH-1]; 143 assign rptr_sync_msb = fifo_rptr_sync_q[PTR_WIDTH-1]; 144 assign wptr_value = fifo_wptr_q[0+:PTRV_W]; 145 assign rptr_sync_value = fifo_rptr_sync_q[0+:PTRV_W]; 146 assign wdepth_o = (full_wclk) ? DepthW'(Depth) : 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 assign wptr_sync_msb = fifo_wptr_sync_combi[PTR_WIDTH-1]; 157 assign rptr_msb = fifo_rptr_q[PTR_WIDTH-1]; 158 assign wptr_sync_value = fifo_wptr_sync_combi[0+:PTRV_W]; 159 assign rptr_value = fifo_rptr_q[0+:PTRV_W]; 160 assign rdepth_o = (full_rclk) ? DepthW'(Depth) : 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 1/1 assign rdepth_o = full_rclk; Tests: T1 T2 T3  167 1/1 assign wdepth_o = full_wclk; Tests: T1 T2 T3  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 if (fifo_incr_wptr) begin 183 storage[fifo_wptr_q[PTRV_W-1:0]] <= wdata_i; 184 end 185 end 186 187 assign rdata_int = storage[fifo_rptr_q[PTRV_W-1:0]]; 188 189 end else begin : g_storage_simple 190 191 always_ff @(posedge clk_wr_i) begin 192 1/1 if (fifo_incr_wptr) begin Tests: T1 T2 T3  193 1/1 storage[0] <= wdata_i; Tests: T1 T2 T3  194 end MISSING_ELSE 195 end 196 197 1/1 assign rdata_int = storage[0]; Tests: T1 T2 T3  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 assign rdata_o = empty_rclk ? '0 : rdata_int; 208 end 209 end else begin : gen_no_output_zero 210 if (OutputZeroIfInvalid == 1'b1) begin : gen_invalid_zero 211 1/1 assign rdata_o = rvalid_o ? rdata_int : '0; Tests: T1 T2 T3  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 assign fifo_rptr_sync_combi = {fifo_rptr_gray_sync[PTR_WIDTH-1], ^fifo_rptr_gray_sync}; 277 assign fifo_wptr_sync_combi = {fifo_wptr_gray_sync[PTR_WIDTH-1], ^fifo_wptr_gray_sync}; 278 279 assign fifo_rptr_gray_d = {fifo_rptr_d[PTR_WIDTH-1], ^fifo_rptr_d}; 280 assign fifo_wptr_gray_d = {fifo_wptr_d[PTR_WIDTH-1], ^fifo_wptr_d}; 281 282 end else begin : g_no_gray_conversion 283 284 1/1 assign fifo_rptr_sync_combi = fifo_rptr_gray_sync; Tests: T1 T2 T3  285 1/1 assign fifo_wptr_sync_combi = fifo_wptr_gray_sync; Tests: T1 T2 T3  286 287 1/1 assign fifo_rptr_gray_d = fifo_rptr_d; Tests: T1 T2 T3  288 1/1 assign fifo_wptr_gray_d = fifo_wptr_d; Tests: T1 T2 T3 

Cond Coverage for Instance : tb.dut.u_asf_39.rspfifo
TotalCoveredPercent
Conditions141392.86
Logical141392.86
Non-Logical00
Event00

 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
-1--2-StatusTests
01Not Covered
10CoveredT3,T9,T7
11CoveredT1,T2,T3

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

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

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

 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

Branch Coverage for Instance : tb.dut.u_asf_39.rspfifo
Line No.TotalCoveredPercent
Branches 18 18 100.00
TERNARY 211 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 192 2 2 100.00


211 assign rdata_o = rvalid_o ? rdata_int : '0; -1- ==> ==>

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


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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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


192 if (fifo_incr_wptr) begin -1- 193 storage[0] <= wdata_i; ==> 194 end MISSING_ELSE ==>

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


Assert Coverage for Instance : tb.dut.u_asf_39.rspfifo
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 415890009 415770294 0 0
GrayWptr_A 553452712 553329281 0 0
ParamCheckDepth_A 900 900 0 0


GrayRptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 415890009 415770294 0 0
T1 2713 2626 0 0
T2 2232 2201 0 0
T3 46294 46209 0 0
T7 10531 10456 0 0
T8 26919 26886 0 0
T9 8831 8799 0 0
T10 2221 2149 0 0
T11 16085 16059 0 0
T12 8440 8386 0 0
T13 277109 277025 0 0

GrayWptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 553452712 553329281 0 0
T1 587 568 0 0
T2 3668 3617 0 0
T3 22645 22603 0 0
T7 4270 4239 0 0
T8 73189 73101 0 0
T9 14287 14235 0 0
T10 2722 2634 0 0
T11 21715 21681 0 0
T12 5893 5856 0 0
T13 135408 135367 0 0

ParamCheckDepth_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 900 900 0 0
T1 1 1 0 0
T2 1 1 0 0
T3 1 1 0 0
T7 1 1 0 0
T8 1 1 0 0
T9 1 1 0 0
T10 1 1 0 0
T11 1 1 0 0
T12 1 1 0 0
T13 1 1 0 0

Line Coverage for Instance : tb.dut.u_asf_41.rspfifo
Line No.TotalCoveredPercent
TOTAL3838100.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_ASSIGN16611100.00
CONT_ASSIGN16711100.00
CONT_ASSIGN17111100.00
CONT_ASSIGN17211100.00
ALWAYS19222100.00
CONT_ASSIGN19711100.00
CONT_ASSIGN21111100.00
CONT_ASSIGN28411100.00
CONT_ASSIGN28511100.00
CONT_ASSIGN28711100.00
CONT_ASSIGN28811100.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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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 assign wptr_msb = fifo_wptr_q[PTR_WIDTH-1]; 143 assign rptr_sync_msb = fifo_rptr_sync_q[PTR_WIDTH-1]; 144 assign wptr_value = fifo_wptr_q[0+:PTRV_W]; 145 assign rptr_sync_value = fifo_rptr_sync_q[0+:PTRV_W]; 146 assign wdepth_o = (full_wclk) ? DepthW'(Depth) : 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 assign wptr_sync_msb = fifo_wptr_sync_combi[PTR_WIDTH-1]; 157 assign rptr_msb = fifo_rptr_q[PTR_WIDTH-1]; 158 assign wptr_sync_value = fifo_wptr_sync_combi[0+:PTRV_W]; 159 assign rptr_value = fifo_rptr_q[0+:PTRV_W]; 160 assign rdepth_o = (full_rclk) ? DepthW'(Depth) : 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 1/1 assign rdepth_o = full_rclk; Tests: T1 T2 T3  167 1/1 assign wdepth_o = full_wclk; Tests: T1 T2 T3  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 if (fifo_incr_wptr) begin 183 storage[fifo_wptr_q[PTRV_W-1:0]] <= wdata_i; 184 end 185 end 186 187 assign rdata_int = storage[fifo_rptr_q[PTRV_W-1:0]]; 188 189 end else begin : g_storage_simple 190 191 always_ff @(posedge clk_wr_i) begin 192 1/1 if (fifo_incr_wptr) begin Tests: T1 T2 T3  193 1/1 storage[0] <= wdata_i; Tests: T1 T2 T3  194 end MISSING_ELSE 195 end 196 197 1/1 assign rdata_int = storage[0]; Tests: T1 T2 T3  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 assign rdata_o = empty_rclk ? '0 : rdata_int; 208 end 209 end else begin : gen_no_output_zero 210 if (OutputZeroIfInvalid == 1'b1) begin : gen_invalid_zero 211 1/1 assign rdata_o = rvalid_o ? rdata_int : '0; Tests: T1 T2 T3  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 assign fifo_rptr_sync_combi = {fifo_rptr_gray_sync[PTR_WIDTH-1], ^fifo_rptr_gray_sync}; 277 assign fifo_wptr_sync_combi = {fifo_wptr_gray_sync[PTR_WIDTH-1], ^fifo_wptr_gray_sync}; 278 279 assign fifo_rptr_gray_d = {fifo_rptr_d[PTR_WIDTH-1], ^fifo_rptr_d}; 280 assign fifo_wptr_gray_d = {fifo_wptr_d[PTR_WIDTH-1], ^fifo_wptr_d}; 281 282 end else begin : g_no_gray_conversion 283 284 1/1 assign fifo_rptr_sync_combi = fifo_rptr_gray_sync; Tests: T1 T2 T3  285 1/1 assign fifo_wptr_sync_combi = fifo_wptr_gray_sync; Tests: T1 T2 T3  286 287 1/1 assign fifo_rptr_gray_d = fifo_rptr_d; Tests: T1 T2 T3  288 1/1 assign fifo_wptr_gray_d = fifo_wptr_d; Tests: T1 T2 T3 

Cond Coverage for Instance : tb.dut.u_asf_41.rspfifo
TotalCoveredPercent
Conditions141392.86
Logical141392.86
Non-Logical00
Event00

 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
-1--2-StatusTests
01Not Covered
10CoveredT3,T9,T7
11CoveredT1,T2,T3

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

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

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

 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

Branch Coverage for Instance : tb.dut.u_asf_41.rspfifo
Line No.TotalCoveredPercent
Branches 18 18 100.00
TERNARY 211 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 192 2 2 100.00


211 assign rdata_o = rvalid_o ? rdata_int : '0; -1- ==> ==>

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


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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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


192 if (fifo_incr_wptr) begin -1- 193 storage[0] <= wdata_i; ==> 194 end MISSING_ELSE ==>

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


Assert Coverage for Instance : tb.dut.u_asf_41.rspfifo
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 415890009 415770294 0 0
GrayWptr_A 612441333 612316452 0 0
ParamCheckDepth_A 900 900 0 0


GrayRptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 415890009 415770294 0 0
T1 2713 2626 0 0
T2 2232 2201 0 0
T3 46294 46209 0 0
T7 10531 10456 0 0
T8 26919 26886 0 0
T9 8831 8799 0 0
T10 2221 2149 0 0
T11 16085 16059 0 0
T12 8440 8386 0 0
T13 277109 277025 0 0

GrayWptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 612441333 612316452 0 0
T1 2152 2084 0 0
T2 4625 4561 0 0
T3 22645 22603 0 0
T7 10675 10599 0 0
T8 81602 81504 0 0
T9 5715 5694 0 0
T10 1877 1816 0 0
T11 39812 39749 0 0
T12 3884 3859 0 0
T13 132258 132217 0 0

ParamCheckDepth_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 900 900 0 0
T1 1 1 0 0
T2 1 1 0 0
T3 1 1 0 0
T7 1 1 0 0
T8 1 1 0 0
T9 1 1 0 0
T10 1 1 0 0
T11 1 1 0 0
T12 1 1 0 0
T13 1 1 0 0

Line Coverage for Instance : tb.dut.u_asf_35.reqfifo
Line No.TotalCoveredPercent
TOTAL3838100.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_ASSIGN16611100.00
CONT_ASSIGN16711100.00
CONT_ASSIGN17111100.00
CONT_ASSIGN17211100.00
ALWAYS19222100.00
CONT_ASSIGN19711100.00
CONT_ASSIGN21111100.00
CONT_ASSIGN28411100.00
CONT_ASSIGN28511100.00
CONT_ASSIGN28711100.00
CONT_ASSIGN28811100.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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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 assign wptr_msb = fifo_wptr_q[PTR_WIDTH-1]; 143 assign rptr_sync_msb = fifo_rptr_sync_q[PTR_WIDTH-1]; 144 assign wptr_value = fifo_wptr_q[0+:PTRV_W]; 145 assign rptr_sync_value = fifo_rptr_sync_q[0+:PTRV_W]; 146 assign wdepth_o = (full_wclk) ? DepthW'(Depth) : 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 assign wptr_sync_msb = fifo_wptr_sync_combi[PTR_WIDTH-1]; 157 assign rptr_msb = fifo_rptr_q[PTR_WIDTH-1]; 158 assign wptr_sync_value = fifo_wptr_sync_combi[0+:PTRV_W]; 159 assign rptr_value = fifo_rptr_q[0+:PTRV_W]; 160 assign rdepth_o = (full_rclk) ? DepthW'(Depth) : 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 1/1 assign rdepth_o = full_rclk; Tests: T1 T2 T3  167 1/1 assign wdepth_o = full_wclk; Tests: T1 T2 T3  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 if (fifo_incr_wptr) begin 183 storage[fifo_wptr_q[PTRV_W-1:0]] <= wdata_i; 184 end 185 end 186 187 assign rdata_int = storage[fifo_rptr_q[PTRV_W-1:0]]; 188 189 end else begin : g_storage_simple 190 191 always_ff @(posedge clk_wr_i) begin 192 1/1 if (fifo_incr_wptr) begin Tests: T1 T2 T3  193 1/1 storage[0] <= wdata_i; Tests: T1 T2 T3  194 end MISSING_ELSE 195 end 196 197 1/1 assign rdata_int = storage[0]; Tests: T1 T2 T3  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 assign rdata_o = empty_rclk ? '0 : rdata_int; 208 end 209 end else begin : gen_no_output_zero 210 if (OutputZeroIfInvalid == 1'b1) begin : gen_invalid_zero 211 1/1 assign rdata_o = rvalid_o ? rdata_int : '0; Tests: T1 T2 T3  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 assign fifo_rptr_sync_combi = {fifo_rptr_gray_sync[PTR_WIDTH-1], ^fifo_rptr_gray_sync}; 277 assign fifo_wptr_sync_combi = {fifo_wptr_gray_sync[PTR_WIDTH-1], ^fifo_wptr_gray_sync}; 278 279 assign fifo_rptr_gray_d = {fifo_rptr_d[PTR_WIDTH-1], ^fifo_rptr_d}; 280 assign fifo_wptr_gray_d = {fifo_wptr_d[PTR_WIDTH-1], ^fifo_wptr_d}; 281 282 end else begin : g_no_gray_conversion 283 284 1/1 assign fifo_rptr_sync_combi = fifo_rptr_gray_sync; Tests: T1 T2 T3  285 1/1 assign fifo_wptr_sync_combi = fifo_wptr_gray_sync; Tests: T1 T2 T3  286 287 1/1 assign fifo_rptr_gray_d = fifo_rptr_d; Tests: T1 T2 T3  288 1/1 assign fifo_wptr_gray_d = fifo_wptr_d; Tests: T1 T2 T3 

Cond Coverage for Instance : tb.dut.u_asf_35.reqfifo
TotalCoveredPercent
Conditions1414100.00
Logical1414100.00
Non-Logical00
Event00

 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT3,T7,T8
11CoveredT1,T2,T3

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

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

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

 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

Branch Coverage for Instance : tb.dut.u_asf_35.reqfifo
Line No.TotalCoveredPercent
Branches 18 18 100.00
TERNARY 211 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 192 2 2 100.00


211 assign rdata_o = rvalid_o ? rdata_int : '0; -1- ==> ==>

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


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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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


192 if (fifo_incr_wptr) begin -1- 193 storage[0] <= wdata_i; ==> 194 end MISSING_ELSE ==>

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


Assert Coverage for Instance : tb.dut.u_asf_35.reqfifo
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 602589685 602472925 0 0
GrayWptr_A 415890009 415770294 0 0
ParamCheckDepth_A 900 900 0 0


GrayRptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 602589685 602472925 0 0
T1 2264 2192 0 0
T2 2764 2726 0 0
T3 12580 12557 0 0
T7 8112 8054 0 0
T8 26919 26886 0 0
T9 9351 9317 0 0
T10 2503 2422 0 0
T11 7238 7226 0 0
T12 7100 7055 0 0
T13 154306 154258 0 0

GrayWptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 415890009 415770294 0 0
T1 2713 2626 0 0
T2 2232 2201 0 0
T3 46294 46209 0 0
T7 10531 10456 0 0
T8 26919 26886 0 0
T9 8831 8799 0 0
T10 2221 2149 0 0
T11 16085 16059 0 0
T12 8440 8386 0 0
T13 277109 277025 0 0

ParamCheckDepth_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 900 900 0 0
T1 1 1 0 0
T2 1 1 0 0
T3 1 1 0 0
T7 1 1 0 0
T8 1 1 0 0
T9 1 1 0 0
T10 1 1 0 0
T11 1 1 0 0
T12 1 1 0 0
T13 1 1 0 0

Line Coverage for Instance : tb.dut.u_asf_37.reqfifo
Line No.TotalCoveredPercent
TOTAL3838100.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_ASSIGN16611100.00
CONT_ASSIGN16711100.00
CONT_ASSIGN17111100.00
CONT_ASSIGN17211100.00
ALWAYS19222100.00
CONT_ASSIGN19711100.00
CONT_ASSIGN21111100.00
CONT_ASSIGN28411100.00
CONT_ASSIGN28511100.00
CONT_ASSIGN28711100.00
CONT_ASSIGN28811100.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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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 assign wptr_msb = fifo_wptr_q[PTR_WIDTH-1]; 143 assign rptr_sync_msb = fifo_rptr_sync_q[PTR_WIDTH-1]; 144 assign wptr_value = fifo_wptr_q[0+:PTRV_W]; 145 assign rptr_sync_value = fifo_rptr_sync_q[0+:PTRV_W]; 146 assign wdepth_o = (full_wclk) ? DepthW'(Depth) : 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 assign wptr_sync_msb = fifo_wptr_sync_combi[PTR_WIDTH-1]; 157 assign rptr_msb = fifo_rptr_q[PTR_WIDTH-1]; 158 assign wptr_sync_value = fifo_wptr_sync_combi[0+:PTRV_W]; 159 assign rptr_value = fifo_rptr_q[0+:PTRV_W]; 160 assign rdepth_o = (full_rclk) ? DepthW'(Depth) : 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 1/1 assign rdepth_o = full_rclk; Tests: T1 T2 T3  167 1/1 assign wdepth_o = full_wclk; Tests: T1 T2 T3  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 if (fifo_incr_wptr) begin 183 storage[fifo_wptr_q[PTRV_W-1:0]] <= wdata_i; 184 end 185 end 186 187 assign rdata_int = storage[fifo_rptr_q[PTRV_W-1:0]]; 188 189 end else begin : g_storage_simple 190 191 always_ff @(posedge clk_wr_i) begin 192 1/1 if (fifo_incr_wptr) begin Tests: T1 T2 T3  193 1/1 storage[0] <= wdata_i; Tests: T1 T2 T3  194 end MISSING_ELSE 195 end 196 197 1/1 assign rdata_int = storage[0]; Tests: T1 T2 T3  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 assign rdata_o = empty_rclk ? '0 : rdata_int; 208 end 209 end else begin : gen_no_output_zero 210 if (OutputZeroIfInvalid == 1'b1) begin : gen_invalid_zero 211 1/1 assign rdata_o = rvalid_o ? rdata_int : '0; Tests: T1 T2 T3  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 assign fifo_rptr_sync_combi = {fifo_rptr_gray_sync[PTR_WIDTH-1], ^fifo_rptr_gray_sync}; 277 assign fifo_wptr_sync_combi = {fifo_wptr_gray_sync[PTR_WIDTH-1], ^fifo_wptr_gray_sync}; 278 279 assign fifo_rptr_gray_d = {fifo_rptr_d[PTR_WIDTH-1], ^fifo_rptr_d}; 280 assign fifo_wptr_gray_d = {fifo_wptr_d[PTR_WIDTH-1], ^fifo_wptr_d}; 281 282 end else begin : g_no_gray_conversion 283 284 1/1 assign fifo_rptr_sync_combi = fifo_rptr_gray_sync; Tests: T1 T2 T3  285 1/1 assign fifo_wptr_sync_combi = fifo_wptr_gray_sync; Tests: T1 T2 T3  286 287 1/1 assign fifo_rptr_gray_d = fifo_rptr_d; Tests: T1 T2 T3  288 1/1 assign fifo_wptr_gray_d = fifo_wptr_d; Tests: T1 T2 T3 

Cond Coverage for Instance : tb.dut.u_asf_37.reqfifo
TotalCoveredPercent
Conditions1414100.00
Logical1414100.00
Non-Logical00
Event00

 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT3,T7,T8
11CoveredT1,T2,T3

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

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

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

 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

Branch Coverage for Instance : tb.dut.u_asf_37.reqfifo
Line No.TotalCoveredPercent
Branches 18 18 100.00
TERNARY 211 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 192 2 2 100.00


211 assign rdata_o = rvalid_o ? rdata_int : '0; -1- ==> ==>

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


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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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


192 if (fifo_incr_wptr) begin -1- 193 storage[0] <= wdata_i; ==> 194 end MISSING_ELSE ==>

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


Assert Coverage for Instance : tb.dut.u_asf_37.reqfifo
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 600248024 600118045 0 0
GrayWptr_A 415890009 415770294 0 0
ParamCheckDepth_A 900 900 0 0


GrayRptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 600248024 600118045 0 0
T1 2488 2409 0 0
T2 637 628 0 0
T3 30193 30137 0 0
T7 2419 2401 0 0
T8 44585 44531 0 0
T9 4416 4399 0 0
T10 720 696 0 0
T11 13672 13650 0 0
T12 6831 6788 0 0
T13 144857 144813 0 0

GrayWptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 415890009 415770294 0 0
T1 2713 2626 0 0
T2 2232 2201 0 0
T3 46294 46209 0 0
T7 10531 10456 0 0
T8 26919 26886 0 0
T9 8831 8799 0 0
T10 2221 2149 0 0
T11 16085 16059 0 0
T12 8440 8386 0 0
T13 277109 277025 0 0

ParamCheckDepth_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 900 900 0 0
T1 1 1 0 0
T2 1 1 0 0
T3 1 1 0 0
T7 1 1 0 0
T8 1 1 0 0
T9 1 1 0 0
T10 1 1 0 0
T11 1 1 0 0
T12 1 1 0 0
T13 1 1 0 0

Line Coverage for Instance : tb.dut.u_asf_39.reqfifo
Line No.TotalCoveredPercent
TOTAL3838100.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_ASSIGN16611100.00
CONT_ASSIGN16711100.00
CONT_ASSIGN17111100.00
CONT_ASSIGN17211100.00
ALWAYS19222100.00
CONT_ASSIGN19711100.00
CONT_ASSIGN21111100.00
CONT_ASSIGN28411100.00
CONT_ASSIGN28511100.00
CONT_ASSIGN28711100.00
CONT_ASSIGN28811100.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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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 assign wptr_msb = fifo_wptr_q[PTR_WIDTH-1]; 143 assign rptr_sync_msb = fifo_rptr_sync_q[PTR_WIDTH-1]; 144 assign wptr_value = fifo_wptr_q[0+:PTRV_W]; 145 assign rptr_sync_value = fifo_rptr_sync_q[0+:PTRV_W]; 146 assign wdepth_o = (full_wclk) ? DepthW'(Depth) : 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 assign wptr_sync_msb = fifo_wptr_sync_combi[PTR_WIDTH-1]; 157 assign rptr_msb = fifo_rptr_q[PTR_WIDTH-1]; 158 assign wptr_sync_value = fifo_wptr_sync_combi[0+:PTRV_W]; 159 assign rptr_value = fifo_rptr_q[0+:PTRV_W]; 160 assign rdepth_o = (full_rclk) ? DepthW'(Depth) : 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 1/1 assign rdepth_o = full_rclk; Tests: T1 T2 T3  167 1/1 assign wdepth_o = full_wclk; Tests: T1 T2 T3  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 if (fifo_incr_wptr) begin 183 storage[fifo_wptr_q[PTRV_W-1:0]] <= wdata_i; 184 end 185 end 186 187 assign rdata_int = storage[fifo_rptr_q[PTRV_W-1:0]]; 188 189 end else begin : g_storage_simple 190 191 always_ff @(posedge clk_wr_i) begin 192 1/1 if (fifo_incr_wptr) begin Tests: T1 T2 T3  193 1/1 storage[0] <= wdata_i; Tests: T1 T2 T3  194 end MISSING_ELSE 195 end 196 197 1/1 assign rdata_int = storage[0]; Tests: T1 T2 T3  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 assign rdata_o = empty_rclk ? '0 : rdata_int; 208 end 209 end else begin : gen_no_output_zero 210 if (OutputZeroIfInvalid == 1'b1) begin : gen_invalid_zero 211 1/1 assign rdata_o = rvalid_o ? rdata_int : '0; Tests: T1 T2 T3  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 assign fifo_rptr_sync_combi = {fifo_rptr_gray_sync[PTR_WIDTH-1], ^fifo_rptr_gray_sync}; 277 assign fifo_wptr_sync_combi = {fifo_wptr_gray_sync[PTR_WIDTH-1], ^fifo_wptr_gray_sync}; 278 279 assign fifo_rptr_gray_d = {fifo_rptr_d[PTR_WIDTH-1], ^fifo_rptr_d}; 280 assign fifo_wptr_gray_d = {fifo_wptr_d[PTR_WIDTH-1], ^fifo_wptr_d}; 281 282 end else begin : g_no_gray_conversion 283 284 1/1 assign fifo_rptr_sync_combi = fifo_rptr_gray_sync; Tests: T1 T2 T3  285 1/1 assign fifo_wptr_sync_combi = fifo_wptr_gray_sync; Tests: T1 T2 T3  286 287 1/1 assign fifo_rptr_gray_d = fifo_rptr_d; Tests: T1 T2 T3  288 1/1 assign fifo_wptr_gray_d = fifo_wptr_d; Tests: T1 T2 T3 

Cond Coverage for Instance : tb.dut.u_asf_39.reqfifo
TotalCoveredPercent
Conditions1414100.00
Logical1414100.00
Non-Logical00
Event00

 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT3,T7,T8
11CoveredT1,T2,T3

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

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

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

 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

Branch Coverage for Instance : tb.dut.u_asf_39.reqfifo
Line No.TotalCoveredPercent
Branches 18 18 100.00
TERNARY 211 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 192 2 2 100.00


211 assign rdata_o = rvalid_o ? rdata_int : '0; -1- ==> ==>

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


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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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


192 if (fifo_incr_wptr) begin -1- 193 storage[0] <= wdata_i; ==> 194 end MISSING_ELSE ==>

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


Assert Coverage for Instance : tb.dut.u_asf_39.reqfifo
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 553452712 553329281 0 0
GrayWptr_A 415890009 415770294 0 0
ParamCheckDepth_A 900 900 0 0


GrayRptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 553452712 553329281 0 0
T1 587 568 0 0
T2 3668 3617 0 0
T3 22645 22603 0 0
T7 4270 4239 0 0
T8 73189 73101 0 0
T9 14287 14235 0 0
T10 2722 2634 0 0
T11 21715 21681 0 0
T12 5893 5856 0 0
T13 135408 135367 0 0

GrayWptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 415890009 415770294 0 0
T1 2713 2626 0 0
T2 2232 2201 0 0
T3 46294 46209 0 0
T7 10531 10456 0 0
T8 26919 26886 0 0
T9 8831 8799 0 0
T10 2221 2149 0 0
T11 16085 16059 0 0
T12 8440 8386 0 0
T13 277109 277025 0 0

ParamCheckDepth_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 900 900 0 0
T1 1 1 0 0
T2 1 1 0 0
T3 1 1 0 0
T7 1 1 0 0
T8 1 1 0 0
T9 1 1 0 0
T10 1 1 0 0
T11 1 1 0 0
T12 1 1 0 0
T13 1 1 0 0

Line Coverage for Instance : tb.dut.u_asf_41.reqfifo
Line No.TotalCoveredPercent
TOTAL3838100.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_ASSIGN16611100.00
CONT_ASSIGN16711100.00
CONT_ASSIGN17111100.00
CONT_ASSIGN17211100.00
ALWAYS19222100.00
CONT_ASSIGN19711100.00
CONT_ASSIGN21111100.00
CONT_ASSIGN28411100.00
CONT_ASSIGN28511100.00
CONT_ASSIGN28711100.00
CONT_ASSIGN28811100.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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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: T1 T2 T3  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 assign wptr_msb = fifo_wptr_q[PTR_WIDTH-1]; 143 assign rptr_sync_msb = fifo_rptr_sync_q[PTR_WIDTH-1]; 144 assign wptr_value = fifo_wptr_q[0+:PTRV_W]; 145 assign rptr_sync_value = fifo_rptr_sync_q[0+:PTRV_W]; 146 assign wdepth_o = (full_wclk) ? DepthW'(Depth) : 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 assign wptr_sync_msb = fifo_wptr_sync_combi[PTR_WIDTH-1]; 157 assign rptr_msb = fifo_rptr_q[PTR_WIDTH-1]; 158 assign wptr_sync_value = fifo_wptr_sync_combi[0+:PTRV_W]; 159 assign rptr_value = fifo_rptr_q[0+:PTRV_W]; 160 assign rdepth_o = (full_rclk) ? DepthW'(Depth) : 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 1/1 assign rdepth_o = full_rclk; Tests: T1 T2 T3  167 1/1 assign wdepth_o = full_wclk; Tests: T1 T2 T3  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 if (fifo_incr_wptr) begin 183 storage[fifo_wptr_q[PTRV_W-1:0]] <= wdata_i; 184 end 185 end 186 187 assign rdata_int = storage[fifo_rptr_q[PTRV_W-1:0]]; 188 189 end else begin : g_storage_simple 190 191 always_ff @(posedge clk_wr_i) begin 192 1/1 if (fifo_incr_wptr) begin Tests: T1 T2 T3  193 1/1 storage[0] <= wdata_i; Tests: T1 T2 T3  194 end MISSING_ELSE 195 end 196 197 1/1 assign rdata_int = storage[0]; Tests: T1 T2 T3  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 assign rdata_o = empty_rclk ? '0 : rdata_int; 208 end 209 end else begin : gen_no_output_zero 210 if (OutputZeroIfInvalid == 1'b1) begin : gen_invalid_zero 211 1/1 assign rdata_o = rvalid_o ? rdata_int : '0; Tests: T1 T2 T3  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 assign fifo_rptr_sync_combi = {fifo_rptr_gray_sync[PTR_WIDTH-1], ^fifo_rptr_gray_sync}; 277 assign fifo_wptr_sync_combi = {fifo_wptr_gray_sync[PTR_WIDTH-1], ^fifo_wptr_gray_sync}; 278 279 assign fifo_rptr_gray_d = {fifo_rptr_d[PTR_WIDTH-1], ^fifo_rptr_d}; 280 assign fifo_wptr_gray_d = {fifo_wptr_d[PTR_WIDTH-1], ^fifo_wptr_d}; 281 282 end else begin : g_no_gray_conversion 283 284 1/1 assign fifo_rptr_sync_combi = fifo_rptr_gray_sync; Tests: T1 T2 T3  285 1/1 assign fifo_wptr_sync_combi = fifo_wptr_gray_sync; Tests: T1 T2 T3  286 287 1/1 assign fifo_rptr_gray_d = fifo_rptr_d; Tests: T1 T2 T3  288 1/1 assign fifo_wptr_gray_d = fifo_wptr_d; Tests: T1 T2 T3 

Cond Coverage for Instance : tb.dut.u_asf_41.reqfifo
TotalCoveredPercent
Conditions1414100.00
Logical1414100.00
Non-Logical00
Event00

 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT3,T7,T8
11CoveredT1,T2,T3

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

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

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

 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

Branch Coverage for Instance : tb.dut.u_asf_41.reqfifo
Line No.TotalCoveredPercent
Branches 18 18 100.00
TERNARY 211 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 192 2 2 100.00


211 assign rdata_o = rvalid_o ? rdata_int : '0; -1- ==> ==>

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


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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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 T1,T2,T3
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


192 if (fifo_incr_wptr) begin -1- 193 storage[0] <= wdata_i; ==> 194 end MISSING_ELSE ==>

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


Assert Coverage for Instance : tb.dut.u_asf_41.reqfifo
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 612441333 612316452 0 0
GrayWptr_A 415890009 415770294 0 0
ParamCheckDepth_A 900 900 0 0


GrayRptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 612441333 612316452 0 0
T1 2152 2084 0 0
T2 4625 4561 0 0
T3 22645 22603 0 0
T7 10675 10599 0 0
T8 81602 81504 0 0
T9 5715 5694 0 0
T10 1877 1816 0 0
T11 39812 39749 0 0
T12 3884 3859 0 0
T13 132258 132217 0 0

GrayWptr_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 415890009 415770294 0 0
T1 2713 2626 0 0
T2 2232 2201 0 0
T3 46294 46209 0 0
T7 10531 10456 0 0
T8 26919 26886 0 0
T9 8831 8799 0 0
T10 2221 2149 0 0
T11 16085 16059 0 0
T12 8440 8386 0 0
T13 277109 277025 0 0

ParamCheckDepth_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 900 900 0 0
T1 1 1 0 0
T2 1 1 0 0
T3 1 1 0 0
T7 1 1 0 0
T8 1 1 0 0
T9 1 1 0 0
T10 1 1 0 0
T11 1 1 0 0
T12 1 1 0 0
T13 1 1 0 0

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