Line Coverage for Module : 
prim_fifo_async
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 38 | 38 | 100.00 | 
| CONT_ASSIGN | 53 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 56 | 1 | 1 | 100.00 | 
| ALWAYS | 59 | 4 | 4 | 100.00 | 
| ALWAYS | 68 | 4 | 4 | 100.00 | 
| CONT_ASSIGN | 86 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 89 | 1 | 1 | 100.00 | 
| ALWAYS | 92 | 4 | 4 | 100.00 | 
| ALWAYS | 101 | 4 | 4 | 100.00 | 
| ALWAYS | 117 | 3 | 3 | 100.00 | 
| CONT_ASSIGN | 130 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 131 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 132 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 166 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 167 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 171 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 172 | 1 | 1 | 100.00 | 
| ALWAYS | 192 | 2 | 2 | 100.00 | 
| CONT_ASSIGN | 197 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 211 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 284 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 285 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 287 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 288 | 1 | 1 | 100.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 : 
 | Total | Covered | Percent | 
| Conditions | 14 | 14 | 100.00 | 
| Logical | 14 | 14 | 100.00 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T1,T2,T3 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T2,T7,T8 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       130
 EXPRESSION (fifo_wptr_q == (fifo_rptr_sync_q ^ xor_mask))
            -----------------------1----------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       131
 EXPRESSION (fifo_wptr_sync_combi == (fifo_rptr_q ^ xor_mask))
            -------------------------1------------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       132
 EXPRESSION (fifo_wptr_sync_combi == fifo_rptr_q)
            ------------------1------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,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 : 
 | Total | Covered | Percent | 
| Conditions | 14 | 13 | 92.86 | 
| Logical | 14 | 13 | 92.86 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T1,T2,T3 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T2,T8,T11 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       130
 EXPRESSION (fifo_wptr_q == (fifo_rptr_sync_q ^ xor_mask))
            -----------------------1----------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       131
 EXPRESSION (fifo_wptr_sync_combi == (fifo_rptr_q ^ xor_mask))
            -------------------------1------------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       132
 EXPRESSION (fifo_wptr_sync_combi == fifo_rptr_q)
            ------------------1------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
Branch Coverage for Module : 
prim_fifo_async
 | Line No. | Total | Covered | Percent | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 1 | 
Covered | 
T1,T2,T3 | 
| 0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Module : 
prim_fifo_async
Assertion Details
GrayRptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
2147483647 | 
2147483647 | 
0 | 
0 | 
| T1 | 
23509 | 
23214 | 
0 | 
0 | 
| T2 | 
124896 | 
124729 | 
0 | 
0 | 
| T3 | 
18174 | 
17889 | 
0 | 
0 | 
| T7 | 
1454771 | 
1454376 | 
0 | 
0 | 
| T8 | 
509072 | 
508858 | 
0 | 
0 | 
| T9 | 
19168 | 
18717 | 
0 | 
0 | 
| T10 | 
17798 | 
17310 | 
0 | 
0 | 
| T11 | 
345382 | 
344908 | 
0 | 
0 | 
| T12 | 
3940706 | 
3940335 | 
0 | 
0 | 
| T13 | 
77229 | 
76983 | 
0 | 
0 | 
GrayWptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
2147483647 | 
2147483647 | 
0 | 
0 | 
| T1 | 
23509 | 
23214 | 
0 | 
0 | 
| T2 | 
124896 | 
124729 | 
0 | 
0 | 
| T3 | 
18174 | 
17889 | 
0 | 
0 | 
| T7 | 
1454771 | 
1454376 | 
0 | 
0 | 
| T8 | 
509072 | 
508858 | 
0 | 
0 | 
| T9 | 
19168 | 
18717 | 
0 | 
0 | 
| T10 | 
17798 | 
17310 | 
0 | 
0 | 
| T11 | 
345382 | 
344908 | 
0 | 
0 | 
| T12 | 
3940706 | 
3940335 | 
0 | 
0 | 
| T13 | 
77229 | 
76983 | 
0 | 
0 | 
ParamCheckDepth_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| 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. | Total | Covered | Percent | 
| TOTAL |  | 38 | 38 | 100.00 | 
| CONT_ASSIGN | 53 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 56 | 1 | 1 | 100.00 | 
| ALWAYS | 59 | 4 | 4 | 100.00 | 
| ALWAYS | 68 | 4 | 4 | 100.00 | 
| CONT_ASSIGN | 86 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 89 | 1 | 1 | 100.00 | 
| ALWAYS | 92 | 4 | 4 | 100.00 | 
| ALWAYS | 101 | 4 | 4 | 100.00 | 
| ALWAYS | 117 | 3 | 3 | 100.00 | 
| CONT_ASSIGN | 130 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 131 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 132 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 166 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 167 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 171 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 172 | 1 | 1 | 100.00 | 
| ALWAYS | 192 | 2 | 2 | 100.00 | 
| CONT_ASSIGN | 197 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 211 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 284 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 285 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 287 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 288 | 1 | 1 | 100.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
 | Total | Covered | Percent | 
