Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_0_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 22 | 100.00 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 156 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T6 T7 T71 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T6 T7 T71 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T6 T7 T71 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T6 T7 T71 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T6 T7 T71 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T6 T7 T71 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T6 T7 T71 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T6 T7 T71 
135        1/1                txn_bits_q <= '0;
           Tests:       T6 T7 T71 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        1/1            assign src_qs_o = src_q;
           Tests:       T6 T7 T71 
156        1/1            assign dst_wd_o = src_q;
           Tests:       T6 T7 T71 
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T6 T7 T71 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_0_cdc
 | Total | Covered | Percent | 
| Conditions | 13 | 12 | 92.31 | 
| Logical | 13 | 12 | 92.31 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T6,T7,T71 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T6,T7,T71 | 
| 1 | 1 | Covered | T6,T7,T71 | 
 LINE       123
 EXPRESSION (src_wd_i & BitMask)
             ----1---   ---2---
| -1- | -2- | Status | Tests |                       
| 0 | - | Covered | T6,T7,T71 | 
| 1 | - | Covered | T6,T7,T71 | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T6,T7,T71 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T6,T7,T71 | 
| 1 | 1 | Covered | T6,T7,T71 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_0_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T6,T7,T71 | 
| 0 | 
0 | 
1 | 
Covered | 
T6,T7,T71 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T6,T7,T71 | 
| 0 | 
0 | 
1 | 
Covered | 
T6,T7,T71 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_0_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
86822 | 
0 | 
0 | 
| T6 | 
45621 | 
774 | 
0 | 
0 | 
| T7 | 
36819 | 
2276 | 
0 | 
0 | 
| T9 | 
42910 | 
0 | 
0 | 
0 | 
| T11 | 
26700 | 
0 | 
0 | 
0 | 
| T25 | 
48316 | 
0 | 
0 | 
0 | 
| T30 | 
53048 | 
0 | 
0 | 
0 | 
| T32 | 
26153 | 
0 | 
0 | 
0 | 
| T46 | 
64785 | 
0 | 
0 | 
0 | 
| T70 | 
0 | 
378 | 
0 | 
0 | 
| T71 | 
0 | 
756 | 
0 | 
0 | 
| T78 | 
0 | 
764 | 
0 | 
0 | 
| T79 | 
0 | 
1953 | 
0 | 
0 | 
| T80 | 
0 | 
2052 | 
0 | 
0 | 
| T118 | 
22471 | 
0 | 
0 | 
0 | 
| T119 | 
20821 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
678 | 
0 | 
0 | 
| T407 | 
0 | 
746 | 
0 | 
0 | 
| T427 | 
0 | 
729 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
216 | 
0 | 
0 | 
| T6 | 
45621 | 
2 | 
0 | 
0 | 
| T7 | 
36819 | 
4 | 
0 | 
0 | 
| T9 | 
42910 | 
0 | 
0 | 
0 | 
| T11 | 
26700 | 
0 | 
0 | 
0 | 
| T25 | 
48316 | 
0 | 
0 | 
0 | 
| T30 | 
53048 | 
0 | 
0 | 
0 | 
| T32 | 
26153 | 
0 | 
0 | 
0 | 
| T46 | 
64785 | 
0 | 
0 | 
0 | 
| T70 | 
0 | 
1 | 
0 | 
0 | 
| T71 | 
0 | 
2 | 
0 | 
0 | 
| T78 | 
0 | 
2 | 
0 | 
0 | 
| T79 | 
0 | 
4 | 
0 | 
0 | 
| T80 | 
0 | 
5 | 
0 | 
0 | 
| T118 | 
22471 | 
0 | 
0 | 
0 | 
| T119 | 
20821 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
2 | 
0 | 
0 | 
| T407 | 
0 | 
2 | 
0 | 
0 | 
| T427 | 
0 | 
2 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 | 
 
Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_1_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 20 | 90.91 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 0 | 0.00 | 
| CONT_ASSIGN | 156 | 1 | 0 | 0.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T70 T91 T92 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T70 T169 T174 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T70 T169 T174 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T70 T169 T174 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T70 T169 T174 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T70 T169 T174 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T70 T169 T174 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T70 T169 T174 
135        1/1                txn_bits_q <= '0;
           Tests:       T70 T169 T174 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        0/1     ==>    assign src_qs_o = src_q;
156        0/1     ==>    assign dst_wd_o = src_q;
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T70 T169 T174 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_1_cdc
 | Total | Covered | Percent | 
| Conditions | 13 | 11 | 84.62 | 
| Logical | 13 | 11 | 84.62 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       123
 EXPRESSION (src_wd_i & BitMask)
             ----1---   ---2---
| -1- | -2- | Status | Tests |                       
| 0 | - | Covered | T70,T169,T174 | 
| 1 | - | Not Covered |  | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_1_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_1_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
94904 | 
0 | 
0 | 
| T70 | 
505616 | 
481 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
790 | 
0 | 
0 | 
| T407 | 
0 | 
819 | 
0 | 
0 | 
| T418 | 
0 | 
663 | 
0 | 
0 | 
| T427 | 
0 | 
654 | 
0 | 
0 | 
| T428 | 
0 | 
464 | 
0 | 
0 | 
| T429 | 
0 | 
789 | 
0 | 
0 | 
| T430 | 
0 | 
729 | 
0 | 
0 | 
| T431 | 
0 | 
383 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
411 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
236 | 
0 | 
0 | 
| T70 | 
505616 | 
1 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
2 | 
0 | 
0 | 
| T407 | 
0 | 
2 | 
0 | 
0 | 
| T418 | 
0 | 
2 | 
0 | 
0 | 
| T427 | 
0 | 
2 | 
0 | 
0 | 
| T428 | 
0 | 
1 | 
0 | 
0 | 
| T429 | 
0 | 
2 | 
0 | 
0 | 
| T430 | 
0 | 
2 | 
0 | 
0 | 
| T431 | 
0 | 
1 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
1 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 | 
 
Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_2_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 22 | 100.00 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 156 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T27 T70 T91 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T27 T70 T169 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T27 T70 T169 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T27 T70 T169 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T27 T70 T169 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T27 T70 T169 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T27 T70 T169 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T27 T70 T169 
135        1/1                txn_bits_q <= '0;
           Tests:       T27 T70 T169 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        1/1            assign src_qs_o = src_q;
           Tests:       T27 
156        1/1            assign dst_wd_o = src_q;
           Tests:       T27 
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T27 T70 T169 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_2_cdc
 | Total | Covered | Percent | 
| Conditions | 13 | 12 | 92.31 | 
| Logical | 13 | 12 | 92.31 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T27,T70,T169 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T27,T70,T169 | 
| 1 | 1 | Covered | T27,T70,T169 | 
 LINE       123
 EXPRESSION (src_wd_i & BitMask)
             ----1---   ---2---