| Conditions | 14 | 13 | 92.86 | 
| Logical | 14 | 13 | 92.86 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T1,T2,T3 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T2,T8,T11 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       130
 EXPRESSION (fifo_wptr_q == (fifo_rptr_sync_q ^ xor_mask))
            -----------------------1----------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       131
 EXPRESSION (fifo_wptr_sync_combi == (fifo_rptr_q ^ xor_mask))
            -------------------------1------------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       132
 EXPRESSION (fifo_wptr_sync_combi == fifo_rptr_q)
            ------------------1------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
Branch Coverage for Instance : tb.dut.u_asf_35.rspfifo
 | Line No. | Total | Covered | Percent | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 1 | 
Covered | 
T1,T2,T3 | 
| 0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.u_asf_35.rspfifo
Assertion Details
GrayRptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
418665934 | 
418551948 | 
0 | 
0 | 
| T1 | 
1452 | 
1434 | 
0 | 
0 | 
| T2 | 
8613 | 
8601 | 
0 | 
0 | 
| T3 | 
2619 | 
2578 | 
0 | 
0 | 
| T7 | 
227307 | 
227245 | 
0 | 
0 | 
| T8 | 
65990 | 
65962 | 
0 | 
0 | 
| T9 | 
1997 | 
1950 | 
0 | 
0 | 
| T10 | 
2363 | 
2298 | 
0 | 
0 | 
| T11 | 
46364 | 
46300 | 
0 | 
0 | 
| T12 | 
445326 | 
445284 | 
0 | 
0 | 
| T13 | 
8522 | 
8495 | 
0 | 
0 | 
GrayWptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
540272002 | 
540153256 | 
0 | 
0 | 
| T1 | 
6223 | 
6145 | 
0 | 
0 | 
| T2 | 
37900 | 
37851 | 
0 | 
0 | 
| T3 | 
1329 | 
1308 | 
0 | 
0 | 
| T7 | 
197762 | 
197709 | 
0 | 
0 | 
| T8 | 
26710 | 
26699 | 
0 | 
0 | 
| T9 | 
3018 | 
2947 | 
0 | 
0 | 
| T10 | 
2016 | 
1961 | 
0 | 
0 | 
| T11 | 
32926 | 
32881 | 
0 | 
0 | 
| T12 | 
596550 | 
596494 | 
0 | 
0 | 
| T13 | 
1953 | 
1946 | 
0 | 
0 | 
ParamCheckDepth_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| 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. | Total | Covered | Percent | 
| TOTAL |  | 38 | 38 | 100.00 | 
| CONT_ASSIGN | 53 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 56 | 1 | 1 | 100.00 | 
| ALWAYS | 59 | 4 | 4 | 100.00 | 
| ALWAYS | 68 | 4 | 4 | 100.00 | 
| CONT_ASSIGN | 86 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 89 | 1 | 1 | 100.00 | 
| ALWAYS | 92 | 4 | 4 | 100.00 | 
| ALWAYS | 101 | 4 | 4 | 100.00 | 
| ALWAYS | 117 | 3 | 3 | 100.00 | 
| CONT_ASSIGN | 130 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 131 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 132 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 166 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 167 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 171 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 172 | 1 | 1 | 100.00 | 
| ALWAYS | 192 | 2 | 2 | 100.00 | 
| CONT_ASSIGN | 197 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 211 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 284 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 285 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 287 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 288 | 1 | 1 | 100.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
 | Total | Covered | Percent | 
| Conditions | 14 | 13 | 92.86 | 
| Logical | 14 | 13 | 92.86 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T1,T2,T3 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T2,T8,T11 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       130
 EXPRESSION (fifo_wptr_q == (fifo_rptr_sync_q ^ xor_mask))
            -----------------------1----------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       131
 EXPRESSION (fifo_wptr_sync_combi == (fifo_rptr_q ^ xor_mask))
            -------------------------1------------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       132
 EXPRESSION (fifo_wptr_sync_combi == fifo_rptr_q)
            ------------------1------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
Branch Coverage for Instance : tb.dut.u_asf_37.rspfifo
 | Line No. | Total | Covered | Percent | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 1 | 
Covered | 
T1,T2,T3 | 
| 0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.u_asf_37.rspfifo
Assertion Details
GrayRptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
418665934 | 
418551948 | 
0 | 
0 | 
| T1 | 
1452 | 
1434 | 
0 | 
0 | 
| T2 | 
8613 | 
8601 | 
0 | 
0 | 
| T3 | 
2619 | 
2578 | 
0 | 
0 | 
| T7 | 
227307 | 
227245 | 
0 | 
0 | 
| T8 | 
65990 | 
65962 | 
0 | 
0 | 
| T9 | 
1997 | 
1950 | 
0 | 
0 | 
| T10 | 
2363 | 
2298 | 
0 | 
0 | 
| T11 | 
46364 | 
46300 | 
0 | 
0 | 
| T12 | 
445326 | 
445284 | 
0 | 
0 | 
| T13 | 
8522 | 
8495 | 
0 | 
0 | 
GrayWptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
499260230 | 
499145229 | 
0 | 
0 | 
| T1 | 
1106 | 
1091 | 
0 | 
0 | 
| T2 | 
22827 | 
22797 | 
0 | 
0 | 
| T3 | 
2657 | 
2615 | 
0 | 
0 | 
| T7 | 
175027 | 
174980 | 
0 | 
0 | 
| T8 | 
119414 | 
119364 | 
0 | 
0 | 
| T9 | 
2083 | 
2034 | 
0 | 
0 | 
| T10 | 
1732 | 
1685 | 
0 | 
0 | 
| T11 | 
51741 | 
51670 | 
0 | 
0 | 
| T12 | 
411722 | 
411683 | 
0 | 
0 | 
| T13 | 
8344 | 
8317 | 
0 | 
0 | 
ParamCheckDepth_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| 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. | Total | Covered | Percent | 
| TOTAL |  | 38 | 38 | 100.00 | 
| CONT_ASSIGN | 53 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 56 | 1 | 1 | 100.00 | 
| ALWAYS | 59 | 4 | 4 | 100.00 | 
| ALWAYS | 68 | 4 | 4 | 100.00 | 
| CONT_ASSIGN | 86 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 89 | 1 | 1 | 100.00 | 
| ALWAYS | 92 | 4 | 4 | 100.00 | 
| ALWAYS | 101 | 4 | 4 | 100.00 | 
| ALWAYS | 117 | 3 | 3 | 100.00 | 
| CONT_ASSIGN | 130 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 131 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 132 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 166 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 167 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 171 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 172 | 1 | 1 | 100.00 | 
| ALWAYS | 192 | 2 | 2 | 100.00 | 
| CONT_ASSIGN | 197 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 211 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 284 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 285 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 287 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 288 | 1 | 1 | 100.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
 | Total | Covered | Percent | 