| -1- | -2- | Status | Tests |                       
| 0 | - | Covered | T27,T70,T169 | 
| 1 | - | Covered | T27 | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T27,T70,T169 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T27,T70,T169 | 
| 1 | 1 | Covered | T27,T70,T169 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_2_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T27,T70,T169 | 
| 0 | 
0 | 
1 | 
Covered | 
T27,T70,T169 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T27,T70,T169 | 
| 0 | 
0 | 
1 | 
Covered | 
T27,T70,T169 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_2_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
100611 | 
0 | 
0 | 
| T27 | 
47682 | 
899 | 
0 | 
0 | 
| T49 | 
23276 | 
0 | 
0 | 
0 | 
| T53 | 
38582 | 
0 | 
0 | 
0 | 
| T70 | 
0 | 
442 | 
0 | 
0 | 
| T132 | 
58842 | 
0 | 
0 | 
0 | 
| T184 | 
546891 | 
0 | 
0 | 
0 | 
| T278 | 
373717 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
684 | 
0 | 
0 | 
| T407 | 
0 | 
652 | 
0 | 
0 | 
| T418 | 
0 | 
689 | 
0 | 
0 | 
| T427 | 
0 | 
757 | 
0 | 
0 | 
| T428 | 
0 | 
429 | 
0 | 
0 | 
| T429 | 
0 | 
743 | 
0 | 
0 | 
| T430 | 
0 | 
808 | 
0 | 
0 | 
| T431 | 
0 | 
426 | 
0 | 
0 | 
| T441 | 
307633 | 
0 | 
0 | 
0 | 
| T442 | 
67171 | 
0 | 
0 | 
0 | 
| T443 | 
393491 | 
0 | 
0 | 
0 | 
| T444 | 
307216 | 
0 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
254 | 
0 | 
0 | 
| T27 | 
47682 | 
2 | 
0 | 
0 | 
| T49 | 
23276 | 
0 | 
0 | 
0 | 
| T53 | 
38582 | 
0 | 
0 | 
0 | 
| T70 | 
0 | 
1 | 
0 | 
0 | 
| T132 | 
58842 | 
0 | 
0 | 
0 | 
| T184 | 
546891 | 
0 | 
0 | 
0 | 
| T278 | 
373717 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
2 | 
0 | 
0 | 
| T407 | 
0 | 
2 | 
0 | 
0 | 
| T418 | 
0 | 
2 | 
0 | 
0 | 
| T427 | 
0 | 
2 | 
0 | 
0 | 
| T428 | 
0 | 
1 | 
0 | 
0 | 
| T429 | 
0 | 
2 | 
0 | 
0 | 
| T430 | 
0 | 
2 | 
0 | 
0 | 
| T431 | 
0 | 
1 | 
0 | 
0 | 
| T441 | 
307633 | 
0 | 
0 | 
0 | 
| T442 | 
67171 | 
0 | 
0 | 
0 | 
| T443 | 
393491 | 
0 | 
0 | 
0 | 
| T444 | 
307216 | 
0 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 | 
 
Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_3_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 22 | 100.00 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 156 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T72 T70 T91 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T72 T70 T169 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T72 T70 T169 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T72 T70 T169 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T72 T70 T169 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T72 T70 T169 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T72 T70 T169 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T72 T70 T169 
135        1/1                txn_bits_q <= '0;
           Tests:       T72 T70 T169 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        1/1            assign src_qs_o = src_q;
           Tests:       T72 
156        1/1            assign dst_wd_o = src_q;
           Tests:       T72 
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T72 T70 T169 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_3_cdc
 | Total | Covered | Percent | 
| Conditions | 13 | 12 | 92.31 | 
| Logical | 13 | 12 | 92.31 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T72,T70,T169 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T72,T70,T169 | 
| 1 | 1 | Covered | T72,T70,T169 | 
 LINE       123
 EXPRESSION (src_wd_i & BitMask)
             ----1---   ---2---
| -1- | -2- | Status | Tests |                       
| 0 | - | Covered | T72,T70,T169 | 
| 1 | - | Covered | T72 | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T72,T70,T169 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T72,T70,T169 | 
| 1 | 1 | Covered | T72,T70,T169 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_3_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T72,T70,T169 | 
| 0 | 
0 | 
1 | 
Covered | 
T72,T70,T169 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T72,T70,T169 | 
| 0 | 
0 | 
1 | 
Covered | 
T72,T70,T169 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_3_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
88296 | 
0 | 
0 | 
| T21 | 
23719 | 
0 | 
0 | 
0 | 
| T70 | 
0 | 
372 | 
0 | 
0 | 
| T72 | 
24344 | 
1065 | 
0 | 
0 | 
| T78 | 
47309 | 
0 | 
0 | 
0 | 
| T96 | 
477586 | 
0 | 
0 | 
0 | 
| T135 | 
19735 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
786 | 
0 | 
0 | 
| T407 | 
0 | 
717 | 
0 | 
0 | 
| T418 | 
0 | 
777 | 
0 | 
0 | 
| T427 | 
0 | 
795 | 
0 | 
0 | 
| T428 | 
0 | 
386 | 
0 | 
0 | 
| T429 | 
0 | 
910 | 
0 | 
0 | 
| T430 | 
0 | 
754 | 
0 | 
0 | 
| T431 | 
0 | 
471 | 
0 | 
0 | 
| T445 | 
138581 | 
0 | 
0 | 
0 | 
| T446 | 
22078 | 
0 | 
0 | 
0 | 
| T447 | 
93100 | 
0 | 
0 | 
0 | 
| T448 | 
26631 | 
0 | 
0 | 
0 | 
| T449 | 
223873 | 
0 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
221 | 
0 | 
0 | 
| T21 | 
23719 | 
0 | 
0 | 
0 | 
| T70 | 
0 | 
1 | 
0 | 
0 | 
| T72 | 
24344 | 
2 | 
0 | 
0 | 
| T78 | 
47309 | 
0 | 
0 | 
0 | 
| T96 | 
477586 | 
0 | 
0 | 
0 | 
| T135 | 
19735 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
2 | 
0 | 
0 | 
| T407 | 
0 | 
2 | 
0 | 
0 | 
| T418 | 
0 | 
2 | 
0 | 
0 | 
| T427 | 
0 | 
2 | 
0 | 
0 | 
| T428 | 
0 | 
1 | 
0 | 
0 | 
| T429 | 
0 | 
2 | 
0 | 
0 | 
| T430 | 
0 | 
2 | 
0 | 
0 | 
| T431 | 
0 | 
1 | 
0 | 
0 | 
| T445 | 
138581 | 
0 | 
0 | 
0 | 
| T446 | 
22078 | 
0 | 
0 | 
0 | 
| T447 | 
93100 | 
0 | 
0 | 
0 | 
| T448 | 
26631 | 
0 | 
0 | 
0 | 
| T449 | 
223873 | 
0 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 | 
 
Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_4_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 20 | 90.91 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 0 | 0.00 | 
| CONT_ASSIGN | 156 | 1 | 0 | 0.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T70 T91 T92 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T70 T169 T174 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T70 T169 T174 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T70 T169 T174 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T70 T169 T174 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T70 T169 T174 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T70 T169 T174 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T70 T169 T174 
135        1/1                txn_bits_q <= '0;
           Tests:       T70 T169 T174 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        0/1     ==>    assign src_qs_o = src_q;
156        0/1     ==>    assign dst_wd_o = src_q;
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T70 T169 T174 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_4_cdc
 | Total | Covered | Percent | 
| Conditions | 13 | 11 | 84.62 | 
| Logical | 13 | 11 | 84.62 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       123
 EXPRESSION (src_wd_i & BitMask)
             ----1---   ---2---
| -1- | -2- | Status | Tests |                       
| 0 | - | Covered | T70,T169,T174 | 
| 1 | - | Not Covered |  | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_4_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_4_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
78603 | 
0 | 
0 | 
| T70 | 
505616 | 
429 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
799 | 
0 | 
0 | 
| T407 | 
0 | 
698 | 
0 | 
0 | 
| T418 | 
0 | 
787 | 
0 | 
0 | 
| T427 | 
0 | 
787 | 
0 | 
0 | 
| T428 | 
0 | 
411 | 
0 | 
0 | 
| T429 | 
0 | 
832 | 
0 | 
0 | 
| T430 | 
0 | 
698 | 
0 | 
0 | 
| T431 | 
0 | 
420 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
452 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
196 | 
0 | 
0 | 
| T70 | 
505616 | 
1 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
2 | 
0 | 
0 | 
| T407 | 
0 | 
2 | 
0 | 
0 | 
| T418 | 
0 | 
2 | 
0 | 
0 | 
| T427 | 
0 | 
2 | 
0 | 
0 | 
| T428 | 
0 | 
1 | 
0 | 
0 | 
| T429 | 
0 | 
2 | 
0 | 
0 | 
| T430 | 
0 | 
2 | 
0 | 
0 | 
| T431 | 
0 | 
1 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
1 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 | 
 
Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_5_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 22 | 100.00 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 156 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T25 T73 T74 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T25 T73 T74 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T25 T73 T74 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T25 T73 T74 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T25 T73 T74 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T25 T73 T74 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T25 T73 T74 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T25 T73 T74 
135        1/1                txn_bits_q <= '0;
           Tests:       T25 T73 T74 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        1/1            assign src_qs_o = src_q;
           Tests:       T25 T73 T74 