| Conditions | 14 | 13 | 92.86 | 
| Logical | 14 | 13 | 92.86 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T1,T2,T3 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T2,T8,T11 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       130
 EXPRESSION (fifo_wptr_q == (fifo_rptr_sync_q ^ xor_mask))
            -----------------------1----------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       131
 EXPRESSION (fifo_wptr_sync_combi == (fifo_rptr_q ^ xor_mask))
            -------------------------1------------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       132
 EXPRESSION (fifo_wptr_sync_combi == fifo_rptr_q)
            ------------------1------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
Branch Coverage for Instance : tb.dut.u_asf_39.rspfifo
 | Line No. | Total | Covered | Percent | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 1 | 
Covered | 
T1,T2,T3 | 
| 0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.u_asf_39.rspfifo
Assertion Details
GrayRptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
418665934 | 
418551948 | 
0 | 
0 | 
| T1 | 
1452 | 
1434 | 
0 | 
0 | 
| T2 | 
8613 | 
8601 | 
0 | 
0 | 
| T3 | 
2619 | 
2578 | 
0 | 
0 | 
| T7 | 
227307 | 
227245 | 
0 | 
0 | 
| T8 | 
65990 | 
65962 | 
0 | 
0 | 
| T9 | 
1997 | 
1950 | 
0 | 
0 | 
| T10 | 
2363 | 
2298 | 
0 | 
0 | 
| T11 | 
46364 | 
46300 | 
0 | 
0 | 
| T12 | 
445326 | 
445284 | 
0 | 
0 | 
| T13 | 
8522 | 
8495 | 
0 | 
0 | 
GrayWptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
538802035 | 
538689615 | 
0 | 
0 | 
| T1 | 
5186 | 
5121 | 
0 | 
0 | 
| T2 | 
14213 | 
14194 | 
0 | 
0 | 
| T3 | 
1211 | 
1192 | 
0 | 
0 | 
| T7 | 
61373 | 
61356 | 
0 | 
0 | 
| T8 | 
54994 | 
54971 | 
0 | 
0 | 
| T9 | 
3826 | 
3736 | 
0 | 
0 | 
| T10 | 
1480 | 
1439 | 
0 | 
0 | 
| T11 | 
32926 | 
32881 | 
0 | 
0 | 
| T12 | 
453719 | 
453676 | 
0 | 
0 | 
| T13 | 
17043 | 
16989 | 
0 | 
0 | 
ParamCheckDepth_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| 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. | Total | Covered | Percent | 
| TOTAL |  | 38 | 38 | 100.00 | 
| CONT_ASSIGN | 53 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 56 | 1 | 1 | 100.00 | 
| ALWAYS | 59 | 4 | 4 | 100.00 | 
| ALWAYS | 68 | 4 | 4 | 100.00 | 
| CONT_ASSIGN | 86 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 89 | 1 | 1 | 100.00 | 
| ALWAYS | 92 | 4 | 4 | 100.00 | 
| ALWAYS | 101 | 4 | 4 | 100.00 | 
| ALWAYS | 117 | 3 | 3 | 100.00 | 
| CONT_ASSIGN | 130 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 131 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 132 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 166 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 167 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 171 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 172 | 1 | 1 | 100.00 | 
| ALWAYS | 192 | 2 | 2 | 100.00 | 
| CONT_ASSIGN | 197 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 211 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 284 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 285 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 287 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 288 | 1 | 1 | 100.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
 | Total | Covered | Percent | 
| Conditions | 14 | 13 | 92.86 | 
| Logical | 14 | 13 | 92.86 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T1,T2,T3 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T2,T8,T11 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       130
 EXPRESSION (fifo_wptr_q == (fifo_rptr_sync_q ^ xor_mask))
            -----------------------1----------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       131
 EXPRESSION (fifo_wptr_sync_combi == (fifo_rptr_q ^ xor_mask))
            -------------------------1------------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       132
 EXPRESSION (fifo_wptr_sync_combi == fifo_rptr_q)
            ------------------1------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
Branch Coverage for Instance : tb.dut.u_asf_41.rspfifo
 | Line No. | Total | Covered | Percent | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 1 | 