156        1/1            assign dst_wd_o = src_q;
           Tests:       T25 T73 T74 
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T25 T73 T74 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_5_cdc
 | Total | Covered | Percent | 
| Conditions | 13 | 12 | 92.31 | 
| Logical | 13 | 12 | 92.31 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T25,T73,T74 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T25,T73,T74 | 
| 1 | 1 | Covered | T25,T73,T74 | 
 LINE       123
 EXPRESSION (src_wd_i & BitMask)
             ----1---   ---2---
| -1- | -2- | Status | Tests |                       
| 0 | - | Covered | T25,T73,T74 | 
| 1 | - | Covered | T25,T73,T74 | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T25,T73,T74 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T25,T73,T74 | 
| 1 | 1 | Covered | T25,T73,T74 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_5_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T25,T73,T74 | 
| 0 | 
0 | 
1 | 
Covered | 
T25,T73,T74 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T25,T73,T74 | 
| 0 | 
0 | 
1 | 
Covered | 
T25,T73,T74 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_5_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
108139 | 
0 | 
0 | 
| T7 | 
36819 | 
0 | 
0 | 
0 | 
| T9 | 
42910 | 
0 | 
0 | 
0 | 
| T11 | 
26700 | 
0 | 
0 | 
0 | 
| T25 | 
48316 | 
983 | 
0 | 
0 | 
| T30 | 
53048 | 
0 | 
0 | 
0 | 
| T32 | 
26153 | 
0 | 
0 | 
0 | 
| T39 | 
9484 | 
0 | 
0 | 
0 | 
| T46 | 
64785 | 
0 | 
0 | 
0 | 
| T70 | 
0 | 
410 | 
0 | 
0 | 
| T73 | 
0 | 
733 | 
0 | 
0 | 
| T74 | 
0 | 
1541 | 
0 | 
0 | 
| T90 | 
0 | 
776 | 
0 | 
0 | 
| T117 | 
0 | 
739 | 
0 | 
0 | 
| T118 | 
22471 | 
0 | 
0 | 
0 | 
| T119 | 
20821 | 
0 | 
0 | 
0 | 
| T122 | 
0 | 
1675 | 
0 | 
0 | 
| T426 | 
0 | 
755 | 
0 | 
0 | 
| T450 | 
0 | 
731 | 
0 | 
0 | 
| T451 | 
0 | 
759 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
270 | 
0 | 
0 | 
| T7 | 
36819 | 
0 | 
0 | 
0 | 
| T9 | 
42910 | 
0 | 
0 | 
0 | 
| T11 | 
26700 | 
0 | 
0 | 
0 | 
| T25 | 
48316 | 
2 | 
0 | 
0 | 
| T30 | 
53048 | 
0 | 
0 | 
0 | 
| T32 | 
26153 | 
0 | 
0 | 
0 | 
| T39 | 
9484 | 
0 | 
0 | 
0 | 
| T46 | 
64785 | 
0 | 
0 | 
0 | 
| T70 | 
0 | 
1 | 
0 | 
0 | 
| T73 | 
0 | 
2 | 
0 | 
0 | 
| T74 | 
0 | 
4 | 
0 | 
0 | 
| T90 | 
0 | 
2 | 
0 | 
0 | 
| T117 | 
0 | 
2 | 
0 | 
0 | 
| T118 | 
22471 | 
0 | 
0 | 
0 | 
| T119 | 
20821 | 
0 | 
0 | 
0 | 
| T122 | 
0 | 
4 | 
0 | 
0 | 
| T426 | 
0 | 
2 | 
0 | 
0 | 
| T450 | 
0 | 
2 | 
0 | 
0 | 
| T451 | 
0 | 
2 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 | 
 
Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_6_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 20 | 90.91 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 0 | 0.00 | 
| CONT_ASSIGN | 156 | 1 | 0 | 0.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T70 T91 T92 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T70 T169 T174 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T70 T169 T174 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T70 T169 T174 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T70 T169 T174 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T70 T169 T174 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T70 T169 T174 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T70 T169 T174 
135        1/1                txn_bits_q <= '0;
           Tests:       T70 T169 T174 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        0/1     ==>    assign src_qs_o = src_q;
156        0/1     ==>    assign dst_wd_o = src_q;
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T70 T169 T174 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_6_cdc
 | Total | Covered | Percent | 
| Conditions | 13 | 11 | 84.62 | 
| Logical | 13 | 11 | 84.62 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       123
 EXPRESSION (src_wd_i & BitMask)
             ----1---   ---2---
| -1- | -2- | Status | Tests |                       
| 0 | - | Covered | T70,T169,T174 | 
| 1 | - | Not Covered |  | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_6_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_6_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
95525 | 
0 | 
0 | 
| T70 | 
505616 | 
399 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
797 | 
0 | 
0 | 
| T407 | 
0 | 
748 | 
0 | 
0 | 
| T418 | 
0 | 
786 | 
0 | 
0 | 
| T427 | 
0 | 
709 | 
0 | 
0 | 
| T428 | 
0 | 
422 | 
0 | 
0 | 
| T429 | 
0 | 
799 | 
0 | 
0 | 
| T430 | 
0 | 
715 | 
0 | 
0 | 
| T431 | 
0 | 
469 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
389 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
238 | 
0 | 
0 | 
| T70 | 
505616 | 
1 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
2 | 
0 | 
0 | 
| T407 | 
0 | 
2 | 
0 | 
0 | 
| T418 | 
0 | 
2 | 
0 | 
0 | 
| T427 | 
0 | 
2 | 
0 | 
0 | 
| T428 | 
0 | 
1 | 
0 | 
0 | 
| T429 | 
0 | 
2 | 
0 | 
0 | 
| T430 | 
0 | 
2 | 
0 | 
0 | 
| T431 | 
0 | 
1 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
1 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 | 
 
Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_7_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 20 | 90.91 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 0 | 0.00 | 
| CONT_ASSIGN | 156 | 1 | 0 | 0.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T70 T91 T92 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T70 T169 T174 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T70 T169 T174 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T70 T169 T174 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T70 T169 T174 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T70 T169 T174 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T70 T169 T174 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T70 T169 T174 
135        1/1                txn_bits_q <= '0;
           Tests:       T70 T169 T174 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        0/1     ==>    assign src_qs_o = src_q;
156        0/1     ==>    assign dst_wd_o = src_q;
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T70 T169 T174 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_7_cdc
 | Total | Covered | Percent | 
| Conditions | 13 | 11 | 84.62 | 
| Logical | 13 | 11 | 84.62 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       123
 EXPRESSION (src_wd_i & BitMask)
             ----1---   ---2---
| -1- | -2- | Status | Tests |                       
| 0 | - | Covered | T70,T169,T174 | 
| 1 | - | Not Covered |  | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_7_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_en_7_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
88854 | 
0 | 
0 | 
| T70 | 
505616 | 
371 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
691 | 
0 | 
0 | 
| T407 | 
0 | 
656 | 
0 | 
0 | 
| T418 | 
0 | 
652 | 
0 | 
0 | 
| T427 | 
0 | 
683 | 
0 | 
0 | 
| T428 | 
0 | 
379 | 
0 | 
0 | 
| T429 | 
0 | 
893 | 
0 | 
0 | 
| T430 | 
0 | 
735 | 
0 | 
0 | 
| T431 | 
0 | 
379 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
441 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
222 | 
0 | 
0 | 
| T70 | 
505616 | 
1 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
2 | 
0 | 
0 | 
| T407 | 
0 | 
2 | 
0 | 
0 | 
| T418 | 
0 | 
2 | 
0 | 
0 | 
| T427 | 
0 | 
2 | 
0 | 
0 | 
| T428 | 
0 | 
1 | 
0 | 
0 | 
| T429 | 
0 | 
2 | 
0 | 
0 | 
| T430 | 
0 | 
2 | 
0 | 
0 | 
| T431 | 
0 | 
1 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
1 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 | 
 
Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_0_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 22 | 100.00 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 156 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T6 T7 T71 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T6 T7 T71 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T6 T7 T71 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T6 T7 T71 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T6 T7 T71 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T6 T7 T71 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T6 T7 T71 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T6 T7 T71 
135        1/1                txn_bits_q <= '0;
           Tests:       T6 T7 T71 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        1/1            assign src_qs_o = src_q;
           Tests:       T7 T79 T80 