Covered | 
T1,T2,T3 | 
| 0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.u_asf_41.rspfifo
Assertion Details
GrayRptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
418665934 | 
418551948 | 
0 | 
0 | 
| T1 | 
1452 | 
1434 | 
0 | 
0 | 
| T2 | 
8613 | 
8601 | 
0 | 
0 | 
| T3 | 
2619 | 
2578 | 
0 | 
0 | 
| T7 | 
227307 | 
227245 | 
0 | 
0 | 
| T8 | 
65990 | 
65962 | 
0 | 
0 | 
| T9 | 
1997 | 
1950 | 
0 | 
0 | 
| T10 | 
2363 | 
2298 | 
0 | 
0 | 
| T11 | 
46364 | 
46300 | 
0 | 
0 | 
| T12 | 
445326 | 
445284 | 
0 | 
0 | 
| T13 | 
8522 | 
8495 | 
0 | 
0 | 
GrayWptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
505687038 | 
505567105 | 
0 | 
0 | 
| T1 | 
5186 | 
5121 | 
0 | 
0 | 
| T2 | 
15504 | 
15483 | 
0 | 
0 | 
| T3 | 
2501 | 
2462 | 
0 | 
0 | 
| T7 | 
111381 | 
111351 | 
0 | 
0 | 
| T8 | 
43994 | 
43976 | 
0 | 
0 | 
| T9 | 
2253 | 
2200 | 
0 | 
0 | 
| T10 | 
3118 | 
3033 | 
0 | 
0 | 
| T11 | 
42333 | 
42276 | 
0 | 
0 | 
| T12 | 
697411 | 
697346 | 
0 | 
0 | 
| T13 | 
15801 | 
15751 | 
0 | 
0 | 
ParamCheckDepth_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| 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. | Total | Covered | Percent | 
| TOTAL |  | 38 | 38 | 100.00 | 
| CONT_ASSIGN | 53 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 56 | 1 | 1 | 100.00 | 
| ALWAYS | 59 | 4 | 4 | 100.00 | 
| ALWAYS | 68 | 4 | 4 | 100.00 | 
| CONT_ASSIGN | 86 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 89 | 1 | 1 | 100.00 | 
| ALWAYS | 92 | 4 | 4 | 100.00 | 
| ALWAYS | 101 | 4 | 4 | 100.00 | 
| ALWAYS | 117 | 3 | 3 | 100.00 | 
| CONT_ASSIGN | 130 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 131 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 132 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 166 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 167 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 171 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 172 | 1 | 1 | 100.00 | 
| ALWAYS | 192 | 2 | 2 | 100.00 | 
| CONT_ASSIGN | 197 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 211 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 284 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 285 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 287 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 288 | 1 | 1 | 100.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
 | Total | Covered | Percent | 
| Conditions | 14 | 14 | 100.00 | 
| Logical | 14 | 14 | 100.00 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T1,T2,T3 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T2,T7,T8 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       130
 EXPRESSION (fifo_wptr_q == (fifo_rptr_sync_q ^ xor_mask))
            -----------------------1----------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       131
 EXPRESSION (fifo_wptr_sync_combi == (fifo_rptr_q ^ xor_mask))
            -------------------------1------------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       132
 EXPRESSION (fifo_wptr_sync_combi == fifo_rptr_q)
            ------------------1------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
Branch Coverage for Instance : tb.dut.u_asf_35.reqfifo
 | Line No. | Total | Covered | Percent | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 1 | 