156        1/1            assign dst_wd_o = src_q;
           Tests:       T7 T79 T80 
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T6 T7 T71 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_0_cdc
 | Total | Covered | Percent | 
| Conditions | 11 | 10 | 90.91 | 
| Logical | 11 | 10 | 90.91 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T6,T7,T71 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T6,T7,T71 | 
| 1 | 1 | Covered | T6,T7,T71 | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T6,T7,T71 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T6,T7,T71 | 
| 1 | 1 | Covered | T6,T7,T71 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_0_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T6,T7,T71 | 
| 0 | 
0 | 
1 | 
Covered | 
T6,T7,T71 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T6,T7,T71 | 
| 0 | 
0 | 
1 | 
Covered | 
T6,T7,T71 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_0_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
96414 | 
0 | 
0 | 
| T6 | 
45621 | 
399 | 
0 | 
0 | 
| T7 | 
36819 | 
906 | 
0 | 
0 | 
| T9 | 
42910 | 
0 | 
0 | 
0 | 
| T11 | 
26700 | 
0 | 
0 | 
0 | 
| T25 | 
48316 | 
0 | 
0 | 
0 | 
| T30 | 
53048 | 
0 | 
0 | 
0 | 
| T32 | 
26153 | 
0 | 
0 | 
0 | 
| T46 | 
64785 | 
0 | 
0 | 
0 | 
| T70 | 
0 | 
428 | 
0 | 
0 | 
| T71 | 
0 | 
383 | 
0 | 
0 | 
| T78 | 
0 | 
389 | 
0 | 
0 | 
| T79 | 
0 | 
769 | 
0 | 
0 | 
| T80 | 
0 | 
756 | 
0 | 
0 | 
| T118 | 
22471 | 
0 | 
0 | 
0 | 
| T119 | 
20821 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
652 | 
0 | 
0 | 
| T407 | 
0 | 
828 | 
0 | 
0 | 
| T427 | 
0 | 
811 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
240 | 
0 | 
0 | 
| T6 | 
45621 | 
1 | 
0 | 
0 | 
| T7 | 
36819 | 
2 | 
0 | 
0 | 
| T9 | 
42910 | 
0 | 
0 | 
0 | 
| T11 | 
26700 | 
0 | 
0 | 
0 | 
| T25 | 
48316 | 
0 | 
0 | 
0 | 
| T30 | 
53048 | 
0 | 
0 | 
0 | 
| T32 | 
26153 | 
0 | 
0 | 
0 | 
| T46 | 
64785 | 
0 | 
0 | 
0 | 
| T70 | 
0 | 
1 | 
0 | 
0 | 
| T71 | 
0 | 
1 | 
0 | 
0 | 
| T78 | 
0 | 
1 | 
0 | 
0 | 
| T79 | 
0 | 
2 | 
0 | 
0 | 
| T80 | 
0 | 
2 | 
0 | 
0 | 
| T118 | 
22471 | 
0 | 
0 | 
0 | 
| T119 | 
20821 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
2 | 
0 | 
0 | 
| T407 | 
0 | 
2 | 
0 | 
0 | 
| T427 | 
0 | 
2 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 | 
 
Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_1_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 22 | 100.00 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 156 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T70 T91 T92 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T70 T169 T174 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T70 T169 T174 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T70 T169 T174 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T70 T169 T174 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T70 T169 T174 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T70 T169 T174 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T70 T169 T174 
135        1/1                txn_bits_q <= '0;
           Tests:       T70 T169 T174 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        1/1            assign src_qs_o = src_q;
           Tests:       T70 T169 T174 
156        1/1            assign dst_wd_o = src_q;
           Tests:       T70 T169 T174 
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T70 T169 T174 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_1_cdc
 | Total | Covered | Percent | 
| Conditions | 11 | 10 | 90.91 | 
| Logical | 11 | 10 | 90.91 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_1_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_1_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
96051 | 
0 | 
0 | 
| T70 | 
505616 | 
401 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
744 | 
0 | 
0 | 
| T407 | 
0 | 
745 | 
0 | 
0 | 
| T418 | 
0 | 
678 | 
0 | 
0 | 
| T427 | 
0 | 
694 | 
0 | 
0 | 
| T428 | 
0 | 
420 | 
0 | 
0 | 
| T429 | 
0 | 
807 | 
0 | 
0 | 
| T430 | 
0 | 
747 | 
0 | 
0 | 
| T431 | 
0 | 
387 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
439 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
240 | 
0 | 
0 | 
| T70 | 
505616 | 
1 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
2 | 
0 | 
0 | 
| T407 | 
0 | 
2 | 
0 | 
0 | 
| T418 | 
0 | 
2 | 
0 | 
0 | 
| T427 | 
0 | 
2 | 
0 | 
0 | 
| T428 | 
0 | 
1 | 
0 | 
0 | 
| T429 | 
0 | 
2 | 
0 | 
0 | 
| T430 | 
0 | 
2 | 
0 | 
0 | 
| T431 | 
0 | 
1 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
1 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 | 
 
Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_2_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 22 | 100.00 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 156 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T27 T70 T91 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T27 T70 T169 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T27 T70 T169 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T27 T70 T169 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T27 T70 T169 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T27 T70 T169 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T27 T70 T169 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T27 T70 T169 
135        1/1                txn_bits_q <= '0;
           Tests:       T27 T70 T169 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        1/1            assign src_qs_o = src_q;
           Tests:       T27 T70 T169 
156        1/1            assign dst_wd_o = src_q;
           Tests:       T27 T70 T169 
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T27 T70 T169 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_2_cdc
 | Total | Covered | Percent | 
| Conditions | 11 | 10 | 90.91 | 
| Logical | 11 | 10 | 90.91 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T27,T70,T452 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T27,T70,T169 | 
| 1 | 1 | Covered | T27,T70,T169 | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T27,T70,T169 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T27,T70,T169 | 
| 1 | 1 | Covered | T27,T70,T169 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_2_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T27,T70,T169 | 
| 0 | 
0 | 
1 | 
Covered | 
T27,T70,T169 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T27,T70,T169 | 
| 0 | 
0 | 
1 | 
Covered | 
T27,T70,T169 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_2_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
92324 | 
0 | 
0 | 
| T27 | 
47682 | 
479 | 
0 | 
0 | 
| T49 | 
23276 | 
0 | 
0 | 
0 | 
| T53 | 
38582 | 
0 | 
0 | 
0 | 
| T70 | 
0 | 
464 | 
0 | 
0 | 
| T132 | 
58842 | 
0 | 
0 | 
0 | 
| T184 | 
546891 | 
0 | 
0 | 
0 | 
| T278 | 
373717 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
727 | 
0 | 
0 | 
| T407 | 
0 | 
735 | 
0 | 
0 | 
| T418 | 
0 | 
800 | 
0 | 
0 | 
| T427 | 
0 | 
735 | 
0 | 
0 | 
| T428 | 
0 | 
413 | 
0 | 
0 | 
| T429 | 
0 | 
840 | 
0 | 
0 | 
| T430 | 
0 | 
789 | 
0 | 
0 | 
| T431 | 
0 | 
374 | 
0 | 
0 | 
| T441 | 
307633 | 
0 | 
0 | 
0 | 
| T442 | 
67171 | 
0 | 
0 | 
0 | 
| T443 | 
393491 | 
0 | 
0 | 
0 | 
| T444 | 
307216 | 
0 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
228 | 
0 | 
0 | 
| T27 | 
47682 | 
1 | 
0 | 
0 | 
| T49 | 
23276 | 
0 | 
0 | 
0 | 
| T53 | 
38582 | 
0 | 
0 | 
0 | 
| T70 | 
0 | 
1 | 
0 | 
0 | 
| T132 | 
58842 | 
0 | 
0 | 
0 | 
| T184 | 
546891 | 
0 | 
0 | 
0 | 
| T278 | 
373717 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
2 | 
0 | 
0 | 
| T407 | 
0 | 
2 | 
0 | 
0 | 
| T418 | 
0 | 
2 | 
0 | 
0 | 
| T427 | 
0 | 
2 | 
0 | 
0 | 
| T428 | 
0 | 
1 | 
0 | 
0 | 
| T429 | 
0 | 
2 | 
0 | 
0 | 
| T430 | 
0 | 
2 | 
0 | 
0 | 
| T431 | 
0 | 
1 | 
0 | 
0 | 
| T441 | 
307633 | 
0 | 
0 | 
0 | 
| T442 | 
67171 | 
0 | 
0 | 
0 | 
| T443 | 
393491 | 
0 | 
0 | 
0 | 
| T444 | 
307216 | 
0 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 | 
 
Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_3_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 22 | 100.00 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 156 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T72 T70 T91 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T72 T70 T169 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T72 T70 T169 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T72 T70 T169 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T72 T70 T169 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T72 T70 T169 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T72 T70 T169 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T72 T70 T169 
135        1/1                txn_bits_q <= '0;
           Tests:       T72 T70 T169 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        1/1            assign src_qs_o = src_q;
           Tests:       T72 T70 T169 
156        1/1            assign dst_wd_o = src_q;
           Tests:       T72 T70 T169 
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T72 T70 T169 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_3_cdc
 | Total | Covered | Percent | 
| Conditions | 11 | 10 | 90.91 | 
| Logical | 11 | 10 | 90.91 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T72,T70,T169 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T72,T70,T169 | 
| 1 | 1 | Covered | T72,T70,T169 | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T72,T70,T169 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T72,T70,T169 | 
| 1 | 1 | Covered | T72,T70,T169 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_3_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T72,T70,T169 | 
| 0 | 
0 | 
1 | 
Covered | 
T72,T70,T169 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T72,T70,T169 | 
| 0 | 
0 | 
1 | 
Covered | 
T72,T70,T169 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_3_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
91888 | 
0 | 
0 | 
| T21 | 
23719 | 
0 | 
0 | 
0 | 
| T70 | 
0 | 
438 | 
0 | 
0 | 
| T72 | 
24344 | 
401 | 
0 | 
0 | 
| T78 | 
47309 | 
0 | 
0 | 
0 | 
| T96 | 
477586 | 
0 | 
0 | 
0 | 
| T135 | 
19735 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
768 | 
0 | 
0 | 
| T407 | 
0 | 
765 | 
0 | 
0 | 
| T418 | 
0 | 
740 | 
0 | 
0 | 
| T427 | 
0 | 
788 | 
0 | 
0 | 
| T428 | 
0 | 
420 | 
0 | 
0 | 
| T429 | 
0 | 
774 | 
0 | 
0 | 
| T430 | 
0 | 
697 | 
0 | 
0 | 
| T431 | 
0 | 
371 | 
0 | 
0 | 
| T445 | 
138581 | 
0 | 
0 | 
0 | 
| T446 | 
22078 | 
0 | 
0 | 
0 | 
| T447 | 
93100 | 
0 | 
0 | 
0 | 
| T448 | 
26631 | 
0 | 
0 | 
0 | 
| T449 | 
223873 | 
0 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
229 | 
0 | 
0 | 
| T21 | 
23719 | 
0 | 
0 | 
0 | 
| T70 | 
0 | 
1 | 
0 | 
0 | 
| T72 | 
24344 | 
1 | 
0 | 
0 | 
| T78 | 
47309 | 
0 | 
0 | 
0 | 
| T96 | 
477586 | 
0 | 
0 | 
0 | 
| T135 | 
19735 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
2 | 
0 | 
0 | 
| T407 | 
0 | 
2 | 
0 | 
0 | 
| T418 | 
0 | 
2 | 
0 | 
0 | 
| T427 | 
0 | 
2 | 
0 | 
0 | 
| T428 | 
0 | 
1 | 
0 | 
0 | 
| T429 | 
0 | 
2 | 
0 | 
0 | 
| T430 | 
0 | 
2 | 
0 | 
0 | 
| T431 | 
0 | 
1 | 
0 | 
0 | 
| T445 | 
138581 | 
0 | 
0 | 
0 | 
| T446 | 
22078 | 
0 | 
0 | 
0 | 
| T447 | 
93100 | 
0 | 
0 | 
0 | 
| T448 | 
26631 | 
0 | 
0 | 
0 | 
| T449 | 
223873 | 
0 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 | 
 
Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_4_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 22 | 100.00 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 156 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T70 T91 T92 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T70 T169 T174 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T70 T169 T174 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T70 T169 T174 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T70 T169 T174 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T70 T169 T174 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T70 T169 T174 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T70 T169 T174 
135        1/1                txn_bits_q <= '0;
           Tests:       T70 T169 T174 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        1/1            assign src_qs_o = src_q;
           Tests:       T70 T169 T174 
156        1/1            assign dst_wd_o = src_q;
           Tests:       T70 T169 T174 
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T70 T169 T174 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_4_cdc
 | Total | Covered | Percent | 
| Conditions | 11 | 10 | 90.91 | 
| Logical | 11 | 10 | 90.91 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_4_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_4_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
83765 | 
0 | 
0 | 
| T70 | 
505616 | 
386 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
701 | 
0 | 
0 | 
| T407 | 
0 | 
711 | 
0 | 
0 | 
| T418 | 
0 | 
733 | 
0 | 
0 | 
| T427 | 
0 | 
733 | 
0 | 
0 | 
| T428 | 
0 | 
427 | 
0 | 
0 | 
| T429 | 
0 | 
788 | 
0 | 
0 | 
| T430 | 
0 | 
761 | 
0 | 
0 | 
| T431 | 
0 | 
458 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
388 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
210 | 
0 | 
0 | 
| T70 | 
505616 | 
1 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
2 | 
0 | 
0 | 
| T407 | 
0 | 
2 | 
0 | 
0 | 
| T418 | 
0 | 
2 | 
0 | 
0 | 
| T427 | 
0 | 
2 | 
0 | 
0 | 
| T428 | 
0 | 
1 | 
0 | 
0 | 
| T429 | 
0 | 
2 | 
0 | 
0 | 
| T430 | 
0 | 
2 | 
0 | 
0 | 
| T431 | 
0 | 
1 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
1 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 | 
 
Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_5_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 22 | 100.00 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 156 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T25 T73 T74 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T25 T73 T74 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T25 T73 T74 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T25 T73 T74 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T25 T73 T74 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T25 T73 T74 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T25 T73 T74 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T25 T73 T74 
135        1/1                txn_bits_q <= '0;
           Tests:       T25 T73 T74 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        1/1            assign src_qs_o = src_q;
           Tests:       T25 T70 T169 
156        1/1            assign dst_wd_o = src_q;
           Tests:       T25 T70 T169 
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T25 T73 T74 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_5_cdc
 | Total | Covered | Percent | 