Covered | 
T1,T2,T3 | 
| 0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.u_asf_35.reqfifo
Assertion Details
GrayRptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
540272002 | 
540153256 | 
0 | 
0 | 
| T1 | 
6223 | 
6145 | 
0 | 
0 | 
| T2 | 
37900 | 
37851 | 
0 | 
0 | 
| T3 | 
1329 | 
1308 | 
0 | 
0 | 
| T7 | 
197762 | 
197709 | 
0 | 
0 | 
| T8 | 
26710 | 
26699 | 
0 | 
0 | 
| T9 | 
3018 | 
2947 | 
0 | 
0 | 
| T10 | 
2016 | 
1961 | 
0 | 
0 | 
| T11 | 
32926 | 
32881 | 
0 | 
0 | 
| T12 | 
596550 | 
596494 | 
0 | 
0 | 
| T13 | 
1953 | 
1946 | 
0 | 
0 | 
GrayWptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
418665934 | 
418551948 | 
0 | 
0 | 
| T1 | 
1452 | 
1434 | 
0 | 
0 | 
| T2 | 
8613 | 
8601 | 
0 | 
0 | 
| T3 | 
2619 | 
2578 | 
0 | 
0 | 
| T7 | 
227307 | 
227245 | 
0 | 
0 | 
| T8 | 
65990 | 
65962 | 
0 | 
0 | 
| T9 | 
1997 | 
1950 | 
0 | 
0 | 
| T10 | 
2363 | 
2298 | 
0 | 
0 | 
| T11 | 
46364 | 
46300 | 
0 | 
0 | 
| T12 | 
445326 | 
445284 | 
0 | 
0 | 
| T13 | 
8522 | 
8495 | 
0 | 
0 | 
ParamCheckDepth_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| 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. | Total | Covered | Percent | 
| TOTAL |  | 38 | 38 | 100.00 | 
| CONT_ASSIGN | 53 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 56 | 1 | 1 | 100.00 | 
| ALWAYS | 59 | 4 | 4 | 100.00 | 
| ALWAYS | 68 | 4 | 4 | 100.00 | 
| CONT_ASSIGN | 86 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 89 | 1 | 1 | 100.00 | 
| ALWAYS | 92 | 4 | 4 | 100.00 | 
| ALWAYS | 101 | 4 | 4 | 100.00 | 
| ALWAYS | 117 | 3 | 3 | 100.00 | 
| CONT_ASSIGN | 130 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 131 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 132 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 166 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 167 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 171 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 172 | 1 | 1 | 100.00 | 
| ALWAYS | 192 | 2 | 2 | 100.00 | 
| CONT_ASSIGN | 197 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 211 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 284 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 285 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 287 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 288 | 1 | 1 | 100.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
 | Total | Covered | Percent | 
| Conditions | 14 | 14 | 100.00 | 
| Logical | 14 | 14 | 100.00 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T1,T2,T3 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T2,T7,T8 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       130
 EXPRESSION (fifo_wptr_q == (fifo_rptr_sync_q ^ xor_mask))
            -----------------------1----------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       131
 EXPRESSION (fifo_wptr_sync_combi == (fifo_rptr_q ^ xor_mask))
            -------------------------1------------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       132
 EXPRESSION (fifo_wptr_sync_combi == fifo_rptr_q)
            ------------------1------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
Branch Coverage for Instance : tb.dut.u_asf_37.reqfifo
 | Line No. | Total | Covered | Percent | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 1 | 