| Conditions | 11 | 10 | 90.91 | 
| Logical | 11 | 10 | 90.91 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T25,T73,T74 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T25,T73,T74 | 
| 1 | 1 | Covered | T25,T73,T74 | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T25,T73,T74 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T25,T73,T74 | 
| 1 | 1 | Covered | T25,T73,T74 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_5_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T25,T73,T74 | 
| 0 | 
0 | 
1 | 
Covered | 
T25,T73,T74 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T25,T73,T74 | 
| 0 | 
0 | 
1 | 
Covered | 
T25,T73,T74 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_5_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
94420 | 
0 | 
0 | 
| T7 | 
36819 | 
0 | 
0 | 
0 | 
| T9 | 
42910 | 
0 | 
0 | 
0 | 
| T11 | 
26700 | 
0 | 
0 | 
0 | 
| T25 | 
48316 | 
321 | 
0 | 
0 | 
| T30 | 
53048 | 
0 | 
0 | 
0 | 
| T32 | 
26153 | 
0 | 
0 | 
0 | 
| T39 | 
9484 | 
0 | 
0 | 
0 | 
| T46 | 
64785 | 
0 | 
0 | 
0 | 
| T70 | 
0 | 
393 | 
0 | 
0 | 
| T73 | 
0 | 
357 | 
0 | 
0 | 
| T74 | 
0 | 
793 | 
0 | 
0 | 
| T90 | 
0 | 
402 | 
0 | 
0 | 
| T117 | 
0 | 
242 | 
0 | 
0 | 
| T118 | 
22471 | 
0 | 
0 | 
0 | 
| T119 | 
20821 | 
0 | 
0 | 
0 | 
| T122 | 
0 | 
685 | 
0 | 
0 | 
| T426 | 
0 | 
380 | 
0 | 
0 | 
| T450 | 
0 | 
354 | 
0 | 
0 | 
| T451 | 
0 | 
384 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
238 | 
0 | 
0 | 
| T7 | 
36819 | 
0 | 
0 | 
0 | 
| T9 | 
42910 | 
0 | 
0 | 
0 | 
| T11 | 
26700 | 
0 | 
0 | 
0 | 
| T25 | 
48316 | 
1 | 
0 | 
0 | 
| T30 | 
53048 | 
0 | 
0 | 
0 | 
| T32 | 
26153 | 
0 | 
0 | 
0 | 
| T39 | 
9484 | 
0 | 
0 | 
0 | 
| T46 | 
64785 | 
0 | 
0 | 
0 | 
| T70 | 
0 | 
1 | 
0 | 
0 | 
| T73 | 
0 | 
1 | 
0 | 
0 | 
| T74 | 
0 | 
2 | 
0 | 
0 | 
| T90 | 
0 | 
1 | 
0 | 
0 | 
| T117 | 
0 | 
1 | 
0 | 
0 | 
| T118 | 
22471 | 
0 | 
0 | 
0 | 
| T119 | 
20821 | 
0 | 
0 | 
0 | 
| T122 | 
0 | 
2 | 
0 | 
0 | 
| T426 | 
0 | 
1 | 
0 | 
0 | 
| T450 | 
0 | 
1 | 
0 | 
0 | 
| T451 | 
0 | 
1 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 | 
 
Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_6_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 22 | 100.00 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 156 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T70 T91 T92 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T70 T169 T174 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T70 T169 T174 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T70 T169 T174 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T70 T169 T174 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T70 T169 T174 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T70 T169 T174 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T70 T169 T174 
135        1/1                txn_bits_q <= '0;
           Tests:       T70 T169 T174 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        1/1            assign src_qs_o = src_q;
           Tests:       T70 T169 T174 
156        1/1            assign dst_wd_o = src_q;
           Tests:       T70 T169 T174 
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T70 T169 T174 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_6_cdc
 | Total | Covered | Percent | 
| Conditions | 11 | 10 | 90.91 | 
| Logical | 11 | 10 | 90.91 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T452,T169 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_6_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_6_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
105112 | 
0 | 
0 | 
| T70 | 
505616 | 
414 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
675 | 
0 | 
0 | 
| T407 | 
0 | 
814 | 
0 | 
0 | 
| T418 | 
0 | 
700 | 
0 | 
0 | 
| T427 | 
0 | 
761 | 
0 | 
0 | 
| T428 | 
0 | 
382 | 
0 | 
0 | 
| T429 | 
0 | 
814 | 
0 | 
0 | 
| T430 | 
0 | 
708 | 
0 | 
0 | 
| T431 | 
0 | 
452 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
416 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
259 | 
0 | 
0 | 
| T70 | 
505616 | 
1 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
2 | 
0 | 
0 | 
| T407 | 
0 | 
2 | 
0 | 
0 | 
| T418 | 
0 | 
2 | 
0 | 
0 | 
| T427 | 
0 | 
2 | 
0 | 
0 | 
| T428 | 
0 | 
1 | 
0 | 
0 | 
| T429 | 
0 | 
2 | 
0 | 
0 | 
| T430 | 
0 | 
2 | 
0 | 
0 | 
| T431 | 
0 | 
1 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
1 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 | 
 
Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_7_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 22 | 100.00 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 156 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T70 T91 T92 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T70 T169 T174 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T70 T169 T174 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T70 T169 T174 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T70 T169 T174 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T70 T169 T174 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T70 T169 T174 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T70 T169 T174 
135        1/1                txn_bits_q <= '0;
           Tests:       T70 T169 T174 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        1/1            assign src_qs_o = src_q;
           Tests:       T70 T169 T174 
156        1/1            assign dst_wd_o = src_q;
           Tests:       T70 T169 T174 
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T70 T169 T174 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_7_cdc
 | Total | Covered | Percent | 
| Conditions | 11 | 10 | 90.91 | 
| Logical | 11 | 10 | 90.91 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T452,T169 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_7_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_7_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
82487 | 
0 | 
0 | 
| T70 | 
505616 | 
482 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
798 | 
0 | 
0 | 
| T407 | 
0 | 
680 | 
0 | 
0 | 
| T418 | 
0 | 
703 | 
0 | 
0 | 
| T427 | 
0 | 
712 | 
0 | 
0 | 
| T428 | 
0 | 
416 | 
0 | 
0 | 
| T429 | 
0 | 
792 | 
0 | 
0 | 
| T430 | 
0 | 
782 | 
0 | 
0 | 
| T431 | 
0 | 
398 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
410 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
210 | 
0 | 
0 | 
| T70 | 
505616 | 
1 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
2 | 
0 | 
0 | 
| T407 | 
0 | 
2 | 
0 | 
0 | 
| T418 | 
0 | 
2 | 
0 | 
0 | 
| T427 | 
0 | 
2 | 
0 | 
0 | 
| T428 | 
0 | 
1 | 
0 | 
0 | 
| T429 | 
0 | 
2 | 
0 | 
0 | 
| T430 | 
0 | 
2 | 
0 | 
0 | 
| T431 | 
0 | 
1 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
1 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 | 
 
Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_cnt_th_0_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 22 | 100.00 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 156 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T70 T91 T92 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T70 T169 T174 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T70 T169 T174 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T70 T169 T174 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T70 T169 T174 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T70 T169 T174 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T70 T169 T174 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T70 T169 T174 
135        1/1                txn_bits_q <= '0;
           Tests:       T70 T169 T174 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        1/1            assign src_qs_o = src_q;
           Tests:       T70 T169 T174 
156        1/1            assign dst_wd_o = src_q;
           Tests:       T70 T169 T174 
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T70 T169 T174 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_cnt_th_0_cdc
 | Total | Covered | Percent | 
| Conditions | 11 | 10 | 90.91 | 
| Logical | 11 | 10 | 90.91 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T70,T169,T174 | 
| 1 | 1 | Covered | T70,T169,T174 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_cnt_th_0_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
1 | 
Covered | 
T70,T169,T174 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_cnt_th_0_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
88325 | 
0 | 
0 | 
| T70 | 
505616 | 
437 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
701 | 
0 | 
0 | 
| T407 | 
0 | 
701 | 
0 | 
0 | 
| T418 | 
0 | 
724 | 
0 | 
0 | 
| T427 | 
0 | 
685 | 
0 | 
0 | 
| T428 | 
0 | 
481 | 
0 | 
0 | 
| T429 | 
0 | 
793 | 
0 | 
0 | 
| T430 | 
0 | 
767 | 
0 | 
0 | 
| T431 | 
0 | 
366 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
443 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
221 | 
0 | 
0 | 
| T70 | 
505616 | 
1 | 
0 | 
0 | 
| T248 | 
249629 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
2 | 
0 | 
0 | 
| T407 | 
0 | 
2 | 
0 | 
0 | 
| T418 | 
0 | 
2 | 
0 | 
0 | 
| T427 | 
0 | 
2 | 
0 | 
0 | 
| T428 | 
0 | 
1 | 
0 | 
0 | 
| T429 | 
0 | 
2 | 
0 | 
0 | 
| T430 | 
0 | 
2 | 
0 | 
0 | 
| T431 | 
0 | 
1 | 
0 | 
0 | 
| T432 | 
55265 | 
0 | 
0 | 
0 | 
| T433 | 
25665 | 
0 | 
0 | 
0 | 
| T434 | 
53313 | 
0 | 
0 | 
0 | 
| T435 | 
18613 | 
0 | 
0 | 
0 | 
| T436 | 
125513 | 
0 | 
0 | 
0 | 
| T437 | 
34706 | 
0 | 
0 | 
0 | 
| T438 | 
87266 | 
0 | 
0 | 
0 | 
| T439 | 
364384 | 
0 | 
0 | 
0 | 
| T440 | 
0 | 
1 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 | 
 