Covered | 
T1,T2,T3 | 
| 0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.u_asf_37.reqfifo
Assertion Details
GrayRptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
499260230 | 
499145229 | 
0 | 
0 | 
| T1 | 
1106 | 
1091 | 
0 | 
0 | 
| T2 | 
22827 | 
22797 | 
0 | 
0 | 
| T3 | 
2657 | 
2615 | 
0 | 
0 | 
| T7 | 
175027 | 
174980 | 
0 | 
0 | 
| T8 | 
119414 | 
119364 | 
0 | 
0 | 
| T9 | 
2083 | 
2034 | 
0 | 
0 | 
| T10 | 
1732 | 
1685 | 
0 | 
0 | 
| T11 | 
51741 | 
51670 | 
0 | 
0 | 
| T12 | 
411722 | 
411683 | 
0 | 
0 | 
| T13 | 
8344 | 
8317 | 
0 | 
0 | 
GrayWptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
418665934 | 
418551948 | 
0 | 
0 | 
| T1 | 
1452 | 
1434 | 
0 | 
0 | 
| T2 | 
8613 | 
8601 | 
0 | 
0 | 
| T3 | 
2619 | 
2578 | 
0 | 
0 | 
| T7 | 
227307 | 
227245 | 
0 | 
0 | 
| T8 | 
65990 | 
65962 | 
0 | 
0 | 
| T9 | 
1997 | 
1950 | 
0 | 
0 | 
| T10 | 
2363 | 
2298 | 
0 | 
0 | 
| T11 | 
46364 | 
46300 | 
0 | 
0 | 
| T12 | 
445326 | 
445284 | 
0 | 
0 | 
| T13 | 
8522 | 
8495 | 
0 | 
0 | 
ParamCheckDepth_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| 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. | Total | Covered | Percent | 
| TOTAL |  | 38 | 38 | 100.00 | 
| CONT_ASSIGN | 53 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 56 | 1 | 1 | 100.00 | 
| ALWAYS | 59 | 4 | 4 | 100.00 | 
| ALWAYS | 68 | 4 | 4 | 100.00 | 
| CONT_ASSIGN | 86 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 89 | 1 | 1 | 100.00 | 
| ALWAYS | 92 | 4 | 4 | 100.00 | 
| ALWAYS | 101 | 4 | 4 | 100.00 | 
| ALWAYS | 117 | 3 | 3 | 100.00 | 
| CONT_ASSIGN | 130 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 131 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 132 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 166 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 167 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 171 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 172 | 1 | 1 | 100.00 | 
| ALWAYS | 192 | 2 | 2 | 100.00 | 
| CONT_ASSIGN | 197 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 211 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 284 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 285 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 287 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 288 | 1 | 1 | 100.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
 | Total | Covered | Percent | 
| Conditions | 14 | 14 | 100.00 | 
| Logical | 14 | 14 | 100.00 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T1,T2,T3 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T2,T7,T8 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       130
 EXPRESSION (fifo_wptr_q == (fifo_rptr_sync_q ^ xor_mask))
            -----------------------1----------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       131
 EXPRESSION (fifo_wptr_sync_combi == (fifo_rptr_q ^ xor_mask))
            -------------------------1------------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       132
 EXPRESSION (fifo_wptr_sync_combi == fifo_rptr_q)
            ------------------1------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
Branch Coverage for Instance : tb.dut.u_asf_39.reqfifo
 | Line No. | Total | Covered | Percent | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 1 | 
Covered | 
T1,T2,T3 | 
| 0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.u_asf_39.reqfifo
Assertion Details
GrayRptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
538802035 | 
538689615 | 
0 | 
0 | 
| T1 | 
5186 | 
5121 | 
0 | 
0 | 
| T2 | 
14213 | 
14194 | 
0 | 
0 | 
| T3 | 
1211 | 
1192 | 
0 | 
0 | 
| T7 | 
61373 | 
61356 | 
0 | 
0 | 
| T8 | 
54994 | 
54971 | 
0 | 
0 | 
| T9 | 
3826 | 
3736 | 
0 | 
0 | 
| T10 | 
1480 | 
1439 | 
0 | 
0 | 
| T11 | 
32926 | 
32881 | 
0 | 
0 | 
| T12 | 
453719 | 
453676 | 
0 | 
0 | 
| T13 | 
17043 | 
16989 | 
0 | 
0 | 
GrayWptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
418665934 | 
418551948 | 
0 | 
0 | 
| T1 | 
1452 | 
1434 | 
0 | 
0 | 
| T2 | 
8613 | 
8601 | 
0 | 
0 | 
| T3 | 
2619 | 
2578 | 
0 | 
0 | 
| T7 | 
227307 | 
227245 | 
0 | 
0 | 
| T8 | 
65990 | 
65962 | 
0 | 
0 | 
| T9 | 
1997 | 
1950 | 
0 | 
0 | 
| T10 | 
2363 | 
2298 | 
0 | 
0 | 
| T11 | 
46364 | 
46300 | 
0 | 
0 | 
| T12 | 
445326 | 
445284 | 
0 | 
0 | 
| T13 | 
8522 | 
8495 | 
0 | 
0 | 
ParamCheckDepth_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| 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. | Total | Covered | Percent | 
| TOTAL |  | 38 | 38 | 100.00 | 
| CONT_ASSIGN | 53 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 56 | 1 | 1 | 100.00 | 
| ALWAYS | 59 | 4 | 4 | 100.00 | 
| ALWAYS | 68 | 4 | 4 | 100.00 | 
| CONT_ASSIGN | 86 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 89 | 1 | 1 | 100.00 | 
| ALWAYS | 92 | 4 | 4 | 100.00 | 
| ALWAYS | 101 | 4 | 4 | 100.00 | 
| ALWAYS | 117 | 3 | 3 | 100.00 | 
| CONT_ASSIGN | 130 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 131 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 132 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 166 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 167 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 171 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 172 | 1 | 1 | 100.00 | 
| ALWAYS | 192 | 2 | 2 | 100.00 | 
| CONT_ASSIGN | 197 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 211 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 284 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 285 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 287 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 288 | 1 | 1 | 100.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
 | Total | Covered | Percent | 