Line Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_cnt_th_1_cdc
 | Line No. | Total | Covered | Percent | 
| TOTAL |  | 22 | 22 | 100.00 | 
| CONT_ASSIGN | 65 | 1 | 1 | 100.00 | 
| ALWAYS | 71 | 6 | 6 | 100.00 | 
| CONT_ASSIGN | 85 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 109 | 1 | 1 | 100.00 | 
| ALWAYS | 115 | 9 | 9 | 100.00 | 
| CONT_ASSIGN | 150 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 155 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 156 | 1 | 1 | 100.00 | 
| CONT_ASSIGN | 200 | 1 | 1 | 100.00 | 
64                      
65         1/1            assign src_req = src_we_i | src_re_i;
           Tests:       T86 T120 T70 
66                      
67                        // busy indication back-pressures upstream if the register is accessed
68                        // again.  The busy indication is also used as a "commit" indication for
69                        // resolving software and hardware write conflicts
70                        always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
71         1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
72         1/1                src_busy_q <= '0;
           Tests:       T1 T2 T3 
73         1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
74         1/1                src_busy_q <= 1'b1;
           Tests:       T86 T120 T70 
75         1/1              end else if (src_ack) begin
           Tests:       T1 T2 T3 
76         1/1                src_busy_q <= 1'b0;
           Tests:       T86 T120 T70 
77                          end
                        MISSING_ELSE
78                        end
79                      
80                        // A src_ack should only be sent if there was a src_req.
81                        // src_busy_q asserts whenever there is a src_req.  By association,
82                        // whenever src_ack is seen, then src_busy must be high.
83                        `ASSERT(SrcAckBusyChk_A, src_ack |-> src_busy_q, clk_src_i, !rst_src_ni)
84                      
85         1/1            assign src_busy_o = src_busy_q;
           Tests:       T86 T120 T70 
86                      
87                        // src_q acts as both the write holding register and the software read back
88                        // register.
89                        // When software performs a write, the write data is captured in src_q for
90                        // CDC purposes.  When not performing a write, the src_q reflects the most recent
91                        // hardware value. For registers with no hardware access, this is simply the
92                        // the value programmed by software (or in the case R1C, W1C etc) the value after
93                        // the operation. For registers with hardware access, this reflects a potentially
94                        // delayed version of the real value, as the software facing updates lag real
95                        // time updates.
96                        //
97                        // To resolve software and hardware conflicts, the process is as follows:
98                        // When software issues a write, this module asserts "busy".  While busy,
99                        // src_q does not take on destination value updates.  Since the
100                       // logic has committed to updating based on software command, there is an irreversible
101                       // window from which hardware writes are ignored.  Once the busy window completes,
102                       // the cdc portion then begins sampling once more.
103                       //
104                       // This is consistent with prim_subreg_arb where during software / hardware conflicts,
105                       // software is always prioritized.  The main difference is the conflict resolution window
106                       // is now larger instead of just one destination clock cycle.
107                     
108                       logic busy;
109        1/1            assign busy = src_busy_q & !src_ack;
           Tests:       T86 T120 T70 
110                     
111                       // This is the current destination value
112                       logic [DataWidth-1:0] dst_qs;
113                       logic src_update;
114                       always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
115        1/1              if (!rst_src_ni) begin
           Tests:       T1 T2 T3 
116        1/1                src_q <= ResetVal;
           Tests:       T1 T2 T3 
117        1/1                txn_bits_q <= '0;
           Tests:       T1 T2 T3 
118        1/1              end else if (src_req) begin
           Tests:       T1 T2 T3 
119                           // See assertion below
120                           // At the beginning of a software initiated transaction, the following
121                           // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122                           // change for the duration of the synchronization operation.
123        1/1                src_q <= src_wd_i & BitMask;
           Tests:       T86 T120 T70 
124        1/1                txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
           Tests:       T86 T120 T70 
125        1/1              end else if (src_busy_q && src_ack || src_update && !busy) begin
           Tests:       T1 T2 T3 
126                           // sample data whenever a busy transaction finishes OR
127                           // when an update pulse is seen.
128                           // TODO: We should add a cover group to test different sync timings
129                           // between src_ack and src_update. ie. there can be 3 scenarios:
130                           // 1. update one cycle before ack
131                           // 2. ack one cycle before update
132                           // 3. update / ack on the same cycle
133                           // During all 3 cases the read data should be correct
134        1/1                src_q <= dst_qs;
           Tests:       T86 T120 T70 
135        1/1                txn_bits_q <= '0;
           Tests:       T86 T120 T70 
136                         end
                        MISSING_ELSE
137                       end
138                     
139                       // The current design (tlul_adapter_reg) does not spit out a request if the destination it chooses
140                       // (decoded from address) is busy. So this creates a situation in the current design where
141                       // src_req_i and busy can never be high at the same time.
142                       // While the code above could be coded directly to be expressed as `src_req & !busy`, which makes
143                       // the intent clearer, it ends up causing coverage holes from the tool's perspective since that
144                       // condition cannot be met.
145                       // Thus we add an assertion here to ensure the condition is always satisfied.
146                       `ASSERT(BusySrcReqChk_A, busy |-> !src_req, clk_src_i, !rst_src_ni)
147                     
148                       // reserved bits are not used
149                       logic unused_wd;
150        1/1            assign unused_wd = ^src_wd_i;
           Tests:       T1 T2 T3 
151                     
152                       // src_q is always updated in the clk_src domain.
153                       // when performing an update to the destination domain, it is guaranteed
154                       // to not change by protocol.
155        1/1            assign src_qs_o = src_q;
           Tests:       T86 T120 T70 
156        1/1            assign dst_wd_o = src_q;
           Tests:       T86 T120 T70 
157                     
158                       ////////////////////////////
159                       // CDC handling
160                       ////////////////////////////
161                     
162                       logic dst_req_from_src;
163                       logic dst_req;
164                     
165                     
166                       // the software transaction is pulse synced across the domain.
167                       // the prim_reg_cdc_arb module handles conflicts with ongoing hardware updates.
168                       prim_pulse_sync u_src_to_dst_req (
169                         .clk_src_i,
170                         .rst_src_ni,
171                         .clk_dst_i,
172                         .rst_dst_ni,
173                         .src_pulse_i(src_req),
174                         .dst_pulse_o(dst_req_from_src)
175                       );
176                     
177                       prim_reg_cdc_arb #(
178                         .DataWidth(DataWidth),
179                         .ResetVal(ResetVal),
180                         .DstWrReq(DstWrReq)
181                       ) u_arb (
182                         .clk_src_i,
183                         .rst_src_ni,
184                         .clk_dst_i,
185                         .rst_dst_ni,
186                         .src_ack_o(src_ack),
187                         .src_update_o(src_update),
188                         .dst_req_i(dst_req_from_src),
189                         .dst_req_o(dst_req),
190                         .dst_update_i,
191                         .dst_ds_i,
192                         .dst_qs_i,
193                         .dst_qs_o(dst_qs)
194                       );
195                     
196                     
197                       // Each is valid only when destination request pulse is high; this is important in not propagating
198                       // the internal assertion of 'dst_req' by the 'prim_pulse_sync' channel when just one domain is
199                       // reset.
200        1/1            assign {dst_we_o, dst_re_o, dst_regwen_o} = txn_bits_q & {TxnWidth{dst_req}};
           Tests:       T86 T120 T70 
Cond Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_cnt_th_1_cdc
 | Total | Covered | Percent | 