| Conditions | 14 | 14 | 100.00 | 
| Logical | 14 | 14 | 100.00 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       53
 EXPRESSION (wvalid_i & wready_o)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T1,T2,T3 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       86
 EXPRESSION (rvalid_o & rready_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T2,T7,T8 | 
| 1 | 1 | Covered | T1,T2,T3 | 
 LINE       130
 EXPRESSION (fifo_wptr_q == (fifo_rptr_sync_q ^ xor_mask))
            -----------------------1----------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       131
 EXPRESSION (fifo_wptr_sync_combi == (fifo_rptr_q ^ xor_mask))
            -------------------------1------------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       132
 EXPRESSION (fifo_wptr_sync_combi == fifo_rptr_q)
            ------------------1------------------
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
 LINE       211
 EXPRESSION (rvalid_o ? rdata_int : '0)
             ----1---
| -1- | Status | Tests |                       
| 0 | Covered | T1,T2,T3 | 
| 1 | Covered | T1,T2,T3 | 
Branch Coverage for Instance : tb.dut.u_asf_41.reqfifo
 | Line No. | Total | Covered | Percent | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 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- | Status | Tests | 
| 1 | 
Covered | 
T1,T2,T3 | 
| 0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.u_asf_41.reqfifo
Assertion Details
GrayRptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
505687038 | 
505567105 | 
0 | 
0 | 
| T1 | 
5186 | 
5121 | 
0 | 
0 | 
| T2 | 
15504 | 
15483 | 
0 | 
0 | 
| T3 | 
2501 | 
2462 | 
0 | 
0 | 
| T7 | 
111381 | 
111351 | 
0 | 
0 | 
| T8 | 
43994 | 
43976 | 
0 | 
0 | 
| T9 | 
2253 | 
2200 | 
0 | 
0 | 
| T10 | 
3118 | 
3033 | 
0 | 
0 | 
| T11 | 
42333 | 
42276 | 
0 | 
0 | 
| T12 | 
697411 | 
697346 | 
0 | 
0 | 
| T13 | 
15801 | 
15751 | 
0 | 
0 | 
GrayWptr_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
418665934 | 
418551948 | 
0 | 
0 | 
| T1 | 
1452 | 
1434 | 
0 | 
0 | 
| T2 | 
8613 | 
8601 | 
0 | 
0 | 
| T3 | 
2619 | 
2578 | 
0 | 
0 | 
| T7 | 
227307 | 
227245 | 
0 | 
0 | 
| T8 | 
65990 | 
65962 | 
0 | 
0 | 
| T9 | 
1997 | 
1950 | 
0 | 
0 | 
| T10 | 
2363 | 
2298 | 
0 | 
0 | 
| T11 | 
46364 | 
46300 | 
0 | 
0 | 
| T12 | 
445326 | 
445284 | 
0 | 
0 | 
| T13 | 
8522 | 
8495 | 
0 | 
0 | 
ParamCheckDepth_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| 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 |