| Conditions | 11 | 10 | 90.91 | 
| Logical | 11 | 10 | 90.91 | 
| Non-Logical | 0 | 0 |  | 
| Event | 0 | 0 |  | 
 LINE       65
 EXPRESSION (src_we_i | src_re_i)
             ----1---   ----2---
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T86,T120,T70 | 
 LINE       109
 EXPRESSION (src_busy_q & ((!src_ack)))
             -----1----   ------2-----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Covered | T86,T120,T70 | 
| 1 | 1 | Covered | T86,T120,T70 | 
 LINE       125
 EXPRESSION ((src_busy_q && src_ack) || (src_update && ((!busy))))
             -----------1-----------    ------------2------------
| -1- | -2- | Status | Tests |                       
| 0 | 0 | Covered | T1,T2,T3 | 
| 0 | 1 | Unreachable |  | 
| 1 | 0 | Covered | T86,T120,T70 | 
 LINE       125
 SUB-EXPRESSION (src_busy_q && src_ack)
                 -----1----    ---2---
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Not Covered |  | 
| 1 | 0 | Covered | T86,T120,T70 | 
| 1 | 1 | Covered | T86,T120,T70 | 
 LINE       125
 SUB-EXPRESSION (src_update && ((!busy)))
                 -----1----    ----2----
| -1- | -2- | Status | Tests |                       
| 0 | 1 | Covered | T1,T2,T3 | 
| 1 | 0 | Unreachable |  | 
| 1 | 1 | Unreachable |  | 
Branch Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_cnt_th_1_cdc
 | Line No. | Total | Covered | Percent | 
| Branches | 
 | 
8 | 
8 | 
100.00 | 
| IF | 
71 | 
4 | 
4 | 
100.00 | 
| IF | 
115 | 
4 | 
4 | 
100.00 | 
71             if (!rst_src_ni) begin
               -1-  
72               src_busy_q <= '0;
                 ==>
73             end else if (src_req) begin
                        -2-  
74               src_busy_q <= 1'b1;
                 ==>
75             end else if (src_ack) begin
                        -3-  
76               src_busy_q <= 1'b0;
                 ==>
77             end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T86,T120,T70 | 
| 0 | 
0 | 
1 | 
Covered | 
T86,T120,T70 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
115            if (!rst_src_ni) begin
               -1-  
116              src_q <= ResetVal;
                 ==>
117              txn_bits_q <= '0;
118            end else if (src_req) begin
                        -2-  
119              // See assertion below
120              // At the beginning of a software initiated transaction, the following
121              // values are captured in the src_q/txn_bits_q flops to ensure they cannot
122              // change for the duration of the synchronization operation.
123              src_q <= src_wd_i & BitMask;
                 ==>
124              txn_bits_q <= {src_we_i, src_re_i, src_regwen_i};
125            end else if (src_busy_q && src_ack || src_update && !busy) begin
                        -3-  
126              // sample data whenever a busy transaction finishes OR
127              // when an update pulse is seen.
128              // TODO: We should add a cover group to test different sync timings
129              // between src_ack and src_update. ie. there can be 3 scenarios:
130              // 1. update one cycle before ack
131              // 2. ack one cycle before update
132              // 3. update / ack on the same cycle
133              // During all 3 cases the read data should be correct
134              src_q <= dst_qs;
                 ==>
135              txn_bits_q <= '0;
136            end
               MISSING_ELSE
               ==>
Branches:
| -1- | -2- | -3- | Status | Tests | 
| 1 | 
- | 
- | 
Covered | 
T1,T2,T3 | 
| 0 | 
1 | 
- | 
Covered | 
T86,T120,T70 | 
| 0 | 
0 | 
1 | 
Covered | 
T86,T120,T70 | 
| 0 | 
0 | 
0 | 
Covered | 
T1,T2,T3 | 
Assert Coverage for Instance : tb.dut.top_earlgrey.u_pinmux_aon.u_reg.u_wkup_detector_cnt_th_1_cdc
Assertion Details
BusySrcReqChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
103724 | 
0 | 
0 | 
| T70 | 
0 | 
385 | 
0 | 
0 | 
| T86 | 
45853 | 
400 | 
0 | 
0 | 
| T87 | 
56299 | 
0 | 
0 | 
0 | 
| T94 | 
44060 | 
0 | 
0 | 
0 | 
| T120 | 
0 | 
413 | 
0 | 
0 | 
| T121 | 
0 | 
255 | 
0 | 
0 | 
| T166 | 
102617 | 
0 | 
0 | 
0 | 
| T236 | 
157307 | 
0 | 
0 | 
0 | 
| T333 | 
137599 | 
0 | 
0 | 
0 | 
| T338 | 
101190 | 
0 | 
0 | 
0 | 
| T345 | 
23266 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
723 | 
0 | 
0 | 
| T407 | 
0 | 
747 | 
0 | 
0 | 
| T418 | 
0 | 
726 | 
0 | 
0 | 
| T427 | 
0 | 
708 | 
0 | 
0 | 
| T428 | 
0 | 
415 | 
0 | 
0 | 
| T429 | 
0 | 
828 | 
0 | 
0 | 
| T453 | 
26638 | 
0 | 
0 | 
0 | 
| T454 | 
28878 | 
0 | 
0 | 
0 | 
DstReqKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
1728701 | 
1506165 | 
0 | 
0 | 
| T1 | 
312 | 
140 | 
0 | 
0 | 
| T2 | 
394 | 
222 | 
0 | 
0 | 
| T3 | 
389 | 
217 | 
0 | 
0 | 
| T4 | 
444 | 
270 | 
0 | 
0 | 
| T5 | 
414 | 
243 | 
0 | 
0 | 
| T6 | 
677 | 
503 | 
0 | 
0 | 
| T8 | 
420 | 
248 | 
0 | 
0 | 
| T25 | 
1084 | 
913 | 
0 | 
0 | 
| T102 | 
324 | 
152 | 
0 | 
0 | 
| T103 | 
393 | 
220 | 
0 | 
0 | 
SrcAckBusyChk_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
258 | 
0 | 
0 | 
| T70 | 
0 | 
1 | 
0 | 
0 | 
| T86 | 
45853 | 
1 | 
0 | 
0 | 
| T87 | 
56299 | 
0 | 
0 | 
0 | 
| T94 | 
44060 | 
0 | 
0 | 
0 | 
| T120 | 
0 | 
1 | 
0 | 
0 | 
| T121 | 
0 | 
1 | 
0 | 
0 | 
| T166 | 
102617 | 
0 | 
0 | 
0 | 
| T236 | 
157307 | 
0 | 
0 | 
0 | 
| T333 | 
137599 | 
0 | 
0 | 
0 | 
| T338 | 
101190 | 
0 | 
0 | 
0 | 
| T345 | 
23266 | 
0 | 
0 | 
0 | 
| T406 | 
0 | 
2 | 
0 | 
0 | 
| T407 | 
0 | 
2 | 
0 | 
0 | 
| T418 | 
0 | 
2 | 
0 | 
0 | 
| T427 | 
0 | 
2 | 
0 | 
0 | 
| T428 | 
0 | 
1 | 
0 | 
0 | 
| T429 | 
0 | 
2 | 
0 | 
0 | 
| T453 | 
26638 | 
0 | 
0 | 
0 | 
| T454 | 
28878 | 
0 | 
0 | 
0 | 
SrcBusyKnown_A
| Name | Attempts | Real Successes | Failures | Incomplete | 
| Total | 
147104929 | 
146278892 | 
0 | 
0 | 
| T1 | 
11052 | 
10501 | 
0 | 
0 | 
| T2 | 
16640 | 
16209 | 
0 | 
0 | 
| T3 | 
17963 | 
17479 | 
0 | 
0 | 
| T4 | 
23192 | 
22751 | 
0 | 
0 | 
| T5 | 
24095 | 
23603 | 
0 | 
0 | 
| T6 | 
45621 | 
44882 | 
0 | 
0 | 
| T8 | 
23553 | 
23017 | 
0 | 
0 | 
| T25 | 
48316 | 
47871 | 
0 | 
0 | 
| T102 | 
17014 | 
16265 | 
0 | 
0 | 
| T103 | 
20870 | 
20397 | 
0 | 
0 |