Line Coverage for Module :
prim_sync_reqack
| Line No. | Total | Covered | Percent |
TOTAL | | 36 | 36 | 100.00 |
CONT_ASSIGN | 55 | 0 | 0 | |
CONT_ASSIGN | 194 | 1 | 1 | 100.00 |
CONT_ASSIGN | 195 | 1 | 1 | 100.00 |
ALWAYS | 219 | 12 | 12 | 100.00 |
ALWAYS | 263 | 12 | 12 | 100.00 |
ALWAYS | 307 | 5 | 5 | 100.00 |
ALWAYS | 316 | 5 | 5 | 100.00 |
CONT_ASSIGN | 335 | 0 | 0 | |
ALWAYS | 339 | 0 | 0 | |
54 logic unused_req_chk;
55 unreachable assign unused_req_chk = req_chk_i;
56
57 if (EnRzHs) begin : gen_rz_hs_protocol
58 //////////////////
59 // RZ protocol //
60 //////////////////
61
62 // Types
63 typedef enum logic {
64 LoSt, HiSt
65 } rz_fsm_e;
66
67 // Signals
68 rz_fsm_e src_fsm_d, src_fsm_q;
69 rz_fsm_e dst_fsm_d, dst_fsm_q;
70 logic src_ack, dst_ack;
71 logic src_req, dst_req;
72
73 // REQ-side FSM (SRC domain)
74 always_comb begin : src_fsm
75 src_fsm_d = src_fsm_q;
76 src_ack_o = 1'b0;
77 src_req = 1'b0;
78
79 unique case (src_fsm_q)
80 LoSt: begin
81 // Wait for the ack to go back to zero before starting
82 // a new transaction.
83 if (!src_ack && src_req_i) begin
84 src_fsm_d = HiSt;
85 end
86 end
87 HiSt: begin
88 src_req = 1'b1;
89 // Forward the acknowledgement.
90 src_ack_o = src_ack;
91 // If request drops out, we go back to LoSt.
92 // If DST side asserts ack, we also go back to LoSt.
93 if (!src_req_i || src_ack) begin
94 src_fsm_d = LoSt;
95 end
96 end
97 //VCS coverage off
98 // pragma coverage off
99 default: ;
100 //VCS coverage on
101 // pragma coverage on
102 endcase
103 end
104
105 // Move ACK over to SRC domain.
106 prim_flop_2sync #(
107 .Width(1)
108 ) ack_sync (
109 .clk_i (clk_src_i),
110 .rst_ni (rst_src_ni),
111 .d_i (dst_ack),
112 .q_o (src_ack)
113 );
114
115 // Registers
116 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
117 if (!rst_src_ni) begin
118 src_fsm_q <= LoSt;
119 end else begin
120 src_fsm_q <= src_fsm_d;
121 end
122 end
123
124 // ACK-side FSM (DST domain)
125 always_comb begin : dst_fsm
126 dst_fsm_d = dst_fsm_q;
127 dst_req_o = 1'b0;
128 dst_ack = 1'b0;
129
130 unique case (dst_fsm_q)
131 LoSt: begin
132 if (dst_req) begin
133 // Forward the request.
134 dst_req_o = 1'b1;
135 // Wait for the request and acknowledge to be asserted
136 // before responding to the SRC side.
137 if (dst_ack_i) begin
138 dst_fsm_d = HiSt;
139 end
140 end
141 end
142 HiSt: begin
143 dst_ack = 1'b1;
144 // Wait for the request to drop back to zero.
145 if (!dst_req) begin
146 dst_fsm_d = LoSt;
147 end
148 end
149 //VCS coverage off
150 // pragma coverage off
151 default: ;
152 //VCS coverage on
153 // pragma coverage on
154 endcase
155 end
156
157 // Move REQ over to DST domain.
158 prim_flop_2sync #(
159 .Width(1)
160 ) req_sync (
161 .clk_i (clk_dst_i),
162 .rst_ni (rst_dst_ni),
163 .d_i (src_req),
164 .q_o (dst_req)
165 );
166
167 // Registers
168 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
169 if (!rst_dst_ni) begin
170 dst_fsm_q <= LoSt;
171 end else begin
172 dst_fsm_q <= dst_fsm_d;
173 end
174 end
175
176 end else begin : gen_nrz_hs_protocol
177 //////////////////
178 // NRZ protocol //
179 //////////////////
180
181 // Types
182 typedef enum logic {
183 EVEN, ODD
184 } sync_reqack_fsm_e;
185
186 // Signals
187 sync_reqack_fsm_e src_fsm_ns, src_fsm_cs;
188 sync_reqack_fsm_e dst_fsm_ns, dst_fsm_cs;
189
190 logic src_req_d, src_req_q, src_ack;
191 logic dst_ack_d, dst_ack_q, dst_req;
192 logic src_handshake, dst_handshake;
193
194 1/1 assign src_handshake = src_req_i & src_ack_o;
Tests: T4 T5 T6
195 1/1 assign dst_handshake = dst_req_o & dst_ack_i;
Tests: T4 T5 T6
196
197 // Move REQ over to DST domain.
198 prim_flop_2sync #(
199 .Width(1)
200 ) req_sync (
201 .clk_i (clk_dst_i),
202 .rst_ni (rst_dst_ni),
203 .d_i (src_req_q),
204 .q_o (dst_req)
205 );
206
207 // Move ACK over to SRC domain.
208 prim_flop_2sync #(
209 .Width(1)
210 ) ack_sync (
211 .clk_i (clk_src_i),
212 .rst_ni (rst_src_ni),
213 .d_i (dst_ack_q),
214 .q_o (src_ack)
215 );
216
217 // REQ-side FSM (SRC domain)
218 always_comb begin : src_fsm
219 1/1 src_fsm_ns = src_fsm_cs;
Tests: T4 T5 T6
220
221 // By default, we keep the internal REQ value and don't ACK.
222 1/1 src_req_d = src_req_q;
Tests: T4 T5 T6
223 1/1 src_ack_o = 1'b0;
Tests: T4 T5 T6
224
225 1/1 unique case (src_fsm_cs)
Tests: T4 T5 T6
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 1/1 src_req_d = src_req_i;
Tests: T4 T5 T6
230 1/1 src_ack_o = src_ack;
Tests: T4 T5 T6
231
232 // The handshake is done for exactly 1 clock cycle.
233 1/1 if (src_handshake) begin
Tests: T4 T5 T6
234 1/1 src_fsm_ns = ODD;
Tests: T4 T5 T6
235 end
MISSING_ELSE
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 1/1 src_req_d = ~src_req_i;
Tests: T4 T5 T6
242 1/1 src_ack_o = ~src_ack;
Tests: T4 T5 T6
243
244 // The handshake is done for exactly 1 clock cycle.
245 1/1 if (src_handshake) begin
Tests: T4 T5 T6
246 1/1 src_fsm_ns = EVEN;
Tests: T4 T5 T6
247 end
MISSING_ELSE
248 end
249
250 //VCS coverage off
251 // pragma coverage off
252
253 default: ;
254
255 //VCS coverage on
256 // pragma coverage on
257
258 endcase
259 end
260
261 // ACK-side FSM (DST domain)
262 always_comb begin : dst_fsm
263 1/1 dst_fsm_ns = dst_fsm_cs;
Tests: T4 T5 T6
264
265 // By default, we don't REQ and keep the internal ACK.
266 1/1 dst_req_o = 1'b0;
Tests: T4 T5 T6
267 1/1 dst_ack_d = dst_ack_q;
Tests: T4 T5 T6
268
269 1/1 unique case (dst_fsm_cs)
Tests: T4 T5 T6
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 1/1 dst_req_o = dst_req;
Tests: T4 T5 T6
274 1/1 dst_ack_d = dst_ack_i;
Tests: T4 T5 T6
275
276 // The handshake is done for exactly 1 clock cycle.
277 1/1 if (dst_handshake) begin
Tests: T4 T5 T6
278 1/1 dst_fsm_ns = ODD;
Tests: T4 T5 T6
279 end
MISSING_ELSE
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 1/1 dst_req_o = ~dst_req;
Tests: T4 T5 T6
286 1/1 dst_ack_d = ~dst_ack_i;
Tests: T4 T5 T6
287
288 // The handshake is done for exactly 1 clock cycle.
289 1/1 if (dst_handshake) begin
Tests: T4 T5 T6
290 1/1 dst_fsm_ns = EVEN;
Tests: T4 T5 T6
291 end
MISSING_ELSE
292 end
293
294 //VCS coverage off
295 // pragma coverage off
296
297 default: ;
298
299 //VCS coverage on
300 // pragma coverage on
301
302 endcase
303 end
304
305 // Registers
306 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
307 1/1 if (!rst_src_ni) begin
Tests: T4 T5 T6
308 1/1 src_fsm_cs <= EVEN;
Tests: T4 T5 T6
309 1/1 src_req_q <= 1'b0;
Tests: T4 T5 T6
310 end else begin
311 1/1 src_fsm_cs <= src_fsm_ns;
Tests: T4 T5 T6
312 1/1 src_req_q <= src_req_d;
Tests: T4 T5 T6
313 end
314 end
315 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
316 1/1 if (!rst_dst_ni) begin
Tests: T4 T5 T6
317 1/1 dst_fsm_cs <= EVEN;
Tests: T4 T5 T6
318 1/1 dst_ack_q <= 1'b0;
Tests: T4 T5 T6
319 end else begin
320 1/1 dst_fsm_cs <= dst_fsm_ns;
Tests: T4 T5 T6
321 1/1 dst_ack_q <= dst_ack_d;
Tests: T4 T5 T6
322 end
323 end
324 end
325
326 ////////////////
327 // Assertions //
328 ////////////////
329
330 `ifdef INC_ASSERT
331 //VCS coverage off
332 // pragma coverage off
333
334 logic effective_rst_n;
335 unreachable assign effective_rst_n = rst_src_ni && rst_dst_ni;
336
337 logic chk_flag;
338 always_ff @(posedge clk_src_i or negedge effective_rst_n) begin
339 unreachable if (!effective_rst_n) begin
340 unreachable chk_flag <= '0;
341 unreachable end else if (src_req_i && !chk_flag) begin
342 unreachable chk_flag <= 1'b1;
343 end
==> MISSING_ELSE
Cond Coverage for Module :
prim_sync_reqack
| Total | Covered | Percent |
Conditions | 6 | 3 | 50.00 |
Logical | 6 | 3 | 50.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 194
EXPRESSION (src_req_i & src_ack_o)
----1---- ----2----
-1- | -2- | Status | Tests |
0 | 1 | Not Covered | |
1 | 0 | Covered | T4,T5,T6 |
1 | 1 | Covered | T4,T5,T6 |
LINE 195
EXPRESSION (dst_req_o & dst_ack_i)
----1---- ----2----
-1- | -2- | Status | Tests |
0 | 1 | Not Covered | |
1 | 0 | Not Covered | |
1 | 1 | Covered | T4,T5,T6 |
Branch Coverage for Module :
prim_sync_reqack
| Line No. | Total | Covered | Percent |
Branches |
|
12 |
12 |
100.00 |
CASE |
225 |
4 |
4 |
100.00 |
CASE |
269 |
4 |
4 |
100.00 |
IF |
307 |
2 |
2 |
100.00 |
IF |
316 |
2 |
2 |
100.00 |
225 unique case (src_fsm_cs)
-1-
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 src_req_d = src_req_i;
230 src_ack_o = src_ack;
231
232 // The handshake is done for exactly 1 clock cycle.
233 if (src_handshake) begin
-2-
234 src_fsm_ns = ODD;
==>
235 end
MISSING_ELSE
==>
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 src_req_d = ~src_req_i;
242 src_ack_o = ~src_ack;
243
244 // The handshake is done for exactly 1 clock cycle.
245 if (src_handshake) begin
-3-
246 src_fsm_ns = EVEN;
==>
247 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T4,T5,T6 |
EVEN |
0 |
- |
Covered |
T4,T5,T6 |
ODD |
- |
1 |
Covered |
T4,T5,T6 |
ODD |
- |
0 |
Covered |
T4,T5,T6 |
269 unique case (dst_fsm_cs)
-1-
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 dst_req_o = dst_req;
274 dst_ack_d = dst_ack_i;
275
276 // The handshake is done for exactly 1 clock cycle.
277 if (dst_handshake) begin
-2-
278 dst_fsm_ns = ODD;
==>
279 end
MISSING_ELSE
==>
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 dst_req_o = ~dst_req;
286 dst_ack_d = ~dst_ack_i;
287
288 // The handshake is done for exactly 1 clock cycle.
289 if (dst_handshake) begin
-3-
290 dst_fsm_ns = EVEN;
==>
291 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T4,T5,T6 |
EVEN |
0 |
- |
Covered |
T4,T5,T6 |
ODD |
- |
1 |
Covered |
T4,T5,T6 |
ODD |
- |
0 |
Covered |
T4,T5,T6 |
307 if (!rst_src_ni) begin
-1-
308 src_fsm_cs <= EVEN;
==>
309 src_req_q <= 1'b0;
310 end else begin
311 src_fsm_cs <= src_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
316 if (!rst_dst_ni) begin
-1-
317 dst_fsm_cs <= EVEN;
==>
318 dst_ack_q <= 1'b0;
319 end else begin
320 dst_fsm_cs <= dst_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
Assert Coverage for Module :
prim_sync_reqack
Assertion Details
SyncReqAckAckNeedsReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
705195610 |
1654678 |
0 |
0 |
T4 |
813 |
24 |
0 |
0 |
T5 |
981 |
30 |
0 |
0 |
T6 |
1188 |
35 |
0 |
0 |
T7 |
54981 |
6 |
0 |
0 |
T8 |
0 |
8 |
0 |
0 |
T9 |
0 |
28 |
0 |
0 |
T10 |
10140 |
0 |
0 |
0 |
T11 |
0 |
18 |
0 |
0 |
T12 |
0 |
11 |
0 |
0 |
T13 |
0 |
19 |
0 |
0 |
T16 |
0 |
13 |
0 |
0 |
T17 |
0 |
3 |
0 |
0 |
T27 |
33429 |
3 |
0 |
0 |
T28 |
1125 |
32 |
0 |
0 |
T29 |
700 |
20 |
0 |
0 |
T30 |
756 |
22 |
0 |
0 |
T31 |
4318 |
138 |
0 |
0 |
T32 |
1001 |
32 |
0 |
0 |
T33 |
2941 |
95 |
0 |
0 |
T34 |
4720 |
151 |
0 |
0 |
T35 |
0 |
11 |
0 |
0 |
T36 |
0 |
14 |
0 |
0 |
T37 |
2274 |
0 |
0 |
0 |
T38 |
2564 |
0 |
0 |
0 |
T39 |
6813 |
0 |
0 |
0 |
T40 |
652 |
0 |
0 |
0 |
T41 |
752 |
0 |
0 |
0 |
T42 |
2815 |
0 |
0 |
0 |
T43 |
2088 |
0 |
0 |
0 |
T44 |
32206 |
0 |
0 |
0 |
SyncReqAckHoldReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
625291451 |
71809 |
0 |
0 |
T1 |
0 |
10 |
0 |
0 |
T2 |
0 |
14 |
0 |
0 |
T3 |
0 |
10 |
0 |
0 |
T7 |
299872 |
45 |
0 |
0 |
T8 |
0 |
8 |
0 |
0 |
T9 |
0 |
57 |
0 |
0 |
T10 |
12709 |
12 |
0 |
0 |
T11 |
0 |
49 |
0 |
0 |
T12 |
0 |
26 |
0 |
0 |
T13 |
0 |
26 |
0 |
0 |
T14 |
0 |
11 |
0 |
0 |
T15 |
0 |
21 |
0 |
0 |
T16 |
0 |
20 |
0 |
0 |
T17 |
0 |
6 |
0 |
0 |
T18 |
5407 |
0 |
0 |
0 |
T19 |
68936 |
0 |
0 |
0 |
T20 |
2236 |
0 |
0 |
0 |
T21 |
411 |
0 |
0 |
0 |
T22 |
24020 |
0 |
0 |
0 |
T23 |
5134 |
0 |
0 |
0 |
T24 |
8546 |
0 |
0 |
0 |
T25 |
10950 |
0 |
0 |
0 |
T26 |
704 |
0 |
0 |
0 |
T27 |
32678 |
18 |
0 |
0 |
T35 |
0 |
35 |
0 |
0 |
T36 |
0 |
18 |
0 |
0 |
T37 |
4439 |
0 |
0 |
0 |
T38 |
9434 |
0 |
0 |
0 |
T39 |
13567 |
4 |
0 |
0 |
T40 |
1267 |
0 |
0 |
0 |
T41 |
2659 |
0 |
0 |
0 |
T42 |
26966 |
0 |
0 |
0 |
T43 |
9974 |
0 |
0 |
0 |
T44 |
24419 |
12 |
0 |
0 |
T45 |
42622 |
12 |
0 |
0 |
T46 |
0 |
4 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_io_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
| Line No. | Total | Covered | Percent |
TOTAL | | 36 | 36 | 100.00 |
CONT_ASSIGN | 55 | 0 | 0 | |
CONT_ASSIGN | 194 | 1 | 1 | 100.00 |
CONT_ASSIGN | 195 | 1 | 1 | 100.00 |
ALWAYS | 219 | 12 | 12 | 100.00 |
ALWAYS | 263 | 12 | 12 | 100.00 |
ALWAYS | 307 | 5 | 5 | 100.00 |
ALWAYS | 316 | 5 | 5 | 100.00 |
CONT_ASSIGN | 335 | 0 | 0 | |
ALWAYS | 339 | 0 | 0 | |
54 logic unused_req_chk;
55 unreachable assign unused_req_chk = req_chk_i;
56
57 if (EnRzHs) begin : gen_rz_hs_protocol
58 //////////////////
59 // RZ protocol //
60 //////////////////
61
62 // Types
63 typedef enum logic {
64 LoSt, HiSt
65 } rz_fsm_e;
66
67 // Signals
68 rz_fsm_e src_fsm_d, src_fsm_q;
69 rz_fsm_e dst_fsm_d, dst_fsm_q;
70 logic src_ack, dst_ack;
71 logic src_req, dst_req;
72
73 // REQ-side FSM (SRC domain)
74 always_comb begin : src_fsm
75 src_fsm_d = src_fsm_q;
76 src_ack_o = 1'b0;
77 src_req = 1'b0;
78
79 unique case (src_fsm_q)
80 LoSt: begin
81 // Wait for the ack to go back to zero before starting
82 // a new transaction.
83 if (!src_ack && src_req_i) begin
84 src_fsm_d = HiSt;
85 end
86 end
87 HiSt: begin
88 src_req = 1'b1;
89 // Forward the acknowledgement.
90 src_ack_o = src_ack;
91 // If request drops out, we go back to LoSt.
92 // If DST side asserts ack, we also go back to LoSt.
93 if (!src_req_i || src_ack) begin
94 src_fsm_d = LoSt;
95 end
96 end
97 //VCS coverage off
98 // pragma coverage off
99 default: ;
100 //VCS coverage on
101 // pragma coverage on
102 endcase
103 end
104
105 // Move ACK over to SRC domain.
106 prim_flop_2sync #(
107 .Width(1)
108 ) ack_sync (
109 .clk_i (clk_src_i),
110 .rst_ni (rst_src_ni),
111 .d_i (dst_ack),
112 .q_o (src_ack)
113 );
114
115 // Registers
116 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
117 if (!rst_src_ni) begin
118 src_fsm_q <= LoSt;
119 end else begin
120 src_fsm_q <= src_fsm_d;
121 end
122 end
123
124 // ACK-side FSM (DST domain)
125 always_comb begin : dst_fsm
126 dst_fsm_d = dst_fsm_q;
127 dst_req_o = 1'b0;
128 dst_ack = 1'b0;
129
130 unique case (dst_fsm_q)
131 LoSt: begin
132 if (dst_req) begin
133 // Forward the request.
134 dst_req_o = 1'b1;
135 // Wait for the request and acknowledge to be asserted
136 // before responding to the SRC side.
137 if (dst_ack_i) begin
138 dst_fsm_d = HiSt;
139 end
140 end
141 end
142 HiSt: begin
143 dst_ack = 1'b1;
144 // Wait for the request to drop back to zero.
145 if (!dst_req) begin
146 dst_fsm_d = LoSt;
147 end
148 end
149 //VCS coverage off
150 // pragma coverage off
151 default: ;
152 //VCS coverage on
153 // pragma coverage on
154 endcase
155 end
156
157 // Move REQ over to DST domain.
158 prim_flop_2sync #(
159 .Width(1)
160 ) req_sync (
161 .clk_i (clk_dst_i),
162 .rst_ni (rst_dst_ni),
163 .d_i (src_req),
164 .q_o (dst_req)
165 );
166
167 // Registers
168 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
169 if (!rst_dst_ni) begin
170 dst_fsm_q <= LoSt;
171 end else begin
172 dst_fsm_q <= dst_fsm_d;
173 end
174 end
175
176 end else begin : gen_nrz_hs_protocol
177 //////////////////
178 // NRZ protocol //
179 //////////////////
180
181 // Types
182 typedef enum logic {
183 EVEN, ODD
184 } sync_reqack_fsm_e;
185
186 // Signals
187 sync_reqack_fsm_e src_fsm_ns, src_fsm_cs;
188 sync_reqack_fsm_e dst_fsm_ns, dst_fsm_cs;
189
190 logic src_req_d, src_req_q, src_ack;
191 logic dst_ack_d, dst_ack_q, dst_req;
192 logic src_handshake, dst_handshake;
193
194 1/1 assign src_handshake = src_req_i & src_ack_o;
Tests: T4 T5 T6
195 1/1 assign dst_handshake = dst_req_o & dst_ack_i;
Tests: T4 T5 T6
196
197 // Move REQ over to DST domain.
198 prim_flop_2sync #(
199 .Width(1)
200 ) req_sync (
201 .clk_i (clk_dst_i),
202 .rst_ni (rst_dst_ni),
203 .d_i (src_req_q),
204 .q_o (dst_req)
205 );
206
207 // Move ACK over to SRC domain.
208 prim_flop_2sync #(
209 .Width(1)
210 ) ack_sync (
211 .clk_i (clk_src_i),
212 .rst_ni (rst_src_ni),
213 .d_i (dst_ack_q),
214 .q_o (src_ack)
215 );
216
217 // REQ-side FSM (SRC domain)
218 always_comb begin : src_fsm
219 1/1 src_fsm_ns = src_fsm_cs;
Tests: T4 T5 T6
220
221 // By default, we keep the internal REQ value and don't ACK.
222 1/1 src_req_d = src_req_q;
Tests: T4 T5 T6
223 1/1 src_ack_o = 1'b0;
Tests: T4 T5 T6
224
225 1/1 unique case (src_fsm_cs)
Tests: T4 T5 T6
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 1/1 src_req_d = src_req_i;
Tests: T4 T5 T6
230 1/1 src_ack_o = src_ack;
Tests: T4 T5 T6
231
232 // The handshake is done for exactly 1 clock cycle.
233 1/1 if (src_handshake) begin
Tests: T4 T5 T6
234 1/1 src_fsm_ns = ODD;
Tests: T4 T5 T6
235 end
MISSING_ELSE
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 1/1 src_req_d = ~src_req_i;
Tests: T4 T5 T6
242 1/1 src_ack_o = ~src_ack;
Tests: T4 T5 T6
243
244 // The handshake is done for exactly 1 clock cycle.
245 1/1 if (src_handshake) begin
Tests: T4 T5 T6
246 1/1 src_fsm_ns = EVEN;
Tests: T4 T5 T6
247 end
MISSING_ELSE
248 end
249
250 //VCS coverage off
251 // pragma coverage off
252
253 default: ;
254
255 //VCS coverage on
256 // pragma coverage on
257
258 endcase
259 end
260
261 // ACK-side FSM (DST domain)
262 always_comb begin : dst_fsm
263 1/1 dst_fsm_ns = dst_fsm_cs;
Tests: T4 T5 T6
264
265 // By default, we don't REQ and keep the internal ACK.
266 1/1 dst_req_o = 1'b0;
Tests: T4 T5 T6
267 1/1 dst_ack_d = dst_ack_q;
Tests: T4 T5 T6
268
269 1/1 unique case (dst_fsm_cs)
Tests: T4 T5 T6
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 1/1 dst_req_o = dst_req;
Tests: T4 T5 T6
274 1/1 dst_ack_d = dst_ack_i;
Tests: T4 T5 T6
275
276 // The handshake is done for exactly 1 clock cycle.
277 1/1 if (dst_handshake) begin
Tests: T4 T5 T6
278 1/1 dst_fsm_ns = ODD;
Tests: T4 T5 T6
279 end
MISSING_ELSE
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 1/1 dst_req_o = ~dst_req;
Tests: T4 T5 T6
286 1/1 dst_ack_d = ~dst_ack_i;
Tests: T4 T5 T6
287
288 // The handshake is done for exactly 1 clock cycle.
289 1/1 if (dst_handshake) begin
Tests: T4 T5 T6
290 1/1 dst_fsm_ns = EVEN;
Tests: T4 T5 T6
291 end
MISSING_ELSE
292 end
293
294 //VCS coverage off
295 // pragma coverage off
296
297 default: ;
298
299 //VCS coverage on
300 // pragma coverage on
301
302 endcase
303 end
304
305 // Registers
306 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
307 1/1 if (!rst_src_ni) begin
Tests: T4 T5 T6
308 1/1 src_fsm_cs <= EVEN;
Tests: T4 T5 T6
309 1/1 src_req_q <= 1'b0;
Tests: T4 T5 T6
310 end else begin
311 1/1 src_fsm_cs <= src_fsm_ns;
Tests: T4 T5 T6
312 1/1 src_req_q <= src_req_d;
Tests: T4 T5 T6
313 end
314 end
315 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
316 1/1 if (!rst_dst_ni) begin
Tests: T4 T5 T6
317 1/1 dst_fsm_cs <= EVEN;
Tests: T4 T5 T6
318 1/1 dst_ack_q <= 1'b0;
Tests: T4 T5 T6
319 end else begin
320 1/1 dst_fsm_cs <= dst_fsm_ns;
Tests: T4 T5 T6
321 1/1 dst_ack_q <= dst_ack_d;
Tests: T4 T5 T6
322 end
323 end
324 end
325
326 ////////////////
327 // Assertions //
328 ////////////////
329
330 `ifdef INC_ASSERT
331 //VCS coverage off
332 // pragma coverage off
333
334 logic effective_rst_n;
335 unreachable assign effective_rst_n = rst_src_ni && rst_dst_ni;
336
337 logic chk_flag;
338 always_ff @(posedge clk_src_i or negedge effective_rst_n) begin
339 unreachable if (!effective_rst_n) begin
340 unreachable chk_flag <= '0;
341 unreachable end else if (src_req_i && !chk_flag) begin
342 unreachable chk_flag <= 1'b1;
343 end
==> MISSING_ELSE
Cond Coverage for Instance : tb.dut.u_io_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
| Total | Covered | Percent |
Conditions | 3 | 3 | 100.00 |
Logical | 3 | 3 | 100.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 194
EXPRESSION (src_req_i & src_ack_o)
----1---- ----2----
-1- | -2- | Status | Tests |
0 | 1 | Unreachable | |
1 | 0 | Covered | T4,T5,T6 |
1 | 1 | Covered | T4,T5,T6 |
LINE 195
EXPRESSION (dst_req_o & dst_ack_i)
----1---- ----2----
-1- | -2- | Status | Tests | Exclude Annotation |
0 | 1 | Excluded | |
VC_COV_UNR |
1 | 0 | Excluded | |
VC_COV_UNR |
1 | 1 | Covered | T4,T5,T6 |
Branch Coverage for Instance : tb.dut.u_io_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
| Line No. | Total | Covered | Percent |
Branches |
|
12 |
12 |
100.00 |
CASE |
225 |
4 |
4 |
100.00 |
CASE |
269 |
4 |
4 |
100.00 |
IF |
307 |
2 |
2 |
100.00 |
IF |
316 |
2 |
2 |
100.00 |
225 unique case (src_fsm_cs)
-1-
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 src_req_d = src_req_i;
230 src_ack_o = src_ack;
231
232 // The handshake is done for exactly 1 clock cycle.
233 if (src_handshake) begin
-2-
234 src_fsm_ns = ODD;
==>
235 end
MISSING_ELSE
==>
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 src_req_d = ~src_req_i;
242 src_ack_o = ~src_ack;
243
244 // The handshake is done for exactly 1 clock cycle.
245 if (src_handshake) begin
-3-
246 src_fsm_ns = EVEN;
==>
247 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T4,T5,T6 |
EVEN |
0 |
- |
Covered |
T4,T5,T6 |
ODD |
- |
1 |
Covered |
T4,T5,T6 |
ODD |
- |
0 |
Covered |
T4,T5,T6 |
269 unique case (dst_fsm_cs)
-1-
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 dst_req_o = dst_req;
274 dst_ack_d = dst_ack_i;
275
276 // The handshake is done for exactly 1 clock cycle.
277 if (dst_handshake) begin
-2-
278 dst_fsm_ns = ODD;
==>
279 end
MISSING_ELSE
==>
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 dst_req_o = ~dst_req;
286 dst_ack_d = ~dst_ack_i;
287
288 // The handshake is done for exactly 1 clock cycle.
289 if (dst_handshake) begin
-3-
290 dst_fsm_ns = EVEN;
==>
291 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T4,T5,T6 |
EVEN |
0 |
- |
Covered |
T4,T5,T6 |
ODD |
- |
1 |
Covered |
T4,T5,T6 |
ODD |
- |
0 |
Covered |
T4,T5,T6 |
307 if (!rst_src_ni) begin
-1-
308 src_fsm_cs <= EVEN;
==>
309 src_req_q <= 1'b0;
310 end else begin
311 src_fsm_cs <= src_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
316 if (!rst_dst_ni) begin
-1-
317 dst_fsm_cs <= EVEN;
==>
318 dst_ack_q <= 1'b0;
319 end else begin
320 dst_fsm_cs <= dst_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
Assert Coverage for Instance : tb.dut.u_io_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
Assertion Details
SyncReqAckAckNeedsReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
90243933 |
317850 |
0 |
0 |
T4 |
1698 |
24 |
0 |
0 |
T5 |
2055 |
30 |
0 |
0 |
T6 |
2314 |
35 |
0 |
0 |
T28 |
2002 |
32 |
0 |
0 |
T29 |
1508 |
21 |
0 |
0 |
T30 |
1467 |
22 |
0 |
0 |
T31 |
8771 |
138 |
0 |
0 |
T32 |
2137 |
32 |
0 |
0 |
T33 |
6017 |
95 |
0 |
0 |
T34 |
9560 |
151 |
0 |
0 |
SyncReqAckHoldReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
1468064 |
0 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_io_div2_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
| Line No. | Total | Covered | Percent |
TOTAL | | 36 | 36 | 100.00 |
CONT_ASSIGN | 55 | 0 | 0 | |
CONT_ASSIGN | 194 | 1 | 1 | 100.00 |
CONT_ASSIGN | 195 | 1 | 1 | 100.00 |
ALWAYS | 219 | 12 | 12 | 100.00 |
ALWAYS | 263 | 12 | 12 | 100.00 |
ALWAYS | 307 | 5 | 5 | 100.00 |
ALWAYS | 316 | 5 | 5 | 100.00 |
CONT_ASSIGN | 335 | 0 | 0 | |
ALWAYS | 339 | 0 | 0 | |
54 logic unused_req_chk;
55 unreachable assign unused_req_chk = req_chk_i;
56
57 if (EnRzHs) begin : gen_rz_hs_protocol
58 //////////////////
59 // RZ protocol //
60 //////////////////
61
62 // Types
63 typedef enum logic {
64 LoSt, HiSt
65 } rz_fsm_e;
66
67 // Signals
68 rz_fsm_e src_fsm_d, src_fsm_q;
69 rz_fsm_e dst_fsm_d, dst_fsm_q;
70 logic src_ack, dst_ack;
71 logic src_req, dst_req;
72
73 // REQ-side FSM (SRC domain)
74 always_comb begin : src_fsm
75 src_fsm_d = src_fsm_q;
76 src_ack_o = 1'b0;
77 src_req = 1'b0;
78
79 unique case (src_fsm_q)
80 LoSt: begin
81 // Wait for the ack to go back to zero before starting
82 // a new transaction.
83 if (!src_ack && src_req_i) begin
84 src_fsm_d = HiSt;
85 end
86 end
87 HiSt: begin
88 src_req = 1'b1;
89 // Forward the acknowledgement.
90 src_ack_o = src_ack;
91 // If request drops out, we go back to LoSt.
92 // If DST side asserts ack, we also go back to LoSt.
93 if (!src_req_i || src_ack) begin
94 src_fsm_d = LoSt;
95 end
96 end
97 //VCS coverage off
98 // pragma coverage off
99 default: ;
100 //VCS coverage on
101 // pragma coverage on
102 endcase
103 end
104
105 // Move ACK over to SRC domain.
106 prim_flop_2sync #(
107 .Width(1)
108 ) ack_sync (
109 .clk_i (clk_src_i),
110 .rst_ni (rst_src_ni),
111 .d_i (dst_ack),
112 .q_o (src_ack)
113 );
114
115 // Registers
116 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
117 if (!rst_src_ni) begin
118 src_fsm_q <= LoSt;
119 end else begin
120 src_fsm_q <= src_fsm_d;
121 end
122 end
123
124 // ACK-side FSM (DST domain)
125 always_comb begin : dst_fsm
126 dst_fsm_d = dst_fsm_q;
127 dst_req_o = 1'b0;
128 dst_ack = 1'b0;
129
130 unique case (dst_fsm_q)
131 LoSt: begin
132 if (dst_req) begin
133 // Forward the request.
134 dst_req_o = 1'b1;
135 // Wait for the request and acknowledge to be asserted
136 // before responding to the SRC side.
137 if (dst_ack_i) begin
138 dst_fsm_d = HiSt;
139 end
140 end
141 end
142 HiSt: begin
143 dst_ack = 1'b1;
144 // Wait for the request to drop back to zero.
145 if (!dst_req) begin
146 dst_fsm_d = LoSt;
147 end
148 end
149 //VCS coverage off
150 // pragma coverage off
151 default: ;
152 //VCS coverage on
153 // pragma coverage on
154 endcase
155 end
156
157 // Move REQ over to DST domain.
158 prim_flop_2sync #(
159 .Width(1)
160 ) req_sync (
161 .clk_i (clk_dst_i),
162 .rst_ni (rst_dst_ni),
163 .d_i (src_req),
164 .q_o (dst_req)
165 );
166
167 // Registers
168 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
169 if (!rst_dst_ni) begin
170 dst_fsm_q <= LoSt;
171 end else begin
172 dst_fsm_q <= dst_fsm_d;
173 end
174 end
175
176 end else begin : gen_nrz_hs_protocol
177 //////////////////
178 // NRZ protocol //
179 //////////////////
180
181 // Types
182 typedef enum logic {
183 EVEN, ODD
184 } sync_reqack_fsm_e;
185
186 // Signals
187 sync_reqack_fsm_e src_fsm_ns, src_fsm_cs;
188 sync_reqack_fsm_e dst_fsm_ns, dst_fsm_cs;
189
190 logic src_req_d, src_req_q, src_ack;
191 logic dst_ack_d, dst_ack_q, dst_req;
192 logic src_handshake, dst_handshake;
193
194 1/1 assign src_handshake = src_req_i & src_ack_o;
Tests: T4 T5 T6
195 1/1 assign dst_handshake = dst_req_o & dst_ack_i;
Tests: T4 T5 T6
196
197 // Move REQ over to DST domain.
198 prim_flop_2sync #(
199 .Width(1)
200 ) req_sync (
201 .clk_i (clk_dst_i),
202 .rst_ni (rst_dst_ni),
203 .d_i (src_req_q),
204 .q_o (dst_req)
205 );
206
207 // Move ACK over to SRC domain.
208 prim_flop_2sync #(
209 .Width(1)
210 ) ack_sync (
211 .clk_i (clk_src_i),
212 .rst_ni (rst_src_ni),
213 .d_i (dst_ack_q),
214 .q_o (src_ack)
215 );
216
217 // REQ-side FSM (SRC domain)
218 always_comb begin : src_fsm
219 1/1 src_fsm_ns = src_fsm_cs;
Tests: T4 T5 T6
220
221 // By default, we keep the internal REQ value and don't ACK.
222 1/1 src_req_d = src_req_q;
Tests: T4 T5 T6
223 1/1 src_ack_o = 1'b0;
Tests: T4 T5 T6
224
225 1/1 unique case (src_fsm_cs)
Tests: T4 T5 T6
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 1/1 src_req_d = src_req_i;
Tests: T4 T5 T6
230 1/1 src_ack_o = src_ack;
Tests: T4 T5 T6
231
232 // The handshake is done for exactly 1 clock cycle.
233 1/1 if (src_handshake) begin
Tests: T4 T5 T6
234 1/1 src_fsm_ns = ODD;
Tests: T4 T5 T6
235 end
MISSING_ELSE
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 1/1 src_req_d = ~src_req_i;
Tests: T4 T5 T6
242 1/1 src_ack_o = ~src_ack;
Tests: T4 T5 T6
243
244 // The handshake is done for exactly 1 clock cycle.
245 1/1 if (src_handshake) begin
Tests: T4 T5 T6
246 1/1 src_fsm_ns = EVEN;
Tests: T4 T5 T6
247 end
MISSING_ELSE
248 end
249
250 //VCS coverage off
251 // pragma coverage off
252
253 default: ;
254
255 //VCS coverage on
256 // pragma coverage on
257
258 endcase
259 end
260
261 // ACK-side FSM (DST domain)
262 always_comb begin : dst_fsm
263 1/1 dst_fsm_ns = dst_fsm_cs;
Tests: T4 T5 T6
264
265 // By default, we don't REQ and keep the internal ACK.
266 1/1 dst_req_o = 1'b0;
Tests: T4 T5 T6
267 1/1 dst_ack_d = dst_ack_q;
Tests: T4 T5 T6
268
269 1/1 unique case (dst_fsm_cs)
Tests: T4 T5 T6
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 1/1 dst_req_o = dst_req;
Tests: T4 T5 T6
274 1/1 dst_ack_d = dst_ack_i;
Tests: T4 T5 T6
275
276 // The handshake is done for exactly 1 clock cycle.
277 1/1 if (dst_handshake) begin
Tests: T4 T5 T6
278 1/1 dst_fsm_ns = ODD;
Tests: T4 T5 T6
279 end
MISSING_ELSE
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 1/1 dst_req_o = ~dst_req;
Tests: T4 T5 T6
286 1/1 dst_ack_d = ~dst_ack_i;
Tests: T4 T5 T6
287
288 // The handshake is done for exactly 1 clock cycle.
289 1/1 if (dst_handshake) begin
Tests: T4 T5 T6
290 1/1 dst_fsm_ns = EVEN;
Tests: T4 T5 T6
291 end
MISSING_ELSE
292 end
293
294 //VCS coverage off
295 // pragma coverage off
296
297 default: ;
298
299 //VCS coverage on
300 // pragma coverage on
301
302 endcase
303 end
304
305 // Registers
306 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
307 1/1 if (!rst_src_ni) begin
Tests: T4 T5 T6
308 1/1 src_fsm_cs <= EVEN;
Tests: T4 T5 T6
309 1/1 src_req_q <= 1'b0;
Tests: T4 T5 T6
310 end else begin
311 1/1 src_fsm_cs <= src_fsm_ns;
Tests: T4 T5 T6
312 1/1 src_req_q <= src_req_d;
Tests: T4 T5 T6
313 end
314 end
315 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
316 1/1 if (!rst_dst_ni) begin
Tests: T4 T5 T6
317 1/1 dst_fsm_cs <= EVEN;
Tests: T4 T5 T6
318 1/1 dst_ack_q <= 1'b0;
Tests: T4 T5 T6
319 end else begin
320 1/1 dst_fsm_cs <= dst_fsm_ns;
Tests: T4 T5 T6
321 1/1 dst_ack_q <= dst_ack_d;
Tests: T4 T5 T6
322 end
323 end
324 end
325
326 ////////////////
327 // Assertions //
328 ////////////////
329
330 `ifdef INC_ASSERT
331 //VCS coverage off
332 // pragma coverage off
333
334 logic effective_rst_n;
335 unreachable assign effective_rst_n = rst_src_ni && rst_dst_ni;
336
337 logic chk_flag;
338 always_ff @(posedge clk_src_i or negedge effective_rst_n) begin
339 unreachable if (!effective_rst_n) begin
340 unreachable chk_flag <= '0;
341 unreachable end else if (src_req_i && !chk_flag) begin
342 unreachable chk_flag <= 1'b1;
343 end
==> MISSING_ELSE
Cond Coverage for Instance : tb.dut.u_io_div2_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
| Total | Covered | Percent |
Conditions | 3 | 3 | 100.00 |
Logical | 3 | 3 | 100.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 194
EXPRESSION (src_req_i & src_ack_o)
----1---- ----2----
-1- | -2- | Status | Tests |
0 | 1 | Unreachable | |
1 | 0 | Covered | T4,T5,T6 |
1 | 1 | Covered | T4,T5,T6 |
LINE 195
EXPRESSION (dst_req_o & dst_ack_i)
----1---- ----2----
-1- | -2- | Status | Tests | Exclude Annotation |
0 | 1 | Excluded | |
VC_COV_UNR |
1 | 0 | Excluded | |
VC_COV_UNR |
1 | 1 | Covered | T4,T5,T6 |
Branch Coverage for Instance : tb.dut.u_io_div2_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
| Line No. | Total | Covered | Percent |
Branches |
|
12 |
12 |
100.00 |
CASE |
225 |
4 |
4 |
100.00 |
CASE |
269 |
4 |
4 |
100.00 |
IF |
307 |
2 |
2 |
100.00 |
IF |
316 |
2 |
2 |
100.00 |
225 unique case (src_fsm_cs)
-1-
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 src_req_d = src_req_i;
230 src_ack_o = src_ack;
231
232 // The handshake is done for exactly 1 clock cycle.
233 if (src_handshake) begin
-2-
234 src_fsm_ns = ODD;
==>
235 end
MISSING_ELSE
==>
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 src_req_d = ~src_req_i;
242 src_ack_o = ~src_ack;
243
244 // The handshake is done for exactly 1 clock cycle.
245 if (src_handshake) begin
-3-
246 src_fsm_ns = EVEN;
==>
247 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T4,T5,T6 |
EVEN |
0 |
- |
Covered |
T4,T5,T6 |
ODD |
- |
1 |
Covered |
T4,T5,T6 |
ODD |
- |
0 |
Covered |
T4,T5,T6 |
269 unique case (dst_fsm_cs)
-1-
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 dst_req_o = dst_req;
274 dst_ack_d = dst_ack_i;
275
276 // The handshake is done for exactly 1 clock cycle.
277 if (dst_handshake) begin
-2-
278 dst_fsm_ns = ODD;
==>
279 end
MISSING_ELSE
==>
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 dst_req_o = ~dst_req;
286 dst_ack_d = ~dst_ack_i;
287
288 // The handshake is done for exactly 1 clock cycle.
289 if (dst_handshake) begin
-3-
290 dst_fsm_ns = EVEN;
==>
291 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T4,T5,T6 |
EVEN |
0 |
- |
Covered |
T4,T5,T6 |
ODD |
- |
1 |
Covered |
T4,T5,T6 |
ODD |
- |
0 |
Covered |
T4,T5,T6 |
307 if (!rst_src_ni) begin
-1-
308 src_fsm_cs <= EVEN;
==>
309 src_req_q <= 1'b0;
310 end else begin
311 src_fsm_cs <= src_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
316 if (!rst_dst_ni) begin
-1-
317 dst_fsm_cs <= EVEN;
==>
318 dst_ack_q <= 1'b0;
319 end else begin
320 dst_fsm_cs <= dst_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
Assert Coverage for Instance : tb.dut.u_io_div2_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
Assertion Details
SyncReqAckAckNeedsReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
44418973 |
317727 |
0 |
0 |
T4 |
813 |
24 |
0 |
0 |
T5 |
981 |
30 |
0 |
0 |
T6 |
1188 |
35 |
0 |
0 |
T28 |
1125 |
32 |
0 |
0 |
T29 |
700 |
20 |
0 |
0 |
T30 |
756 |
22 |
0 |
0 |
T31 |
4318 |
138 |
0 |
0 |
T32 |
1001 |
32 |
0 |
0 |
T33 |
2941 |
95 |
0 |
0 |
T34 |
4720 |
151 |
0 |
0 |
SyncReqAckHoldReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
1468064 |
0 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_io_div4_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
| Line No. | Total | Covered | Percent |
TOTAL | | 36 | 36 | 100.00 |
CONT_ASSIGN | 55 | 0 | 0 | |
CONT_ASSIGN | 194 | 1 | 1 | 100.00 |
CONT_ASSIGN | 195 | 1 | 1 | 100.00 |
ALWAYS | 219 | 12 | 12 | 100.00 |
ALWAYS | 263 | 12 | 12 | 100.00 |
ALWAYS | 307 | 5 | 5 | 100.00 |
ALWAYS | 316 | 5 | 5 | 100.00 |
CONT_ASSIGN | 335 | 0 | 0 | |
ALWAYS | 339 | 0 | 0 | |
54 logic unused_req_chk;
55 unreachable assign unused_req_chk = req_chk_i;
56
57 if (EnRzHs) begin : gen_rz_hs_protocol
58 //////////////////
59 // RZ protocol //
60 //////////////////
61
62 // Types
63 typedef enum logic {
64 LoSt, HiSt
65 } rz_fsm_e;
66
67 // Signals
68 rz_fsm_e src_fsm_d, src_fsm_q;
69 rz_fsm_e dst_fsm_d, dst_fsm_q;
70 logic src_ack, dst_ack;
71 logic src_req, dst_req;
72
73 // REQ-side FSM (SRC domain)
74 always_comb begin : src_fsm
75 src_fsm_d = src_fsm_q;
76 src_ack_o = 1'b0;
77 src_req = 1'b0;
78
79 unique case (src_fsm_q)
80 LoSt: begin
81 // Wait for the ack to go back to zero before starting
82 // a new transaction.
83 if (!src_ack && src_req_i) begin
84 src_fsm_d = HiSt;
85 end
86 end
87 HiSt: begin
88 src_req = 1'b1;
89 // Forward the acknowledgement.
90 src_ack_o = src_ack;
91 // If request drops out, we go back to LoSt.
92 // If DST side asserts ack, we also go back to LoSt.
93 if (!src_req_i || src_ack) begin
94 src_fsm_d = LoSt;
95 end
96 end
97 //VCS coverage off
98 // pragma coverage off
99 default: ;
100 //VCS coverage on
101 // pragma coverage on
102 endcase
103 end
104
105 // Move ACK over to SRC domain.
106 prim_flop_2sync #(
107 .Width(1)
108 ) ack_sync (
109 .clk_i (clk_src_i),
110 .rst_ni (rst_src_ni),
111 .d_i (dst_ack),
112 .q_o (src_ack)
113 );
114
115 // Registers
116 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
117 if (!rst_src_ni) begin
118 src_fsm_q <= LoSt;
119 end else begin
120 src_fsm_q <= src_fsm_d;
121 end
122 end
123
124 // ACK-side FSM (DST domain)
125 always_comb begin : dst_fsm
126 dst_fsm_d = dst_fsm_q;
127 dst_req_o = 1'b0;
128 dst_ack = 1'b0;
129
130 unique case (dst_fsm_q)
131 LoSt: begin
132 if (dst_req) begin
133 // Forward the request.
134 dst_req_o = 1'b1;
135 // Wait for the request and acknowledge to be asserted
136 // before responding to the SRC side.
137 if (dst_ack_i) begin
138 dst_fsm_d = HiSt;
139 end
140 end
141 end
142 HiSt: begin
143 dst_ack = 1'b1;
144 // Wait for the request to drop back to zero.
145 if (!dst_req) begin
146 dst_fsm_d = LoSt;
147 end
148 end
149 //VCS coverage off
150 // pragma coverage off
151 default: ;
152 //VCS coverage on
153 // pragma coverage on
154 endcase
155 end
156
157 // Move REQ over to DST domain.
158 prim_flop_2sync #(
159 .Width(1)
160 ) req_sync (
161 .clk_i (clk_dst_i),
162 .rst_ni (rst_dst_ni),
163 .d_i (src_req),
164 .q_o (dst_req)
165 );
166
167 // Registers
168 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
169 if (!rst_dst_ni) begin
170 dst_fsm_q <= LoSt;
171 end else begin
172 dst_fsm_q <= dst_fsm_d;
173 end
174 end
175
176 end else begin : gen_nrz_hs_protocol
177 //////////////////
178 // NRZ protocol //
179 //////////////////
180
181 // Types
182 typedef enum logic {
183 EVEN, ODD
184 } sync_reqack_fsm_e;
185
186 // Signals
187 sync_reqack_fsm_e src_fsm_ns, src_fsm_cs;
188 sync_reqack_fsm_e dst_fsm_ns, dst_fsm_cs;
189
190 logic src_req_d, src_req_q, src_ack;
191 logic dst_ack_d, dst_ack_q, dst_req;
192 logic src_handshake, dst_handshake;
193
194 1/1 assign src_handshake = src_req_i & src_ack_o;
Tests: T4 T5 T6
195 1/1 assign dst_handshake = dst_req_o & dst_ack_i;
Tests: T4 T5 T6
196
197 // Move REQ over to DST domain.
198 prim_flop_2sync #(
199 .Width(1)
200 ) req_sync (
201 .clk_i (clk_dst_i),
202 .rst_ni (rst_dst_ni),
203 .d_i (src_req_q),
204 .q_o (dst_req)
205 );
206
207 // Move ACK over to SRC domain.
208 prim_flop_2sync #(
209 .Width(1)
210 ) ack_sync (
211 .clk_i (clk_src_i),
212 .rst_ni (rst_src_ni),
213 .d_i (dst_ack_q),
214 .q_o (src_ack)
215 );
216
217 // REQ-side FSM (SRC domain)
218 always_comb begin : src_fsm
219 1/1 src_fsm_ns = src_fsm_cs;
Tests: T4 T5 T6
220
221 // By default, we keep the internal REQ value and don't ACK.
222 1/1 src_req_d = src_req_q;
Tests: T4 T5 T6
223 1/1 src_ack_o = 1'b0;
Tests: T4 T5 T6
224
225 1/1 unique case (src_fsm_cs)
Tests: T4 T5 T6
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 1/1 src_req_d = src_req_i;
Tests: T4 T5 T6
230 1/1 src_ack_o = src_ack;
Tests: T4 T5 T6
231
232 // The handshake is done for exactly 1 clock cycle.
233 1/1 if (src_handshake) begin
Tests: T4 T5 T6
234 1/1 src_fsm_ns = ODD;
Tests: T4 T5 T6
235 end
MISSING_ELSE
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 1/1 src_req_d = ~src_req_i;
Tests: T4 T5 T6
242 1/1 src_ack_o = ~src_ack;
Tests: T4 T5 T6
243
244 // The handshake is done for exactly 1 clock cycle.
245 1/1 if (src_handshake) begin
Tests: T4 T5 T6
246 1/1 src_fsm_ns = EVEN;
Tests: T4 T5 T6
247 end
MISSING_ELSE
248 end
249
250 //VCS coverage off
251 // pragma coverage off
252
253 default: ;
254
255 //VCS coverage on
256 // pragma coverage on
257
258 endcase
259 end
260
261 // ACK-side FSM (DST domain)
262 always_comb begin : dst_fsm
263 1/1 dst_fsm_ns = dst_fsm_cs;
Tests: T4 T5 T6
264
265 // By default, we don't REQ and keep the internal ACK.
266 1/1 dst_req_o = 1'b0;
Tests: T4 T5 T6
267 1/1 dst_ack_d = dst_ack_q;
Tests: T4 T5 T6
268
269 1/1 unique case (dst_fsm_cs)
Tests: T4 T5 T6
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 1/1 dst_req_o = dst_req;
Tests: T4 T5 T6
274 1/1 dst_ack_d = dst_ack_i;
Tests: T4 T5 T6
275
276 // The handshake is done for exactly 1 clock cycle.
277 1/1 if (dst_handshake) begin
Tests: T4 T5 T6
278 1/1 dst_fsm_ns = ODD;
Tests: T4 T5 T6
279 end
MISSING_ELSE
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 1/1 dst_req_o = ~dst_req;
Tests: T4 T5 T6
286 1/1 dst_ack_d = ~dst_ack_i;
Tests: T4 T5 T6
287
288 // The handshake is done for exactly 1 clock cycle.
289 1/1 if (dst_handshake) begin
Tests: T4 T5 T6
290 1/1 dst_fsm_ns = EVEN;
Tests: T4 T5 T6
291 end
MISSING_ELSE
292 end
293
294 //VCS coverage off
295 // pragma coverage off
296
297 default: ;
298
299 //VCS coverage on
300 // pragma coverage on
301
302 endcase
303 end
304
305 // Registers
306 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
307 1/1 if (!rst_src_ni) begin
Tests: T4 T5 T6
308 1/1 src_fsm_cs <= EVEN;
Tests: T4 T5 T6
309 1/1 src_req_q <= 1'b0;
Tests: T4 T5 T6
310 end else begin
311 1/1 src_fsm_cs <= src_fsm_ns;
Tests: T4 T5 T6
312 1/1 src_req_q <= src_req_d;
Tests: T4 T5 T6
313 end
314 end
315 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
316 1/1 if (!rst_dst_ni) begin
Tests: T4 T5 T6
317 1/1 dst_fsm_cs <= EVEN;
Tests: T4 T5 T6
318 1/1 dst_ack_q <= 1'b0;
Tests: T4 T5 T6
319 end else begin
320 1/1 dst_fsm_cs <= dst_fsm_ns;
Tests: T4 T5 T6
321 1/1 dst_ack_q <= dst_ack_d;
Tests: T4 T5 T6
322 end
323 end
324 end
325
326 ////////////////
327 // Assertions //
328 ////////////////
329
330 `ifdef INC_ASSERT
331 //VCS coverage off
332 // pragma coverage off
333
334 logic effective_rst_n;
335 unreachable assign effective_rst_n = rst_src_ni && rst_dst_ni;
336
337 logic chk_flag;
338 always_ff @(posedge clk_src_i or negedge effective_rst_n) begin
339 unreachable if (!effective_rst_n) begin
340 unreachable chk_flag <= '0;
341 unreachable end else if (src_req_i && !chk_flag) begin
342 unreachable chk_flag <= 1'b1;
343 end
==> MISSING_ELSE
Cond Coverage for Instance : tb.dut.u_io_div4_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
| Total | Covered | Percent |
Conditions | 3 | 3 | 100.00 |
Logical | 3 | 3 | 100.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 194
EXPRESSION (src_req_i & src_ack_o)
----1---- ----2----
-1- | -2- | Status | Tests |
0 | 1 | Unreachable | |
1 | 0 | Covered | T4,T5,T6 |
1 | 1 | Covered | T4,T5,T6 |
LINE 195
EXPRESSION (dst_req_o & dst_ack_i)
----1---- ----2----
-1- | -2- | Status | Tests | Exclude Annotation |
0 | 1 | Excluded | |
VC_COV_UNR |
1 | 0 | Excluded | |
VC_COV_UNR |
1 | 1 | Covered | T4,T5,T6 |
Branch Coverage for Instance : tb.dut.u_io_div4_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
| Line No. | Total | Covered | Percent |
Branches |
|
12 |
12 |
100.00 |
CASE |
225 |
4 |
4 |
100.00 |
CASE |
269 |
4 |
4 |
100.00 |
IF |
307 |
2 |
2 |
100.00 |
IF |
316 |
2 |
2 |
100.00 |
225 unique case (src_fsm_cs)
-1-
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 src_req_d = src_req_i;
230 src_ack_o = src_ack;
231
232 // The handshake is done for exactly 1 clock cycle.
233 if (src_handshake) begin
-2-
234 src_fsm_ns = ODD;
==>
235 end
MISSING_ELSE
==>
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 src_req_d = ~src_req_i;
242 src_ack_o = ~src_ack;
243
244 // The handshake is done for exactly 1 clock cycle.
245 if (src_handshake) begin
-3-
246 src_fsm_ns = EVEN;
==>
247 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T4,T5,T6 |
EVEN |
0 |
- |
Covered |
T4,T5,T6 |
ODD |
- |
1 |
Covered |
T4,T5,T6 |
ODD |
- |
0 |
Covered |
T4,T5,T6 |
269 unique case (dst_fsm_cs)
-1-
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 dst_req_o = dst_req;
274 dst_ack_d = dst_ack_i;
275
276 // The handshake is done for exactly 1 clock cycle.
277 if (dst_handshake) begin
-2-
278 dst_fsm_ns = ODD;
==>
279 end
MISSING_ELSE
==>
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 dst_req_o = ~dst_req;
286 dst_ack_d = ~dst_ack_i;
287
288 // The handshake is done for exactly 1 clock cycle.
289 if (dst_handshake) begin
-3-
290 dst_fsm_ns = EVEN;
==>
291 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T4,T5,T6 |
EVEN |
0 |
- |
Covered |
T4,T5,T6 |
ODD |
- |
1 |
Covered |
T4,T5,T6 |
ODD |
- |
0 |
Covered |
T4,T5,T6 |
307 if (!rst_src_ni) begin
-1-
308 src_fsm_cs <= EVEN;
==>
309 src_req_q <= 1'b0;
310 end else begin
311 src_fsm_cs <= src_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
316 if (!rst_dst_ni) begin
-1-
317 dst_fsm_cs <= EVEN;
==>
318 dst_ack_q <= 1'b0;
319 end else begin
320 dst_fsm_cs <= dst_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
Assert Coverage for Instance : tb.dut.u_io_div4_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
Assertion Details
SyncReqAckAckNeedsReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
22209072 |
304629 |
0 |
0 |
T4 |
407 |
23 |
0 |
0 |
T5 |
490 |
28 |
0 |
0 |
T6 |
593 |
33 |
0 |
0 |
T28 |
562 |
31 |
0 |
0 |
T29 |
350 |
20 |
0 |
0 |
T30 |
377 |
21 |
0 |
0 |
T31 |
2159 |
131 |
0 |
0 |
T32 |
501 |
30 |
0 |
0 |
T33 |
1471 |
90 |
0 |
0 |
T34 |
2360 |
144 |
0 |
0 |
SyncReqAckHoldReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
1468064 |
0 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_main_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
| Line No. | Total | Covered | Percent |
TOTAL | | 36 | 36 | 100.00 |
CONT_ASSIGN | 55 | 0 | 0 | |
CONT_ASSIGN | 194 | 1 | 1 | 100.00 |
CONT_ASSIGN | 195 | 1 | 1 | 100.00 |
ALWAYS | 219 | 12 | 12 | 100.00 |
ALWAYS | 263 | 12 | 12 | 100.00 |
ALWAYS | 307 | 5 | 5 | 100.00 |
ALWAYS | 316 | 5 | 5 | 100.00 |
CONT_ASSIGN | 335 | 0 | 0 | |
ALWAYS | 339 | 0 | 0 | |
54 logic unused_req_chk;
55 unreachable assign unused_req_chk = req_chk_i;
56
57 if (EnRzHs) begin : gen_rz_hs_protocol
58 //////////////////
59 // RZ protocol //
60 //////////////////
61
62 // Types
63 typedef enum logic {
64 LoSt, HiSt
65 } rz_fsm_e;
66
67 // Signals
68 rz_fsm_e src_fsm_d, src_fsm_q;
69 rz_fsm_e dst_fsm_d, dst_fsm_q;
70 logic src_ack, dst_ack;
71 logic src_req, dst_req;
72
73 // REQ-side FSM (SRC domain)
74 always_comb begin : src_fsm
75 src_fsm_d = src_fsm_q;
76 src_ack_o = 1'b0;
77 src_req = 1'b0;
78
79 unique case (src_fsm_q)
80 LoSt: begin
81 // Wait for the ack to go back to zero before starting
82 // a new transaction.
83 if (!src_ack && src_req_i) begin
84 src_fsm_d = HiSt;
85 end
86 end
87 HiSt: begin
88 src_req = 1'b1;
89 // Forward the acknowledgement.
90 src_ack_o = src_ack;
91 // If request drops out, we go back to LoSt.
92 // If DST side asserts ack, we also go back to LoSt.
93 if (!src_req_i || src_ack) begin
94 src_fsm_d = LoSt;
95 end
96 end
97 //VCS coverage off
98 // pragma coverage off
99 default: ;
100 //VCS coverage on
101 // pragma coverage on
102 endcase
103 end
104
105 // Move ACK over to SRC domain.
106 prim_flop_2sync #(
107 .Width(1)
108 ) ack_sync (
109 .clk_i (clk_src_i),
110 .rst_ni (rst_src_ni),
111 .d_i (dst_ack),
112 .q_o (src_ack)
113 );
114
115 // Registers
116 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
117 if (!rst_src_ni) begin
118 src_fsm_q <= LoSt;
119 end else begin
120 src_fsm_q <= src_fsm_d;
121 end
122 end
123
124 // ACK-side FSM (DST domain)
125 always_comb begin : dst_fsm
126 dst_fsm_d = dst_fsm_q;
127 dst_req_o = 1'b0;
128 dst_ack = 1'b0;
129
130 unique case (dst_fsm_q)
131 LoSt: begin
132 if (dst_req) begin
133 // Forward the request.
134 dst_req_o = 1'b1;
135 // Wait for the request and acknowledge to be asserted
136 // before responding to the SRC side.
137 if (dst_ack_i) begin
138 dst_fsm_d = HiSt;
139 end
140 end
141 end
142 HiSt: begin
143 dst_ack = 1'b1;
144 // Wait for the request to drop back to zero.
145 if (!dst_req) begin
146 dst_fsm_d = LoSt;
147 end
148 end
149 //VCS coverage off
150 // pragma coverage off
151 default: ;
152 //VCS coverage on
153 // pragma coverage on
154 endcase
155 end
156
157 // Move REQ over to DST domain.
158 prim_flop_2sync #(
159 .Width(1)
160 ) req_sync (
161 .clk_i (clk_dst_i),
162 .rst_ni (rst_dst_ni),
163 .d_i (src_req),
164 .q_o (dst_req)
165 );
166
167 // Registers
168 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
169 if (!rst_dst_ni) begin
170 dst_fsm_q <= LoSt;
171 end else begin
172 dst_fsm_q <= dst_fsm_d;
173 end
174 end
175
176 end else begin : gen_nrz_hs_protocol
177 //////////////////
178 // NRZ protocol //
179 //////////////////
180
181 // Types
182 typedef enum logic {
183 EVEN, ODD
184 } sync_reqack_fsm_e;
185
186 // Signals
187 sync_reqack_fsm_e src_fsm_ns, src_fsm_cs;
188 sync_reqack_fsm_e dst_fsm_ns, dst_fsm_cs;
189
190 logic src_req_d, src_req_q, src_ack;
191 logic dst_ack_d, dst_ack_q, dst_req;
192 logic src_handshake, dst_handshake;
193
194 1/1 assign src_handshake = src_req_i & src_ack_o;
Tests: T4 T5 T6
195 1/1 assign dst_handshake = dst_req_o & dst_ack_i;
Tests: T4 T5 T6
196
197 // Move REQ over to DST domain.
198 prim_flop_2sync #(
199 .Width(1)
200 ) req_sync (
201 .clk_i (clk_dst_i),
202 .rst_ni (rst_dst_ni),
203 .d_i (src_req_q),
204 .q_o (dst_req)
205 );
206
207 // Move ACK over to SRC domain.
208 prim_flop_2sync #(
209 .Width(1)
210 ) ack_sync (
211 .clk_i (clk_src_i),
212 .rst_ni (rst_src_ni),
213 .d_i (dst_ack_q),
214 .q_o (src_ack)
215 );
216
217 // REQ-side FSM (SRC domain)
218 always_comb begin : src_fsm
219 1/1 src_fsm_ns = src_fsm_cs;
Tests: T4 T5 T6
220
221 // By default, we keep the internal REQ value and don't ACK.
222 1/1 src_req_d = src_req_q;
Tests: T4 T5 T6
223 1/1 src_ack_o = 1'b0;
Tests: T4 T5 T6
224
225 1/1 unique case (src_fsm_cs)
Tests: T4 T5 T6
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 1/1 src_req_d = src_req_i;
Tests: T4 T5 T6
230 1/1 src_ack_o = src_ack;
Tests: T4 T5 T6
231
232 // The handshake is done for exactly 1 clock cycle.
233 1/1 if (src_handshake) begin
Tests: T4 T5 T6
234 1/1 src_fsm_ns = ODD;
Tests: T4 T5 T6
235 end
MISSING_ELSE
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 1/1 src_req_d = ~src_req_i;
Tests: T4 T5 T6
242 1/1 src_ack_o = ~src_ack;
Tests: T4 T5 T6
243
244 // The handshake is done for exactly 1 clock cycle.
245 1/1 if (src_handshake) begin
Tests: T4 T5 T6
246 1/1 src_fsm_ns = EVEN;
Tests: T4 T5 T6
247 end
MISSING_ELSE
248 end
249
250 //VCS coverage off
251 // pragma coverage off
252
253 default: ;
254
255 //VCS coverage on
256 // pragma coverage on
257
258 endcase
259 end
260
261 // ACK-side FSM (DST domain)
262 always_comb begin : dst_fsm
263 1/1 dst_fsm_ns = dst_fsm_cs;
Tests: T4 T5 T6
264
265 // By default, we don't REQ and keep the internal ACK.
266 1/1 dst_req_o = 1'b0;
Tests: T4 T5 T6
267 1/1 dst_ack_d = dst_ack_q;
Tests: T4 T5 T6
268
269 1/1 unique case (dst_fsm_cs)
Tests: T4 T5 T6
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 1/1 dst_req_o = dst_req;
Tests: T4 T5 T6
274 1/1 dst_ack_d = dst_ack_i;
Tests: T4 T5 T6
275
276 // The handshake is done for exactly 1 clock cycle.
277 1/1 if (dst_handshake) begin
Tests: T4 T5 T6
278 1/1 dst_fsm_ns = ODD;
Tests: T4 T5 T6
279 end
MISSING_ELSE
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 1/1 dst_req_o = ~dst_req;
Tests: T4 T5 T6
286 1/1 dst_ack_d = ~dst_ack_i;
Tests: T4 T5 T6
287
288 // The handshake is done for exactly 1 clock cycle.
289 1/1 if (dst_handshake) begin
Tests: T4 T5 T6
290 1/1 dst_fsm_ns = EVEN;
Tests: T4 T5 T6
291 end
MISSING_ELSE
292 end
293
294 //VCS coverage off
295 // pragma coverage off
296
297 default: ;
298
299 //VCS coverage on
300 // pragma coverage on
301
302 endcase
303 end
304
305 // Registers
306 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
307 1/1 if (!rst_src_ni) begin
Tests: T4 T5 T6
308 1/1 src_fsm_cs <= EVEN;
Tests: T4 T5 T6
309 1/1 src_req_q <= 1'b0;
Tests: T4 T5 T6
310 end else begin
311 1/1 src_fsm_cs <= src_fsm_ns;
Tests: T4 T5 T6
312 1/1 src_req_q <= src_req_d;
Tests: T4 T5 T6
313 end
314 end
315 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
316 1/1 if (!rst_dst_ni) begin
Tests: T4 T5 T6
317 1/1 dst_fsm_cs <= EVEN;
Tests: T4 T5 T6
318 1/1 dst_ack_q <= 1'b0;
Tests: T4 T5 T6
319 end else begin
320 1/1 dst_fsm_cs <= dst_fsm_ns;
Tests: T4 T5 T6
321 1/1 dst_ack_q <= dst_ack_d;
Tests: T4 T5 T6
322 end
323 end
324 end
325
326 ////////////////
327 // Assertions //
328 ////////////////
329
330 `ifdef INC_ASSERT
331 //VCS coverage off
332 // pragma coverage off
333
334 logic effective_rst_n;
335 unreachable assign effective_rst_n = rst_src_ni && rst_dst_ni;
336
337 logic chk_flag;
338 always_ff @(posedge clk_src_i or negedge effective_rst_n) begin
339 unreachable if (!effective_rst_n) begin
340 unreachable chk_flag <= '0;
341 unreachable end else if (src_req_i && !chk_flag) begin
342 unreachable chk_flag <= 1'b1;
343 end
==> MISSING_ELSE
Cond Coverage for Instance : tb.dut.u_main_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
| Total | Covered | Percent |
Conditions | 3 | 3 | 100.00 |
Logical | 3 | 3 | 100.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 194
EXPRESSION (src_req_i & src_ack_o)
----1---- ----2----
-1- | -2- | Status | Tests |
0 | 1 | Unreachable | |
1 | 0 | Covered | T4,T5,T6 |
1 | 1 | Covered | T4,T5,T6 |
LINE 195
EXPRESSION (dst_req_o & dst_ack_i)
----1---- ----2----
-1- | -2- | Status | Tests | Exclude Annotation |
0 | 1 | Excluded | |
VC_COV_UNR |
1 | 0 | Excluded | |
VC_COV_UNR |
1 | 1 | Covered | T4,T5,T6 |
Branch Coverage for Instance : tb.dut.u_main_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
| Line No. | Total | Covered | Percent |
Branches |
|
12 |
12 |
100.00 |
CASE |
225 |
4 |
4 |
100.00 |
CASE |
269 |
4 |
4 |
100.00 |
IF |
307 |
2 |
2 |
100.00 |
IF |
316 |
2 |
2 |
100.00 |
225 unique case (src_fsm_cs)
-1-
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 src_req_d = src_req_i;
230 src_ack_o = src_ack;
231
232 // The handshake is done for exactly 1 clock cycle.
233 if (src_handshake) begin
-2-
234 src_fsm_ns = ODD;
==>
235 end
MISSING_ELSE
==>
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 src_req_d = ~src_req_i;
242 src_ack_o = ~src_ack;
243
244 // The handshake is done for exactly 1 clock cycle.
245 if (src_handshake) begin
-3-
246 src_fsm_ns = EVEN;
==>
247 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T4,T5,T6 |
EVEN |
0 |
- |
Covered |
T4,T5,T6 |
ODD |
- |
1 |
Covered |
T4,T5,T6 |
ODD |
- |
0 |
Covered |
T4,T5,T6 |
269 unique case (dst_fsm_cs)
-1-
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 dst_req_o = dst_req;
274 dst_ack_d = dst_ack_i;
275
276 // The handshake is done for exactly 1 clock cycle.
277 if (dst_handshake) begin
-2-
278 dst_fsm_ns = ODD;
==>
279 end
MISSING_ELSE
==>
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 dst_req_o = ~dst_req;
286 dst_ack_d = ~dst_ack_i;
287
288 // The handshake is done for exactly 1 clock cycle.
289 if (dst_handshake) begin
-3-
290 dst_fsm_ns = EVEN;
==>
291 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T4,T5,T6 |
EVEN |
0 |
- |
Covered |
T4,T5,T6 |
ODD |
- |
1 |
Covered |
T4,T5,T6 |
ODD |
- |
0 |
Covered |
T4,T5,T6 |
307 if (!rst_src_ni) begin
-1-
308 src_fsm_cs <= EVEN;
==>
309 src_req_q <= 1'b0;
310 end else begin
311 src_fsm_cs <= src_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
316 if (!rst_dst_ni) begin
-1-
317 dst_fsm_cs <= EVEN;
==>
318 dst_ack_q <= 1'b0;
319 end else begin
320 dst_fsm_cs <= dst_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
Assert Coverage for Instance : tb.dut.u_main_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
Assertion Details
SyncReqAckAckNeedsReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
99737448 |
320003 |
0 |
0 |
T4 |
1768 |
24 |
0 |
0 |
T5 |
2141 |
30 |
0 |
0 |
T6 |
2411 |
35 |
0 |
0 |
T28 |
2085 |
32 |
0 |
0 |
T29 |
1562 |
21 |
0 |
0 |
T30 |
1528 |
22 |
0 |
0 |
T31 |
9137 |
138 |
0 |
0 |
T32 |
2226 |
32 |
0 |
0 |
T33 |
6267 |
95 |
0 |
0 |
T34 |
9958 |
151 |
0 |
0 |
SyncReqAckHoldReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
1468064 |
0 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_usb_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
| Line No. | Total | Covered | Percent |
TOTAL | | 36 | 36 | 100.00 |
CONT_ASSIGN | 55 | 0 | 0 | |
CONT_ASSIGN | 194 | 1 | 1 | 100.00 |
CONT_ASSIGN | 195 | 1 | 1 | 100.00 |
ALWAYS | 219 | 12 | 12 | 100.00 |
ALWAYS | 263 | 12 | 12 | 100.00 |
ALWAYS | 307 | 5 | 5 | 100.00 |
ALWAYS | 316 | 5 | 5 | 100.00 |
CONT_ASSIGN | 335 | 0 | 0 | |
ALWAYS | 339 | 0 | 0 | |
54 logic unused_req_chk;
55 unreachable assign unused_req_chk = req_chk_i;
56
57 if (EnRzHs) begin : gen_rz_hs_protocol
58 //////////////////
59 // RZ protocol //
60 //////////////////
61
62 // Types
63 typedef enum logic {
64 LoSt, HiSt
65 } rz_fsm_e;
66
67 // Signals
68 rz_fsm_e src_fsm_d, src_fsm_q;
69 rz_fsm_e dst_fsm_d, dst_fsm_q;
70 logic src_ack, dst_ack;
71 logic src_req, dst_req;
72
73 // REQ-side FSM (SRC domain)
74 always_comb begin : src_fsm
75 src_fsm_d = src_fsm_q;
76 src_ack_o = 1'b0;
77 src_req = 1'b0;
78
79 unique case (src_fsm_q)
80 LoSt: begin
81 // Wait for the ack to go back to zero before starting
82 // a new transaction.
83 if (!src_ack && src_req_i) begin
84 src_fsm_d = HiSt;
85 end
86 end
87 HiSt: begin
88 src_req = 1'b1;
89 // Forward the acknowledgement.
90 src_ack_o = src_ack;
91 // If request drops out, we go back to LoSt.
92 // If DST side asserts ack, we also go back to LoSt.
93 if (!src_req_i || src_ack) begin
94 src_fsm_d = LoSt;
95 end
96 end
97 //VCS coverage off
98 // pragma coverage off
99 default: ;
100 //VCS coverage on
101 // pragma coverage on
102 endcase
103 end
104
105 // Move ACK over to SRC domain.
106 prim_flop_2sync #(
107 .Width(1)
108 ) ack_sync (
109 .clk_i (clk_src_i),
110 .rst_ni (rst_src_ni),
111 .d_i (dst_ack),
112 .q_o (src_ack)
113 );
114
115 // Registers
116 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
117 if (!rst_src_ni) begin
118 src_fsm_q <= LoSt;
119 end else begin
120 src_fsm_q <= src_fsm_d;
121 end
122 end
123
124 // ACK-side FSM (DST domain)
125 always_comb begin : dst_fsm
126 dst_fsm_d = dst_fsm_q;
127 dst_req_o = 1'b0;
128 dst_ack = 1'b0;
129
130 unique case (dst_fsm_q)
131 LoSt: begin
132 if (dst_req) begin
133 // Forward the request.
134 dst_req_o = 1'b1;
135 // Wait for the request and acknowledge to be asserted
136 // before responding to the SRC side.
137 if (dst_ack_i) begin
138 dst_fsm_d = HiSt;
139 end
140 end
141 end
142 HiSt: begin
143 dst_ack = 1'b1;
144 // Wait for the request to drop back to zero.
145 if (!dst_req) begin
146 dst_fsm_d = LoSt;
147 end
148 end
149 //VCS coverage off
150 // pragma coverage off
151 default: ;
152 //VCS coverage on
153 // pragma coverage on
154 endcase
155 end
156
157 // Move REQ over to DST domain.
158 prim_flop_2sync #(
159 .Width(1)
160 ) req_sync (
161 .clk_i (clk_dst_i),
162 .rst_ni (rst_dst_ni),
163 .d_i (src_req),
164 .q_o (dst_req)
165 );
166
167 // Registers
168 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
169 if (!rst_dst_ni) begin
170 dst_fsm_q <= LoSt;
171 end else begin
172 dst_fsm_q <= dst_fsm_d;
173 end
174 end
175
176 end else begin : gen_nrz_hs_protocol
177 //////////////////
178 // NRZ protocol //
179 //////////////////
180
181 // Types
182 typedef enum logic {
183 EVEN, ODD
184 } sync_reqack_fsm_e;
185
186 // Signals
187 sync_reqack_fsm_e src_fsm_ns, src_fsm_cs;
188 sync_reqack_fsm_e dst_fsm_ns, dst_fsm_cs;
189
190 logic src_req_d, src_req_q, src_ack;
191 logic dst_ack_d, dst_ack_q, dst_req;
192 logic src_handshake, dst_handshake;
193
194 1/1 assign src_handshake = src_req_i & src_ack_o;
Tests: T4 T5 T6
195 1/1 assign dst_handshake = dst_req_o & dst_ack_i;
Tests: T4 T5 T6
196
197 // Move REQ over to DST domain.
198 prim_flop_2sync #(
199 .Width(1)
200 ) req_sync (
201 .clk_i (clk_dst_i),
202 .rst_ni (rst_dst_ni),
203 .d_i (src_req_q),
204 .q_o (dst_req)
205 );
206
207 // Move ACK over to SRC domain.
208 prim_flop_2sync #(
209 .Width(1)
210 ) ack_sync (
211 .clk_i (clk_src_i),
212 .rst_ni (rst_src_ni),
213 .d_i (dst_ack_q),
214 .q_o (src_ack)
215 );
216
217 // REQ-side FSM (SRC domain)
218 always_comb begin : src_fsm
219 1/1 src_fsm_ns = src_fsm_cs;
Tests: T4 T5 T6
220
221 // By default, we keep the internal REQ value and don't ACK.
222 1/1 src_req_d = src_req_q;
Tests: T4 T5 T6
223 1/1 src_ack_o = 1'b0;
Tests: T4 T5 T6
224
225 1/1 unique case (src_fsm_cs)
Tests: T4 T5 T6
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 1/1 src_req_d = src_req_i;
Tests: T4 T5 T6
230 1/1 src_ack_o = src_ack;
Tests: T4 T5 T6
231
232 // The handshake is done for exactly 1 clock cycle.
233 1/1 if (src_handshake) begin
Tests: T4 T5 T6
234 1/1 src_fsm_ns = ODD;
Tests: T4 T5 T6
235 end
MISSING_ELSE
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 1/1 src_req_d = ~src_req_i;
Tests: T4 T5 T6
242 1/1 src_ack_o = ~src_ack;
Tests: T4 T5 T6
243
244 // The handshake is done for exactly 1 clock cycle.
245 1/1 if (src_handshake) begin
Tests: T4 T5 T6
246 1/1 src_fsm_ns = EVEN;
Tests: T4 T5 T6
247 end
MISSING_ELSE
248 end
249
250 //VCS coverage off
251 // pragma coverage off
252
253 default: ;
254
255 //VCS coverage on
256 // pragma coverage on
257
258 endcase
259 end
260
261 // ACK-side FSM (DST domain)
262 always_comb begin : dst_fsm
263 1/1 dst_fsm_ns = dst_fsm_cs;
Tests: T4 T5 T6
264
265 // By default, we don't REQ and keep the internal ACK.
266 1/1 dst_req_o = 1'b0;
Tests: T4 T5 T6
267 1/1 dst_ack_d = dst_ack_q;
Tests: T4 T5 T6
268
269 1/1 unique case (dst_fsm_cs)
Tests: T4 T5 T6
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 1/1 dst_req_o = dst_req;
Tests: T4 T5 T6
274 1/1 dst_ack_d = dst_ack_i;
Tests: T4 T5 T6
275
276 // The handshake is done for exactly 1 clock cycle.
277 1/1 if (dst_handshake) begin
Tests: T4 T5 T6
278 1/1 dst_fsm_ns = ODD;
Tests: T4 T5 T6
279 end
MISSING_ELSE
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 1/1 dst_req_o = ~dst_req;
Tests: T4 T5 T6
286 1/1 dst_ack_d = ~dst_ack_i;
Tests: T4 T5 T6
287
288 // The handshake is done for exactly 1 clock cycle.
289 1/1 if (dst_handshake) begin
Tests: T4 T5 T6
290 1/1 dst_fsm_ns = EVEN;
Tests: T4 T5 T6
291 end
MISSING_ELSE
292 end
293
294 //VCS coverage off
295 // pragma coverage off
296
297 default: ;
298
299 //VCS coverage on
300 // pragma coverage on
301
302 endcase
303 end
304
305 // Registers
306 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
307 1/1 if (!rst_src_ni) begin
Tests: T4 T5 T6
308 1/1 src_fsm_cs <= EVEN;
Tests: T4 T5 T6
309 1/1 src_req_q <= 1'b0;
Tests: T4 T5 T6
310 end else begin
311 1/1 src_fsm_cs <= src_fsm_ns;
Tests: T4 T5 T6
312 1/1 src_req_q <= src_req_d;
Tests: T4 T5 T6
313 end
314 end
315 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
316 1/1 if (!rst_dst_ni) begin
Tests: T4 T5 T6
317 1/1 dst_fsm_cs <= EVEN;
Tests: T4 T5 T6
318 1/1 dst_ack_q <= 1'b0;
Tests: T4 T5 T6
319 end else begin
320 1/1 dst_fsm_cs <= dst_fsm_ns;
Tests: T4 T5 T6
321 1/1 dst_ack_q <= dst_ack_d;
Tests: T4 T5 T6
322 end
323 end
324 end
325
326 ////////////////
327 // Assertions //
328 ////////////////
329
330 `ifdef INC_ASSERT
331 //VCS coverage off
332 // pragma coverage off
333
334 logic effective_rst_n;
335 unreachable assign effective_rst_n = rst_src_ni && rst_dst_ni;
336
337 logic chk_flag;
338 always_ff @(posedge clk_src_i or negedge effective_rst_n) begin
339 unreachable if (!effective_rst_n) begin
340 unreachable chk_flag <= '0;
341 unreachable end else if (src_req_i && !chk_flag) begin
342 unreachable chk_flag <= 1'b1;
343 end
==> MISSING_ELSE
Cond Coverage for Instance : tb.dut.u_usb_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
| Total | Covered | Percent |
Conditions | 3 | 3 | 100.00 |
Logical | 3 | 3 | 100.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 194
EXPRESSION (src_req_i & src_ack_o)
----1---- ----2----
-1- | -2- | Status | Tests |
0 | 1 | Unreachable | |
1 | 0 | Covered | T4,T5,T6 |
1 | 1 | Covered | T4,T5,T6 |
LINE 195
EXPRESSION (dst_req_o & dst_ack_i)
----1---- ----2----
-1- | -2- | Status | Tests | Exclude Annotation |
0 | 1 | Excluded | |
VC_COV_UNR |
1 | 0 | Excluded | |
VC_COV_UNR |
1 | 1 | Covered | T4,T5,T6 |
Branch Coverage for Instance : tb.dut.u_usb_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
| Line No. | Total | Covered | Percent |
Branches |
|
12 |
12 |
100.00 |
CASE |
225 |
4 |
4 |
100.00 |
CASE |
269 |
4 |
4 |
100.00 |
IF |
307 |
2 |
2 |
100.00 |
IF |
316 |
2 |
2 |
100.00 |
225 unique case (src_fsm_cs)
-1-
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 src_req_d = src_req_i;
230 src_ack_o = src_ack;
231
232 // The handshake is done for exactly 1 clock cycle.
233 if (src_handshake) begin
-2-
234 src_fsm_ns = ODD;
==>
235 end
MISSING_ELSE
==>
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 src_req_d = ~src_req_i;
242 src_ack_o = ~src_ack;
243
244 // The handshake is done for exactly 1 clock cycle.
245 if (src_handshake) begin
-3-
246 src_fsm_ns = EVEN;
==>
247 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T4,T5,T6 |
EVEN |
0 |
- |
Covered |
T4,T5,T6 |
ODD |
- |
1 |
Covered |
T4,T5,T6 |
ODD |
- |
0 |
Covered |
T4,T5,T6 |
269 unique case (dst_fsm_cs)
-1-
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 dst_req_o = dst_req;
274 dst_ack_d = dst_ack_i;
275
276 // The handshake is done for exactly 1 clock cycle.
277 if (dst_handshake) begin
-2-
278 dst_fsm_ns = ODD;
==>
279 end
MISSING_ELSE
==>
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 dst_req_o = ~dst_req;
286 dst_ack_d = ~dst_ack_i;
287
288 // The handshake is done for exactly 1 clock cycle.
289 if (dst_handshake) begin
-3-
290 dst_fsm_ns = EVEN;
==>
291 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T4,T5,T6 |
EVEN |
0 |
- |
Covered |
T4,T5,T6 |
ODD |
- |
1 |
Covered |
T4,T5,T6 |
ODD |
- |
0 |
Covered |
T4,T5,T6 |
307 if (!rst_src_ni) begin
-1-
308 src_fsm_cs <= EVEN;
==>
309 src_req_q <= 1'b0;
310 end else begin
311 src_fsm_cs <= src_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
316 if (!rst_dst_ni) begin
-1-
317 dst_fsm_cs <= EVEN;
==>
318 dst_ack_q <= 1'b0;
319 end else begin
320 dst_fsm_cs <= dst_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
Assert Coverage for Instance : tb.dut.u_usb_meas.u_meas.gen_clk_timeout_chk.u_timeout_ref_to_clk.u_ref_timeout
Assertion Details
SyncReqAckAckNeedsReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
47836459 |
319866 |
0 |
0 |
T4 |
849 |
24 |
0 |
0 |
T5 |
1027 |
30 |
0 |
0 |
T6 |
1157 |
35 |
0 |
0 |
T28 |
1001 |
32 |
0 |
0 |
T29 |
753 |
20 |
0 |
0 |
T30 |
733 |
22 |
0 |
0 |
T31 |
4385 |
138 |
0 |
0 |
T32 |
1069 |
32 |
0 |
0 |
T33 |
3009 |
95 |
0 |
0 |
T34 |
4780 |
151 |
0 |
0 |
SyncReqAckHoldReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
1468064 |
0 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_reg.u_io_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
| Line No. | Total | Covered | Percent |
TOTAL | | 36 | 36 | 100.00 |
CONT_ASSIGN | 55 | 0 | 0 | |
CONT_ASSIGN | 194 | 1 | 1 | 100.00 |
CONT_ASSIGN | 195 | 1 | 1 | 100.00 |
ALWAYS | 219 | 12 | 12 | 100.00 |
ALWAYS | 263 | 12 | 12 | 100.00 |
ALWAYS | 307 | 5 | 5 | 100.00 |
ALWAYS | 316 | 5 | 5 | 100.00 |
CONT_ASSIGN | 335 | 0 | 0 | |
ALWAYS | 339 | 0 | 0 | |
54 logic unused_req_chk;
55 unreachable assign unused_req_chk = req_chk_i;
56
57 if (EnRzHs) begin : gen_rz_hs_protocol
58 //////////////////
59 // RZ protocol //
60 //////////////////
61
62 // Types
63 typedef enum logic {
64 LoSt, HiSt
65 } rz_fsm_e;
66
67 // Signals
68 rz_fsm_e src_fsm_d, src_fsm_q;
69 rz_fsm_e dst_fsm_d, dst_fsm_q;
70 logic src_ack, dst_ack;
71 logic src_req, dst_req;
72
73 // REQ-side FSM (SRC domain)
74 always_comb begin : src_fsm
75 src_fsm_d = src_fsm_q;
76 src_ack_o = 1'b0;
77 src_req = 1'b0;
78
79 unique case (src_fsm_q)
80 LoSt: begin
81 // Wait for the ack to go back to zero before starting
82 // a new transaction.
83 if (!src_ack && src_req_i) begin
84 src_fsm_d = HiSt;
85 end
86 end
87 HiSt: begin
88 src_req = 1'b1;
89 // Forward the acknowledgement.
90 src_ack_o = src_ack;
91 // If request drops out, we go back to LoSt.
92 // If DST side asserts ack, we also go back to LoSt.
93 if (!src_req_i || src_ack) begin
94 src_fsm_d = LoSt;
95 end
96 end
97 //VCS coverage off
98 // pragma coverage off
99 default: ;
100 //VCS coverage on
101 // pragma coverage on
102 endcase
103 end
104
105 // Move ACK over to SRC domain.
106 prim_flop_2sync #(
107 .Width(1)
108 ) ack_sync (
109 .clk_i (clk_src_i),
110 .rst_ni (rst_src_ni),
111 .d_i (dst_ack),
112 .q_o (src_ack)
113 );
114
115 // Registers
116 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
117 if (!rst_src_ni) begin
118 src_fsm_q <= LoSt;
119 end else begin
120 src_fsm_q <= src_fsm_d;
121 end
122 end
123
124 // ACK-side FSM (DST domain)
125 always_comb begin : dst_fsm
126 dst_fsm_d = dst_fsm_q;
127 dst_req_o = 1'b0;
128 dst_ack = 1'b0;
129
130 unique case (dst_fsm_q)
131 LoSt: begin
132 if (dst_req) begin
133 // Forward the request.
134 dst_req_o = 1'b1;
135 // Wait for the request and acknowledge to be asserted
136 // before responding to the SRC side.
137 if (dst_ack_i) begin
138 dst_fsm_d = HiSt;
139 end
140 end
141 end
142 HiSt: begin
143 dst_ack = 1'b1;
144 // Wait for the request to drop back to zero.
145 if (!dst_req) begin
146 dst_fsm_d = LoSt;
147 end
148 end
149 //VCS coverage off
150 // pragma coverage off
151 default: ;
152 //VCS coverage on
153 // pragma coverage on
154 endcase
155 end
156
157 // Move REQ over to DST domain.
158 prim_flop_2sync #(
159 .Width(1)
160 ) req_sync (
161 .clk_i (clk_dst_i),
162 .rst_ni (rst_dst_ni),
163 .d_i (src_req),
164 .q_o (dst_req)
165 );
166
167 // Registers
168 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
169 if (!rst_dst_ni) begin
170 dst_fsm_q <= LoSt;
171 end else begin
172 dst_fsm_q <= dst_fsm_d;
173 end
174 end
175
176 end else begin : gen_nrz_hs_protocol
177 //////////////////
178 // NRZ protocol //
179 //////////////////
180
181 // Types
182 typedef enum logic {
183 EVEN, ODD
184 } sync_reqack_fsm_e;
185
186 // Signals
187 sync_reqack_fsm_e src_fsm_ns, src_fsm_cs;
188 sync_reqack_fsm_e dst_fsm_ns, dst_fsm_cs;
189
190 logic src_req_d, src_req_q, src_ack;
191 logic dst_ack_d, dst_ack_q, dst_req;
192 logic src_handshake, dst_handshake;
193
194 1/1 assign src_handshake = src_req_i & src_ack_o;
Tests: T1 T2 T3
195 1/1 assign dst_handshake = dst_req_o & dst_ack_i;
Tests: T1 T2 T3
196
197 // Move REQ over to DST domain.
198 prim_flop_2sync #(
199 .Width(1)
200 ) req_sync (
201 .clk_i (clk_dst_i),
202 .rst_ni (rst_dst_ni),
203 .d_i (src_req_q),
204 .q_o (dst_req)
205 );
206
207 // Move ACK over to SRC domain.
208 prim_flop_2sync #(
209 .Width(1)
210 ) ack_sync (
211 .clk_i (clk_src_i),
212 .rst_ni (rst_src_ni),
213 .d_i (dst_ack_q),
214 .q_o (src_ack)
215 );
216
217 // REQ-side FSM (SRC domain)
218 always_comb begin : src_fsm
219 1/1 src_fsm_ns = src_fsm_cs;
Tests: T1 T2 T3
220
221 // By default, we keep the internal REQ value and don't ACK.
222 1/1 src_req_d = src_req_q;
Tests: T1 T2 T3
223 1/1 src_ack_o = 1'b0;
Tests: T1 T2 T3
224
225 1/1 unique case (src_fsm_cs)
Tests: T1 T2 T3
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 1/1 src_req_d = src_req_i;
Tests: T1 T2 T3
230 1/1 src_ack_o = src_ack;
Tests: T1 T2 T3
231
232 // The handshake is done for exactly 1 clock cycle.
233 1/1 if (src_handshake) begin
Tests: T1 T2 T3
234 1/1 src_fsm_ns = ODD;
Tests: T1 T2 T3
235 end
MISSING_ELSE
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 1/1 src_req_d = ~src_req_i;
Tests: T1 T2 T3
242 1/1 src_ack_o = ~src_ack;
Tests: T1 T2 T3
243
244 // The handshake is done for exactly 1 clock cycle.
245 1/1 if (src_handshake) begin
Tests: T1 T2 T3
246 1/1 src_fsm_ns = EVEN;
Tests: T1 T2 T3
247 end
MISSING_ELSE
248 end
249
250 //VCS coverage off
251 // pragma coverage off
252
253 default: ;
254
255 //VCS coverage on
256 // pragma coverage on
257
258 endcase
259 end
260
261 // ACK-side FSM (DST domain)
262 always_comb begin : dst_fsm
263 1/1 dst_fsm_ns = dst_fsm_cs;
Tests: T1 T2 T3
264
265 // By default, we don't REQ and keep the internal ACK.
266 1/1 dst_req_o = 1'b0;
Tests: T1 T2 T3
267 1/1 dst_ack_d = dst_ack_q;
Tests: T1 T2 T3
268
269 1/1 unique case (dst_fsm_cs)
Tests: T1 T2 T3
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 1/1 dst_req_o = dst_req;
Tests: T1 T2 T3
274 1/1 dst_ack_d = dst_ack_i;
Tests: T1 T2 T3
275
276 // The handshake is done for exactly 1 clock cycle.
277 1/1 if (dst_handshake) begin
Tests: T1 T2 T3
278 1/1 dst_fsm_ns = ODD;
Tests: T1 T2 T3
279 end
MISSING_ELSE
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 1/1 dst_req_o = ~dst_req;
Tests: T1 T2 T3
286 1/1 dst_ack_d = ~dst_ack_i;
Tests: T1 T2 T3
287
288 // The handshake is done for exactly 1 clock cycle.
289 1/1 if (dst_handshake) begin
Tests: T1 T2 T3
290 1/1 dst_fsm_ns = EVEN;
Tests: T1 T2 T3
291 end
MISSING_ELSE
292 end
293
294 //VCS coverage off
295 // pragma coverage off
296
297 default: ;
298
299 //VCS coverage on
300 // pragma coverage on
301
302 endcase
303 end
304
305 // Registers
306 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
307 1/1 if (!rst_src_ni) begin
Tests: T4 T5 T6
308 1/1 src_fsm_cs <= EVEN;
Tests: T4 T5 T6
309 1/1 src_req_q <= 1'b0;
Tests: T4 T5 T6
310 end else begin
311 1/1 src_fsm_cs <= src_fsm_ns;
Tests: T4 T5 T6
312 1/1 src_req_q <= src_req_d;
Tests: T4 T5 T6
313 end
314 end
315 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
316 1/1 if (!rst_dst_ni) begin
Tests: T4 T5 T6
317 1/1 dst_fsm_cs <= EVEN;
Tests: T4 T5 T6
318 1/1 dst_ack_q <= 1'b0;
Tests: T4 T5 T6
319 end else begin
320 1/1 dst_fsm_cs <= dst_fsm_ns;
Tests: T4 T5 T6
321 1/1 dst_ack_q <= dst_ack_d;
Tests: T4 T5 T6
322 end
323 end
324 end
325
326 ////////////////
327 // Assertions //
328 ////////////////
329
330 `ifdef INC_ASSERT
331 //VCS coverage off
332 // pragma coverage off
333
334 logic effective_rst_n;
335 unreachable assign effective_rst_n = rst_src_ni && rst_dst_ni;
336
337 logic chk_flag;
338 always_ff @(posedge clk_src_i or negedge effective_rst_n) begin
339 unreachable if (!effective_rst_n) begin
340 unreachable chk_flag <= '0;
341 unreachable end else if (src_req_i && !chk_flag) begin
342 unreachable chk_flag <= 1'b1;
343 end
==> MISSING_ELSE
Cond Coverage for Instance : tb.dut.u_reg.u_io_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
| Total | Covered | Percent |
Conditions | 4 | 3 | 75.00 |
Logical | 4 | 3 | 75.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 194
EXPRESSION (src_req_i & src_ack_o)
----1---- ----2----
-1- | -2- | Status | Tests |
0 | 1 | Not Covered | |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T1,T2,T3 |
LINE 195
EXPRESSION (dst_req_o & dst_ack_i)
----1---- ----2----
-1- | -2- | Status | Tests | Exclude Annotation |
0 | 1 | Excluded | |
VC_COV_UNR |
1 | 0 | Excluded | |
VC_COV_UNR |
1 | 1 | Covered | T1,T2,T3 |
Branch Coverage for Instance : tb.dut.u_reg.u_io_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
| Line No. | Total | Covered | Percent |
Branches |
|
12 |
12 |
100.00 |
CASE |
225 |
4 |
4 |
100.00 |
CASE |
269 |
4 |
4 |
100.00 |
IF |
307 |
2 |
2 |
100.00 |
IF |
316 |
2 |
2 |
100.00 |
225 unique case (src_fsm_cs)
-1-
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 src_req_d = src_req_i;
230 src_ack_o = src_ack;
231
232 // The handshake is done for exactly 1 clock cycle.
233 if (src_handshake) begin
-2-
234 src_fsm_ns = ODD;
==>
235 end
MISSING_ELSE
==>
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 src_req_d = ~src_req_i;
242 src_ack_o = ~src_ack;
243
244 // The handshake is done for exactly 1 clock cycle.
245 if (src_handshake) begin
-3-
246 src_fsm_ns = EVEN;
==>
247 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T1,T2,T3 |
EVEN |
0 |
- |
Covered |
T1,T2,T3 |
ODD |
- |
1 |
Covered |
T1,T2,T3 |
ODD |
- |
0 |
Covered |
T1,T2,T3 |
269 unique case (dst_fsm_cs)
-1-
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 dst_req_o = dst_req;
274 dst_ack_d = dst_ack_i;
275
276 // The handshake is done for exactly 1 clock cycle.
277 if (dst_handshake) begin
-2-
278 dst_fsm_ns = ODD;
==>
279 end
MISSING_ELSE
==>
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 dst_req_o = ~dst_req;
286 dst_ack_d = ~dst_ack_i;
287
288 // The handshake is done for exactly 1 clock cycle.
289 if (dst_handshake) begin
-3-
290 dst_fsm_ns = EVEN;
==>
291 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T1,T2,T3 |
EVEN |
0 |
- |
Covered |
T1,T2,T3 |
ODD |
- |
1 |
Covered |
T1,T2,T3 |
ODD |
- |
0 |
Covered |
T1,T2,T3 |
307 if (!rst_src_ni) begin
-1-
308 src_fsm_cs <= EVEN;
==>
309 src_req_q <= 1'b0;
310 end else begin
311 src_fsm_cs <= src_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
316 if (!rst_dst_ni) begin
-1-
317 dst_fsm_cs <= EVEN;
==>
318 dst_ack_q <= 1'b0;
319 end else begin
320 dst_fsm_cs <= dst_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
Assert Coverage for Instance : tb.dut.u_reg.u_io_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
Assertion Details
SyncReqAckAckNeedsReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
40545146 |
13453 |
0 |
0 |
T1 |
27978 |
10 |
0 |
0 |
T2 |
0 |
14 |
0 |
0 |
T3 |
0 |
10 |
0 |
0 |
T10 |
0 |
12 |
0 |
0 |
T27 |
0 |
12 |
0 |
0 |
T39 |
0 |
4 |
0 |
0 |
T44 |
0 |
12 |
0 |
0 |
T45 |
0 |
8 |
0 |
0 |
T47 |
0 |
28 |
0 |
0 |
T48 |
0 |
2 |
0 |
0 |
T49 |
1457 |
0 |
0 |
0 |
T50 |
1111 |
0 |
0 |
0 |
T51 |
2316 |
0 |
0 |
0 |
T52 |
1259 |
0 |
0 |
0 |
T53 |
2234 |
0 |
0 |
0 |
T54 |
9524 |
0 |
0 |
0 |
T55 |
757 |
0 |
0 |
0 |
T56 |
1568 |
0 |
0 |
0 |
T57 |
978 |
0 |
0 |
0 |
SyncReqAckHoldReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
93016148 |
12917 |
0 |
0 |
T1 |
29842 |
10 |
0 |
0 |
T2 |
0 |
14 |
0 |
0 |
T3 |
0 |
10 |
0 |
0 |
T10 |
0 |
12 |
0 |
0 |
T27 |
0 |
12 |
0 |
0 |
T39 |
0 |
4 |
0 |
0 |
T44 |
0 |
12 |
0 |
0 |
T45 |
0 |
8 |
0 |
0 |
T47 |
0 |
28 |
0 |
0 |
T48 |
0 |
2 |
0 |
0 |
T49 |
5831 |
0 |
0 |
0 |
T50 |
4271 |
0 |
0 |
0 |
T51 |
2316 |
0 |
0 |
0 |
T52 |
4838 |
0 |
0 |
0 |
T53 |
2234 |
0 |
0 |
0 |
T54 |
19046 |
0 |
0 |
0 |
T55 |
6052 |
0 |
0 |
0 |
T56 |
3072 |
0 |
0 |
0 |
T57 |
9402 |
0 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_reg.u_io_div2_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
| Line No. | Total | Covered | Percent |
TOTAL | | 36 | 36 | 100.00 |
CONT_ASSIGN | 55 | 0 | 0 | |
CONT_ASSIGN | 194 | 1 | 1 | 100.00 |
CONT_ASSIGN | 195 | 1 | 1 | 100.00 |
ALWAYS | 219 | 12 | 12 | 100.00 |
ALWAYS | 263 | 12 | 12 | 100.00 |
ALWAYS | 307 | 5 | 5 | 100.00 |
ALWAYS | 316 | 5 | 5 | 100.00 |
CONT_ASSIGN | 335 | 0 | 0 | |
ALWAYS | 339 | 0 | 0 | |
54 logic unused_req_chk;
55 unreachable assign unused_req_chk = req_chk_i;
56
57 if (EnRzHs) begin : gen_rz_hs_protocol
58 //////////////////
59 // RZ protocol //
60 //////////////////
61
62 // Types
63 typedef enum logic {
64 LoSt, HiSt
65 } rz_fsm_e;
66
67 // Signals
68 rz_fsm_e src_fsm_d, src_fsm_q;
69 rz_fsm_e dst_fsm_d, dst_fsm_q;
70 logic src_ack, dst_ack;
71 logic src_req, dst_req;
72
73 // REQ-side FSM (SRC domain)
74 always_comb begin : src_fsm
75 src_fsm_d = src_fsm_q;
76 src_ack_o = 1'b0;
77 src_req = 1'b0;
78
79 unique case (src_fsm_q)
80 LoSt: begin
81 // Wait for the ack to go back to zero before starting
82 // a new transaction.
83 if (!src_ack && src_req_i) begin
84 src_fsm_d = HiSt;
85 end
86 end
87 HiSt: begin
88 src_req = 1'b1;
89 // Forward the acknowledgement.
90 src_ack_o = src_ack;
91 // If request drops out, we go back to LoSt.
92 // If DST side asserts ack, we also go back to LoSt.
93 if (!src_req_i || src_ack) begin
94 src_fsm_d = LoSt;
95 end
96 end
97 //VCS coverage off
98 // pragma coverage off
99 default: ;
100 //VCS coverage on
101 // pragma coverage on
102 endcase
103 end
104
105 // Move ACK over to SRC domain.
106 prim_flop_2sync #(
107 .Width(1)
108 ) ack_sync (
109 .clk_i (clk_src_i),
110 .rst_ni (rst_src_ni),
111 .d_i (dst_ack),
112 .q_o (src_ack)
113 );
114
115 // Registers
116 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
117 if (!rst_src_ni) begin
118 src_fsm_q <= LoSt;
119 end else begin
120 src_fsm_q <= src_fsm_d;
121 end
122 end
123
124 // ACK-side FSM (DST domain)
125 always_comb begin : dst_fsm
126 dst_fsm_d = dst_fsm_q;
127 dst_req_o = 1'b0;
128 dst_ack = 1'b0;
129
130 unique case (dst_fsm_q)
131 LoSt: begin
132 if (dst_req) begin
133 // Forward the request.
134 dst_req_o = 1'b1;
135 // Wait for the request and acknowledge to be asserted
136 // before responding to the SRC side.
137 if (dst_ack_i) begin
138 dst_fsm_d = HiSt;
139 end
140 end
141 end
142 HiSt: begin
143 dst_ack = 1'b1;
144 // Wait for the request to drop back to zero.
145 if (!dst_req) begin
146 dst_fsm_d = LoSt;
147 end
148 end
149 //VCS coverage off
150 // pragma coverage off
151 default: ;
152 //VCS coverage on
153 // pragma coverage on
154 endcase
155 end
156
157 // Move REQ over to DST domain.
158 prim_flop_2sync #(
159 .Width(1)
160 ) req_sync (
161 .clk_i (clk_dst_i),
162 .rst_ni (rst_dst_ni),
163 .d_i (src_req),
164 .q_o (dst_req)
165 );
166
167 // Registers
168 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
169 if (!rst_dst_ni) begin
170 dst_fsm_q <= LoSt;
171 end else begin
172 dst_fsm_q <= dst_fsm_d;
173 end
174 end
175
176 end else begin : gen_nrz_hs_protocol
177 //////////////////
178 // NRZ protocol //
179 //////////////////
180
181 // Types
182 typedef enum logic {
183 EVEN, ODD
184 } sync_reqack_fsm_e;
185
186 // Signals
187 sync_reqack_fsm_e src_fsm_ns, src_fsm_cs;
188 sync_reqack_fsm_e dst_fsm_ns, dst_fsm_cs;
189
190 logic src_req_d, src_req_q, src_ack;
191 logic dst_ack_d, dst_ack_q, dst_req;
192 logic src_handshake, dst_handshake;
193
194 1/1 assign src_handshake = src_req_i & src_ack_o;
Tests: T1 T2 T3
195 1/1 assign dst_handshake = dst_req_o & dst_ack_i;
Tests: T1 T2 T3
196
197 // Move REQ over to DST domain.
198 prim_flop_2sync #(
199 .Width(1)
200 ) req_sync (
201 .clk_i (clk_dst_i),
202 .rst_ni (rst_dst_ni),
203 .d_i (src_req_q),
204 .q_o (dst_req)
205 );
206
207 // Move ACK over to SRC domain.
208 prim_flop_2sync #(
209 .Width(1)
210 ) ack_sync (
211 .clk_i (clk_src_i),
212 .rst_ni (rst_src_ni),
213 .d_i (dst_ack_q),
214 .q_o (src_ack)
215 );
216
217 // REQ-side FSM (SRC domain)
218 always_comb begin : src_fsm
219 1/1 src_fsm_ns = src_fsm_cs;
Tests: T1 T2 T3
220
221 // By default, we keep the internal REQ value and don't ACK.
222 1/1 src_req_d = src_req_q;
Tests: T1 T2 T3
223 1/1 src_ack_o = 1'b0;
Tests: T1 T2 T3
224
225 1/1 unique case (src_fsm_cs)
Tests: T1 T2 T3
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 1/1 src_req_d = src_req_i;
Tests: T1 T2 T3
230 1/1 src_ack_o = src_ack;
Tests: T1 T2 T3
231
232 // The handshake is done for exactly 1 clock cycle.
233 1/1 if (src_handshake) begin
Tests: T1 T2 T3
234 1/1 src_fsm_ns = ODD;
Tests: T1 T2 T3
235 end
MISSING_ELSE
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 1/1 src_req_d = ~src_req_i;
Tests: T1 T2 T3
242 1/1 src_ack_o = ~src_ack;
Tests: T1 T2 T3
243
244 // The handshake is done for exactly 1 clock cycle.
245 1/1 if (src_handshake) begin
Tests: T1 T2 T3
246 1/1 src_fsm_ns = EVEN;
Tests: T1 T2 T3
247 end
MISSING_ELSE
248 end
249
250 //VCS coverage off
251 // pragma coverage off
252
253 default: ;
254
255 //VCS coverage on
256 // pragma coverage on
257
258 endcase
259 end
260
261 // ACK-side FSM (DST domain)
262 always_comb begin : dst_fsm
263 1/1 dst_fsm_ns = dst_fsm_cs;
Tests: T1 T2 T3
264
265 // By default, we don't REQ and keep the internal ACK.
266 1/1 dst_req_o = 1'b0;
Tests: T1 T2 T3
267 1/1 dst_ack_d = dst_ack_q;
Tests: T1 T2 T3
268
269 1/1 unique case (dst_fsm_cs)
Tests: T1 T2 T3
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 1/1 dst_req_o = dst_req;
Tests: T1 T2 T3
274 1/1 dst_ack_d = dst_ack_i;
Tests: T1 T2 T3
275
276 // The handshake is done for exactly 1 clock cycle.
277 1/1 if (dst_handshake) begin
Tests: T1 T2 T3
278 1/1 dst_fsm_ns = ODD;
Tests: T1 T2 T3
279 end
MISSING_ELSE
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 1/1 dst_req_o = ~dst_req;
Tests: T1 T2 T3
286 1/1 dst_ack_d = ~dst_ack_i;
Tests: T1 T2 T3
287
288 // The handshake is done for exactly 1 clock cycle.
289 1/1 if (dst_handshake) begin
Tests: T1 T2 T3
290 1/1 dst_fsm_ns = EVEN;
Tests: T1 T2 T3
291 end
MISSING_ELSE
292 end
293
294 //VCS coverage off
295 // pragma coverage off
296
297 default: ;
298
299 //VCS coverage on
300 // pragma coverage on
301
302 endcase
303 end
304
305 // Registers
306 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
307 1/1 if (!rst_src_ni) begin
Tests: T4 T5 T6
308 1/1 src_fsm_cs <= EVEN;
Tests: T4 T5 T6
309 1/1 src_req_q <= 1'b0;
Tests: T4 T5 T6
310 end else begin
311 1/1 src_fsm_cs <= src_fsm_ns;
Tests: T4 T5 T6
312 1/1 src_req_q <= src_req_d;
Tests: T4 T5 T6
313 end
314 end
315 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
316 1/1 if (!rst_dst_ni) begin
Tests: T4 T5 T6
317 1/1 dst_fsm_cs <= EVEN;
Tests: T4 T5 T6
318 1/1 dst_ack_q <= 1'b0;
Tests: T4 T5 T6
319 end else begin
320 1/1 dst_fsm_cs <= dst_fsm_ns;
Tests: T4 T5 T6
321 1/1 dst_ack_q <= dst_ack_d;
Tests: T4 T5 T6
322 end
323 end
324 end
325
326 ////////////////
327 // Assertions //
328 ////////////////
329
330 `ifdef INC_ASSERT
331 //VCS coverage off
332 // pragma coverage off
333
334 logic effective_rst_n;
335 unreachable assign effective_rst_n = rst_src_ni && rst_dst_ni;
336
337 logic chk_flag;
338 always_ff @(posedge clk_src_i or negedge effective_rst_n) begin
339 unreachable if (!effective_rst_n) begin
340 unreachable chk_flag <= '0;
341 unreachable end else if (src_req_i && !chk_flag) begin
342 unreachable chk_flag <= 1'b1;
343 end
==> MISSING_ELSE
Cond Coverage for Instance : tb.dut.u_reg.u_io_div2_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
| Total | Covered | Percent |
Conditions | 4 | 3 | 75.00 |
Logical | 4 | 3 | 75.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 194
EXPRESSION (src_req_i & src_ack_o)
----1---- ----2----
-1- | -2- | Status | Tests |
0 | 1 | Not Covered | |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T1,T2,T3 |
LINE 195
EXPRESSION (dst_req_o & dst_ack_i)
----1---- ----2----
-1- | -2- | Status | Tests | Exclude Annotation |
0 | 1 | Excluded | |
VC_COV_UNR |
1 | 0 | Excluded | |
VC_COV_UNR |
1 | 1 | Covered | T1,T2,T3 |
Branch Coverage for Instance : tb.dut.u_reg.u_io_div2_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
| Line No. | Total | Covered | Percent |
Branches |
|
12 |
12 |
100.00 |
CASE |
225 |
4 |
4 |
100.00 |
CASE |
269 |
4 |
4 |
100.00 |
IF |
307 |
2 |
2 |
100.00 |
IF |
316 |
2 |
2 |
100.00 |
225 unique case (src_fsm_cs)
-1-
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 src_req_d = src_req_i;
230 src_ack_o = src_ack;
231
232 // The handshake is done for exactly 1 clock cycle.
233 if (src_handshake) begin
-2-
234 src_fsm_ns = ODD;
==>
235 end
MISSING_ELSE
==>
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 src_req_d = ~src_req_i;
242 src_ack_o = ~src_ack;
243
244 // The handshake is done for exactly 1 clock cycle.
245 if (src_handshake) begin
-3-
246 src_fsm_ns = EVEN;
==>
247 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T1,T2,T3 |
EVEN |
0 |
- |
Covered |
T1,T2,T3 |
ODD |
- |
1 |
Covered |
T1,T2,T3 |
ODD |
- |
0 |
Covered |
T1,T2,T3 |
269 unique case (dst_fsm_cs)
-1-
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 dst_req_o = dst_req;
274 dst_ack_d = dst_ack_i;
275
276 // The handshake is done for exactly 1 clock cycle.
277 if (dst_handshake) begin
-2-
278 dst_fsm_ns = ODD;
==>
279 end
MISSING_ELSE
==>
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 dst_req_o = ~dst_req;
286 dst_ack_d = ~dst_ack_i;
287
288 // The handshake is done for exactly 1 clock cycle.
289 if (dst_handshake) begin
-3-
290 dst_fsm_ns = EVEN;
==>
291 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T1,T2,T3 |
EVEN |
0 |
- |
Covered |
T1,T2,T3 |
ODD |
- |
1 |
Covered |
T1,T2,T3 |
ODD |
- |
0 |
Covered |
T1,T2,T3 |
307 if (!rst_src_ni) begin
-1-
308 src_fsm_cs <= EVEN;
==>
309 src_req_q <= 1'b0;
310 end else begin
311 src_fsm_cs <= src_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
316 if (!rst_dst_ni) begin
-1-
317 dst_fsm_cs <= EVEN;
==>
318 dst_ack_q <= 1'b0;
319 end else begin
320 dst_fsm_cs <= dst_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
Assert Coverage for Instance : tb.dut.u_reg.u_io_div2_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
Assertion Details
SyncReqAckAckNeedsReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
40545146 |
13453 |
0 |
0 |
T1 |
27978 |
10 |
0 |
0 |
T2 |
0 |
14 |
0 |
0 |
T3 |
0 |
10 |
0 |
0 |
T10 |
0 |
12 |
0 |
0 |
T27 |
0 |
12 |
0 |
0 |
T39 |
0 |
4 |
0 |
0 |
T44 |
0 |
12 |
0 |
0 |
T45 |
0 |
8 |
0 |
0 |
T47 |
0 |
28 |
0 |
0 |
T48 |
0 |
2 |
0 |
0 |
T49 |
1457 |
0 |
0 |
0 |
T50 |
1111 |
0 |
0 |
0 |
T51 |
2316 |
0 |
0 |
0 |
T52 |
1259 |
0 |
0 |
0 |
T53 |
2234 |
0 |
0 |
0 |
T54 |
9524 |
0 |
0 |
0 |
T55 |
757 |
0 |
0 |
0 |
T56 |
1568 |
0 |
0 |
0 |
T57 |
978 |
0 |
0 |
0 |
SyncReqAckHoldReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
45761112 |
12915 |
0 |
0 |
T1 |
8430 |
10 |
0 |
0 |
T2 |
0 |
14 |
0 |
0 |
T3 |
0 |
10 |
0 |
0 |
T10 |
0 |
12 |
0 |
0 |
T27 |
0 |
12 |
0 |
0 |
T39 |
0 |
4 |
0 |
0 |
T44 |
0 |
12 |
0 |
0 |
T45 |
0 |
8 |
0 |
0 |
T47 |
0 |
28 |
0 |
0 |
T48 |
0 |
2 |
0 |
0 |
T49 |
3117 |
0 |
0 |
0 |
T50 |
2082 |
0 |
0 |
0 |
T51 |
1291 |
0 |
0 |
0 |
T52 |
2386 |
0 |
0 |
0 |
T53 |
1243 |
0 |
0 |
0 |
T54 |
10193 |
0 |
0 |
0 |
T55 |
3148 |
0 |
0 |
0 |
T56 |
1602 |
0 |
0 |
0 |
T57 |
4948 |
0 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_reg.u_io_div4_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
| Line No. | Total | Covered | Percent |
TOTAL | | 36 | 36 | 100.00 |
CONT_ASSIGN | 55 | 0 | 0 | |
CONT_ASSIGN | 194 | 1 | 1 | 100.00 |
CONT_ASSIGN | 195 | 1 | 1 | 100.00 |
ALWAYS | 219 | 12 | 12 | 100.00 |
ALWAYS | 263 | 12 | 12 | 100.00 |
ALWAYS | 307 | 5 | 5 | 100.00 |
ALWAYS | 316 | 5 | 5 | 100.00 |
CONT_ASSIGN | 335 | 0 | 0 | |
ALWAYS | 339 | 0 | 0 | |
54 logic unused_req_chk;
55 unreachable assign unused_req_chk = req_chk_i;
56
57 if (EnRzHs) begin : gen_rz_hs_protocol
58 //////////////////
59 // RZ protocol //
60 //////////////////
61
62 // Types
63 typedef enum logic {
64 LoSt, HiSt
65 } rz_fsm_e;
66
67 // Signals
68 rz_fsm_e src_fsm_d, src_fsm_q;
69 rz_fsm_e dst_fsm_d, dst_fsm_q;
70 logic src_ack, dst_ack;
71 logic src_req, dst_req;
72
73 // REQ-side FSM (SRC domain)
74 always_comb begin : src_fsm
75 src_fsm_d = src_fsm_q;
76 src_ack_o = 1'b0;
77 src_req = 1'b0;
78
79 unique case (src_fsm_q)
80 LoSt: begin
81 // Wait for the ack to go back to zero before starting
82 // a new transaction.
83 if (!src_ack && src_req_i) begin
84 src_fsm_d = HiSt;
85 end
86 end
87 HiSt: begin
88 src_req = 1'b1;
89 // Forward the acknowledgement.
90 src_ack_o = src_ack;
91 // If request drops out, we go back to LoSt.
92 // If DST side asserts ack, we also go back to LoSt.
93 if (!src_req_i || src_ack) begin
94 src_fsm_d = LoSt;
95 end
96 end
97 //VCS coverage off
98 // pragma coverage off
99 default: ;
100 //VCS coverage on
101 // pragma coverage on
102 endcase
103 end
104
105 // Move ACK over to SRC domain.
106 prim_flop_2sync #(
107 .Width(1)
108 ) ack_sync (
109 .clk_i (clk_src_i),
110 .rst_ni (rst_src_ni),
111 .d_i (dst_ack),
112 .q_o (src_ack)
113 );
114
115 // Registers
116 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
117 if (!rst_src_ni) begin
118 src_fsm_q <= LoSt;
119 end else begin
120 src_fsm_q <= src_fsm_d;
121 end
122 end
123
124 // ACK-side FSM (DST domain)
125 always_comb begin : dst_fsm
126 dst_fsm_d = dst_fsm_q;
127 dst_req_o = 1'b0;
128 dst_ack = 1'b0;
129
130 unique case (dst_fsm_q)
131 LoSt: begin
132 if (dst_req) begin
133 // Forward the request.
134 dst_req_o = 1'b1;
135 // Wait for the request and acknowledge to be asserted
136 // before responding to the SRC side.
137 if (dst_ack_i) begin
138 dst_fsm_d = HiSt;
139 end
140 end
141 end
142 HiSt: begin
143 dst_ack = 1'b1;
144 // Wait for the request to drop back to zero.
145 if (!dst_req) begin
146 dst_fsm_d = LoSt;
147 end
148 end
149 //VCS coverage off
150 // pragma coverage off
151 default: ;
152 //VCS coverage on
153 // pragma coverage on
154 endcase
155 end
156
157 // Move REQ over to DST domain.
158 prim_flop_2sync #(
159 .Width(1)
160 ) req_sync (
161 .clk_i (clk_dst_i),
162 .rst_ni (rst_dst_ni),
163 .d_i (src_req),
164 .q_o (dst_req)
165 );
166
167 // Registers
168 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
169 if (!rst_dst_ni) begin
170 dst_fsm_q <= LoSt;
171 end else begin
172 dst_fsm_q <= dst_fsm_d;
173 end
174 end
175
176 end else begin : gen_nrz_hs_protocol
177 //////////////////
178 // NRZ protocol //
179 //////////////////
180
181 // Types
182 typedef enum logic {
183 EVEN, ODD
184 } sync_reqack_fsm_e;
185
186 // Signals
187 sync_reqack_fsm_e src_fsm_ns, src_fsm_cs;
188 sync_reqack_fsm_e dst_fsm_ns, dst_fsm_cs;
189
190 logic src_req_d, src_req_q, src_ack;
191 logic dst_ack_d, dst_ack_q, dst_req;
192 logic src_handshake, dst_handshake;
193
194 1/1 assign src_handshake = src_req_i & src_ack_o;
Tests: T1 T2 T3
195 1/1 assign dst_handshake = dst_req_o & dst_ack_i;
Tests: T1 T2 T3
196
197 // Move REQ over to DST domain.
198 prim_flop_2sync #(
199 .Width(1)
200 ) req_sync (
201 .clk_i (clk_dst_i),
202 .rst_ni (rst_dst_ni),
203 .d_i (src_req_q),
204 .q_o (dst_req)
205 );
206
207 // Move ACK over to SRC domain.
208 prim_flop_2sync #(
209 .Width(1)
210 ) ack_sync (
211 .clk_i (clk_src_i),
212 .rst_ni (rst_src_ni),
213 .d_i (dst_ack_q),
214 .q_o (src_ack)
215 );
216
217 // REQ-side FSM (SRC domain)
218 always_comb begin : src_fsm
219 1/1 src_fsm_ns = src_fsm_cs;
Tests: T1 T2 T3
220
221 // By default, we keep the internal REQ value and don't ACK.
222 1/1 src_req_d = src_req_q;
Tests: T1 T2 T3
223 1/1 src_ack_o = 1'b0;
Tests: T1 T2 T3
224
225 1/1 unique case (src_fsm_cs)
Tests: T1 T2 T3
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 1/1 src_req_d = src_req_i;
Tests: T1 T2 T3
230 1/1 src_ack_o = src_ack;
Tests: T1 T2 T3
231
232 // The handshake is done for exactly 1 clock cycle.
233 1/1 if (src_handshake) begin
Tests: T1 T2 T3
234 1/1 src_fsm_ns = ODD;
Tests: T1 T2 T3
235 end
MISSING_ELSE
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 1/1 src_req_d = ~src_req_i;
Tests: T1 T2 T3
242 1/1 src_ack_o = ~src_ack;
Tests: T1 T2 T3
243
244 // The handshake is done for exactly 1 clock cycle.
245 1/1 if (src_handshake) begin
Tests: T1 T2 T3
246 1/1 src_fsm_ns = EVEN;
Tests: T1 T2 T3
247 end
MISSING_ELSE
248 end
249
250 //VCS coverage off
251 // pragma coverage off
252
253 default: ;
254
255 //VCS coverage on
256 // pragma coverage on
257
258 endcase
259 end
260
261 // ACK-side FSM (DST domain)
262 always_comb begin : dst_fsm
263 1/1 dst_fsm_ns = dst_fsm_cs;
Tests: T1 T2 T3
264
265 // By default, we don't REQ and keep the internal ACK.
266 1/1 dst_req_o = 1'b0;
Tests: T1 T2 T3
267 1/1 dst_ack_d = dst_ack_q;
Tests: T1 T2 T3
268
269 1/1 unique case (dst_fsm_cs)
Tests: T1 T2 T3
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 1/1 dst_req_o = dst_req;
Tests: T1 T2 T3
274 1/1 dst_ack_d = dst_ack_i;
Tests: T1 T2 T3
275
276 // The handshake is done for exactly 1 clock cycle.
277 1/1 if (dst_handshake) begin
Tests: T1 T2 T3
278 1/1 dst_fsm_ns = ODD;
Tests: T1 T2 T3
279 end
MISSING_ELSE
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 1/1 dst_req_o = ~dst_req;
Tests: T1 T2 T3
286 1/1 dst_ack_d = ~dst_ack_i;
Tests: T1 T2 T3
287
288 // The handshake is done for exactly 1 clock cycle.
289 1/1 if (dst_handshake) begin
Tests: T1 T2 T3
290 1/1 dst_fsm_ns = EVEN;
Tests: T1 T2 T3
291 end
MISSING_ELSE
292 end
293
294 //VCS coverage off
295 // pragma coverage off
296
297 default: ;
298
299 //VCS coverage on
300 // pragma coverage on
301
302 endcase
303 end
304
305 // Registers
306 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
307 1/1 if (!rst_src_ni) begin
Tests: T4 T5 T6
308 1/1 src_fsm_cs <= EVEN;
Tests: T4 T5 T6
309 1/1 src_req_q <= 1'b0;
Tests: T4 T5 T6
310 end else begin
311 1/1 src_fsm_cs <= src_fsm_ns;
Tests: T4 T5 T6
312 1/1 src_req_q <= src_req_d;
Tests: T4 T5 T6
313 end
314 end
315 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
316 1/1 if (!rst_dst_ni) begin
Tests: T4 T5 T6
317 1/1 dst_fsm_cs <= EVEN;
Tests: T4 T5 T6
318 1/1 dst_ack_q <= 1'b0;
Tests: T4 T5 T6
319 end else begin
320 1/1 dst_fsm_cs <= dst_fsm_ns;
Tests: T4 T5 T6
321 1/1 dst_ack_q <= dst_ack_d;
Tests: T4 T5 T6
322 end
323 end
324 end
325
326 ////////////////
327 // Assertions //
328 ////////////////
329
330 `ifdef INC_ASSERT
331 //VCS coverage off
332 // pragma coverage off
333
334 logic effective_rst_n;
335 unreachable assign effective_rst_n = rst_src_ni && rst_dst_ni;
336
337 logic chk_flag;
338 always_ff @(posedge clk_src_i or negedge effective_rst_n) begin
339 unreachable if (!effective_rst_n) begin
340 unreachable chk_flag <= '0;
341 unreachable end else if (src_req_i && !chk_flag) begin
342 unreachable chk_flag <= 1'b1;
343 end
==> MISSING_ELSE
Cond Coverage for Instance : tb.dut.u_reg.u_io_div4_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
| Total | Covered | Percent |
Conditions | 4 | 3 | 75.00 |
Logical | 4 | 3 | 75.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 194
EXPRESSION (src_req_i & src_ack_o)
----1---- ----2----
-1- | -2- | Status | Tests |
0 | 1 | Not Covered | |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T1,T2,T3 |
LINE 195
EXPRESSION (dst_req_o & dst_ack_i)
----1---- ----2----
-1- | -2- | Status | Tests | Exclude Annotation |
0 | 1 | Excluded | |
VC_COV_UNR |
1 | 0 | Excluded | |
VC_COV_UNR |
1 | 1 | Covered | T1,T2,T3 |
Branch Coverage for Instance : tb.dut.u_reg.u_io_div4_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
| Line No. | Total | Covered | Percent |
Branches |
|
12 |
12 |
100.00 |
CASE |
225 |
4 |
4 |
100.00 |
CASE |
269 |
4 |
4 |
100.00 |
IF |
307 |
2 |
2 |
100.00 |
IF |
316 |
2 |
2 |
100.00 |
225 unique case (src_fsm_cs)
-1-
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 src_req_d = src_req_i;
230 src_ack_o = src_ack;
231
232 // The handshake is done for exactly 1 clock cycle.
233 if (src_handshake) begin
-2-
234 src_fsm_ns = ODD;
==>
235 end
MISSING_ELSE
==>
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 src_req_d = ~src_req_i;
242 src_ack_o = ~src_ack;
243
244 // The handshake is done for exactly 1 clock cycle.
245 if (src_handshake) begin
-3-
246 src_fsm_ns = EVEN;
==>
247 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T1,T2,T3 |
EVEN |
0 |
- |
Covered |
T1,T2,T3 |
ODD |
- |
1 |
Covered |
T1,T2,T3 |
ODD |
- |
0 |
Covered |
T1,T2,T3 |
269 unique case (dst_fsm_cs)
-1-
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 dst_req_o = dst_req;
274 dst_ack_d = dst_ack_i;
275
276 // The handshake is done for exactly 1 clock cycle.
277 if (dst_handshake) begin
-2-
278 dst_fsm_ns = ODD;
==>
279 end
MISSING_ELSE
==>
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 dst_req_o = ~dst_req;
286 dst_ack_d = ~dst_ack_i;
287
288 // The handshake is done for exactly 1 clock cycle.
289 if (dst_handshake) begin
-3-
290 dst_fsm_ns = EVEN;
==>
291 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T1,T2,T3 |
EVEN |
0 |
- |
Covered |
T1,T2,T3 |
ODD |
- |
1 |
Covered |
T1,T2,T3 |
ODD |
- |
0 |
Covered |
T1,T2,T3 |
307 if (!rst_src_ni) begin
-1-
308 src_fsm_cs <= EVEN;
==>
309 src_req_q <= 1'b0;
310 end else begin
311 src_fsm_cs <= src_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
316 if (!rst_dst_ni) begin
-1-
317 dst_fsm_cs <= EVEN;
==>
318 dst_ack_q <= 1'b0;
319 end else begin
320 dst_fsm_cs <= dst_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
Assert Coverage for Instance : tb.dut.u_reg.u_io_div4_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
Assertion Details
SyncReqAckAckNeedsReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
40545146 |
13453 |
0 |
0 |
T1 |
27978 |
10 |
0 |
0 |
T2 |
0 |
14 |
0 |
0 |
T3 |
0 |
10 |
0 |
0 |
T10 |
0 |
12 |
0 |
0 |
T27 |
0 |
12 |
0 |
0 |
T39 |
0 |
4 |
0 |
0 |
T44 |
0 |
12 |
0 |
0 |
T45 |
0 |
8 |
0 |
0 |
T47 |
0 |
28 |
0 |
0 |
T48 |
0 |
2 |
0 |
0 |
T49 |
1457 |
0 |
0 |
0 |
T50 |
1111 |
0 |
0 |
0 |
T51 |
2316 |
0 |
0 |
0 |
T52 |
1259 |
0 |
0 |
0 |
T53 |
2234 |
0 |
0 |
0 |
T54 |
9524 |
0 |
0 |
0 |
T55 |
757 |
0 |
0 |
0 |
T56 |
1568 |
0 |
0 |
0 |
T57 |
978 |
0 |
0 |
0 |
SyncReqAckHoldReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
22880144 |
12895 |
0 |
0 |
T1 |
4216 |
9 |
0 |
0 |
T2 |
0 |
14 |
0 |
0 |
T3 |
0 |
10 |
0 |
0 |
T10 |
0 |
12 |
0 |
0 |
T27 |
0 |
12 |
0 |
0 |
T39 |
0 |
4 |
0 |
0 |
T44 |
0 |
12 |
0 |
0 |
T45 |
0 |
8 |
0 |
0 |
T47 |
0 |
28 |
0 |
0 |
T48 |
0 |
2 |
0 |
0 |
T49 |
1559 |
0 |
0 |
0 |
T50 |
1041 |
0 |
0 |
0 |
T51 |
644 |
0 |
0 |
0 |
T52 |
1193 |
0 |
0 |
0 |
T53 |
619 |
0 |
0 |
0 |
T54 |
5094 |
0 |
0 |
0 |
T55 |
1574 |
0 |
0 |
0 |
T56 |
800 |
0 |
0 |
0 |
T57 |
2474 |
0 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_reg.u_main_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
| Line No. | Total | Covered | Percent |
TOTAL | | 36 | 36 | 100.00 |
CONT_ASSIGN | 55 | 0 | 0 | |
CONT_ASSIGN | 194 | 1 | 1 | 100.00 |
CONT_ASSIGN | 195 | 1 | 1 | 100.00 |
ALWAYS | 219 | 12 | 12 | 100.00 |
ALWAYS | 263 | 12 | 12 | 100.00 |
ALWAYS | 307 | 5 | 5 | 100.00 |
ALWAYS | 316 | 5 | 5 | 100.00 |
CONT_ASSIGN | 335 | 0 | 0 | |
ALWAYS | 339 | 0 | 0 | |
54 logic unused_req_chk;
55 unreachable assign unused_req_chk = req_chk_i;
56
57 if (EnRzHs) begin : gen_rz_hs_protocol
58 //////////////////
59 // RZ protocol //
60 //////////////////
61
62 // Types
63 typedef enum logic {
64 LoSt, HiSt
65 } rz_fsm_e;
66
67 // Signals
68 rz_fsm_e src_fsm_d, src_fsm_q;
69 rz_fsm_e dst_fsm_d, dst_fsm_q;
70 logic src_ack, dst_ack;
71 logic src_req, dst_req;
72
73 // REQ-side FSM (SRC domain)
74 always_comb begin : src_fsm
75 src_fsm_d = src_fsm_q;
76 src_ack_o = 1'b0;
77 src_req = 1'b0;
78
79 unique case (src_fsm_q)
80 LoSt: begin
81 // Wait for the ack to go back to zero before starting
82 // a new transaction.
83 if (!src_ack && src_req_i) begin
84 src_fsm_d = HiSt;
85 end
86 end
87 HiSt: begin
88 src_req = 1'b1;
89 // Forward the acknowledgement.
90 src_ack_o = src_ack;
91 // If request drops out, we go back to LoSt.
92 // If DST side asserts ack, we also go back to LoSt.
93 if (!src_req_i || src_ack) begin
94 src_fsm_d = LoSt;
95 end
96 end
97 //VCS coverage off
98 // pragma coverage off
99 default: ;
100 //VCS coverage on
101 // pragma coverage on
102 endcase
103 end
104
105 // Move ACK over to SRC domain.
106 prim_flop_2sync #(
107 .Width(1)
108 ) ack_sync (
109 .clk_i (clk_src_i),
110 .rst_ni (rst_src_ni),
111 .d_i (dst_ack),
112 .q_o (src_ack)
113 );
114
115 // Registers
116 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
117 if (!rst_src_ni) begin
118 src_fsm_q <= LoSt;
119 end else begin
120 src_fsm_q <= src_fsm_d;
121 end
122 end
123
124 // ACK-side FSM (DST domain)
125 always_comb begin : dst_fsm
126 dst_fsm_d = dst_fsm_q;
127 dst_req_o = 1'b0;
128 dst_ack = 1'b0;
129
130 unique case (dst_fsm_q)
131 LoSt: begin
132 if (dst_req) begin
133 // Forward the request.
134 dst_req_o = 1'b1;
135 // Wait for the request and acknowledge to be asserted
136 // before responding to the SRC side.
137 if (dst_ack_i) begin
138 dst_fsm_d = HiSt;
139 end
140 end
141 end
142 HiSt: begin
143 dst_ack = 1'b1;
144 // Wait for the request to drop back to zero.
145 if (!dst_req) begin
146 dst_fsm_d = LoSt;
147 end
148 end
149 //VCS coverage off
150 // pragma coverage off
151 default: ;
152 //VCS coverage on
153 // pragma coverage on
154 endcase
155 end
156
157 // Move REQ over to DST domain.
158 prim_flop_2sync #(
159 .Width(1)
160 ) req_sync (
161 .clk_i (clk_dst_i),
162 .rst_ni (rst_dst_ni),
163 .d_i (src_req),
164 .q_o (dst_req)
165 );
166
167 // Registers
168 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
169 if (!rst_dst_ni) begin
170 dst_fsm_q <= LoSt;
171 end else begin
172 dst_fsm_q <= dst_fsm_d;
173 end
174 end
175
176 end else begin : gen_nrz_hs_protocol
177 //////////////////
178 // NRZ protocol //
179 //////////////////
180
181 // Types
182 typedef enum logic {
183 EVEN, ODD
184 } sync_reqack_fsm_e;
185
186 // Signals
187 sync_reqack_fsm_e src_fsm_ns, src_fsm_cs;
188 sync_reqack_fsm_e dst_fsm_ns, dst_fsm_cs;
189
190 logic src_req_d, src_req_q, src_ack;
191 logic dst_ack_d, dst_ack_q, dst_req;
192 logic src_handshake, dst_handshake;
193
194 1/1 assign src_handshake = src_req_i & src_ack_o;
Tests: T1 T2 T3
195 1/1 assign dst_handshake = dst_req_o & dst_ack_i;
Tests: T1 T2 T3
196
197 // Move REQ over to DST domain.
198 prim_flop_2sync #(
199 .Width(1)
200 ) req_sync (
201 .clk_i (clk_dst_i),
202 .rst_ni (rst_dst_ni),
203 .d_i (src_req_q),
204 .q_o (dst_req)
205 );
206
207 // Move ACK over to SRC domain.
208 prim_flop_2sync #(
209 .Width(1)
210 ) ack_sync (
211 .clk_i (clk_src_i),
212 .rst_ni (rst_src_ni),
213 .d_i (dst_ack_q),
214 .q_o (src_ack)
215 );
216
217 // REQ-side FSM (SRC domain)
218 always_comb begin : src_fsm
219 1/1 src_fsm_ns = src_fsm_cs;
Tests: T1 T2 T3
220
221 // By default, we keep the internal REQ value and don't ACK.
222 1/1 src_req_d = src_req_q;
Tests: T1 T2 T3
223 1/1 src_ack_o = 1'b0;
Tests: T1 T2 T3
224
225 1/1 unique case (src_fsm_cs)
Tests: T1 T2 T3
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 1/1 src_req_d = src_req_i;
Tests: T1 T2 T3
230 1/1 src_ack_o = src_ack;
Tests: T1 T2 T3
231
232 // The handshake is done for exactly 1 clock cycle.
233 1/1 if (src_handshake) begin
Tests: T1 T2 T3
234 1/1 src_fsm_ns = ODD;
Tests: T1 T2 T3
235 end
MISSING_ELSE
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 1/1 src_req_d = ~src_req_i;
Tests: T1 T2 T3
242 1/1 src_ack_o = ~src_ack;
Tests: T1 T2 T3
243
244 // The handshake is done for exactly 1 clock cycle.
245 1/1 if (src_handshake) begin
Tests: T1 T2 T3
246 1/1 src_fsm_ns = EVEN;
Tests: T1 T2 T3
247 end
MISSING_ELSE
248 end
249
250 //VCS coverage off
251 // pragma coverage off
252
253 default: ;
254
255 //VCS coverage on
256 // pragma coverage on
257
258 endcase
259 end
260
261 // ACK-side FSM (DST domain)
262 always_comb begin : dst_fsm
263 1/1 dst_fsm_ns = dst_fsm_cs;
Tests: T1 T2 T3
264
265 // By default, we don't REQ and keep the internal ACK.
266 1/1 dst_req_o = 1'b0;
Tests: T1 T2 T3
267 1/1 dst_ack_d = dst_ack_q;
Tests: T1 T2 T3
268
269 1/1 unique case (dst_fsm_cs)
Tests: T1 T2 T3
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 1/1 dst_req_o = dst_req;
Tests: T1 T2 T3
274 1/1 dst_ack_d = dst_ack_i;
Tests: T1 T2 T3
275
276 // The handshake is done for exactly 1 clock cycle.
277 1/1 if (dst_handshake) begin
Tests: T1 T2 T3
278 1/1 dst_fsm_ns = ODD;
Tests: T1 T2 T3
279 end
MISSING_ELSE
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 1/1 dst_req_o = ~dst_req;
Tests: T1 T2 T3
286 1/1 dst_ack_d = ~dst_ack_i;
Tests: T1 T2 T3
287
288 // The handshake is done for exactly 1 clock cycle.
289 1/1 if (dst_handshake) begin
Tests: T1 T2 T3
290 1/1 dst_fsm_ns = EVEN;
Tests: T1 T2 T3
291 end
MISSING_ELSE
292 end
293
294 //VCS coverage off
295 // pragma coverage off
296
297 default: ;
298
299 //VCS coverage on
300 // pragma coverage on
301
302 endcase
303 end
304
305 // Registers
306 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
307 1/1 if (!rst_src_ni) begin
Tests: T4 T5 T6
308 1/1 src_fsm_cs <= EVEN;
Tests: T4 T5 T6
309 1/1 src_req_q <= 1'b0;
Tests: T4 T5 T6
310 end else begin
311 1/1 src_fsm_cs <= src_fsm_ns;
Tests: T4 T5 T6
312 1/1 src_req_q <= src_req_d;
Tests: T4 T5 T6
313 end
314 end
315 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
316 1/1 if (!rst_dst_ni) begin
Tests: T4 T5 T6
317 1/1 dst_fsm_cs <= EVEN;
Tests: T4 T5 T6
318 1/1 dst_ack_q <= 1'b0;
Tests: T4 T5 T6
319 end else begin
320 1/1 dst_fsm_cs <= dst_fsm_ns;
Tests: T4 T5 T6
321 1/1 dst_ack_q <= dst_ack_d;
Tests: T4 T5 T6
322 end
323 end
324 end
325
326 ////////////////
327 // Assertions //
328 ////////////////
329
330 `ifdef INC_ASSERT
331 //VCS coverage off
332 // pragma coverage off
333
334 logic effective_rst_n;
335 unreachable assign effective_rst_n = rst_src_ni && rst_dst_ni;
336
337 logic chk_flag;
338 always_ff @(posedge clk_src_i or negedge effective_rst_n) begin
339 unreachable if (!effective_rst_n) begin
340 unreachable chk_flag <= '0;
341 unreachable end else if (src_req_i && !chk_flag) begin
342 unreachable chk_flag <= 1'b1;
343 end
==> MISSING_ELSE
Cond Coverage for Instance : tb.dut.u_reg.u_main_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
| Total | Covered | Percent |
Conditions | 4 | 3 | 75.00 |
Logical | 4 | 3 | 75.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 194
EXPRESSION (src_req_i & src_ack_o)
----1---- ----2----
-1- | -2- | Status | Tests |
0 | 1 | Not Covered | |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T1,T2,T3 |
LINE 195
EXPRESSION (dst_req_o & dst_ack_i)
----1---- ----2----
-1- | -2- | Status | Tests | Exclude Annotation |
0 | 1 | Excluded | |
VC_COV_UNR |
1 | 0 | Excluded | |
VC_COV_UNR |
1 | 1 | Covered | T1,T2,T3 |
Branch Coverage for Instance : tb.dut.u_reg.u_main_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
| Line No. | Total | Covered | Percent |
Branches |
|
12 |
12 |
100.00 |
CASE |
225 |
4 |
4 |
100.00 |
CASE |
269 |
4 |
4 |
100.00 |
IF |
307 |
2 |
2 |
100.00 |
IF |
316 |
2 |
2 |
100.00 |
225 unique case (src_fsm_cs)
-1-
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 src_req_d = src_req_i;
230 src_ack_o = src_ack;
231
232 // The handshake is done for exactly 1 clock cycle.
233 if (src_handshake) begin
-2-
234 src_fsm_ns = ODD;
==>
235 end
MISSING_ELSE
==>
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 src_req_d = ~src_req_i;
242 src_ack_o = ~src_ack;
243
244 // The handshake is done for exactly 1 clock cycle.
245 if (src_handshake) begin
-3-
246 src_fsm_ns = EVEN;
==>
247 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T1,T2,T3 |
EVEN |
0 |
- |
Covered |
T1,T2,T3 |
ODD |
- |
1 |
Covered |
T1,T2,T3 |
ODD |
- |
0 |
Covered |
T1,T2,T3 |
269 unique case (dst_fsm_cs)
-1-
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 dst_req_o = dst_req;
274 dst_ack_d = dst_ack_i;
275
276 // The handshake is done for exactly 1 clock cycle.
277 if (dst_handshake) begin
-2-
278 dst_fsm_ns = ODD;
==>
279 end
MISSING_ELSE
==>
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 dst_req_o = ~dst_req;
286 dst_ack_d = ~dst_ack_i;
287
288 // The handshake is done for exactly 1 clock cycle.
289 if (dst_handshake) begin
-3-
290 dst_fsm_ns = EVEN;
==>
291 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T1,T2,T3 |
EVEN |
0 |
- |
Covered |
T1,T2,T3 |
ODD |
- |
1 |
Covered |
T1,T2,T3 |
ODD |
- |
0 |
Covered |
T1,T2,T3 |
307 if (!rst_src_ni) begin
-1-
308 src_fsm_cs <= EVEN;
==>
309 src_req_q <= 1'b0;
310 end else begin
311 src_fsm_cs <= src_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
316 if (!rst_dst_ni) begin
-1-
317 dst_fsm_cs <= EVEN;
==>
318 dst_ack_q <= 1'b0;
319 end else begin
320 dst_fsm_cs <= dst_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
Assert Coverage for Instance : tb.dut.u_reg.u_main_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
Assertion Details
SyncReqAckAckNeedsReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
40545146 |
13453 |
0 |
0 |
T1 |
27978 |
10 |
0 |
0 |
T2 |
0 |
14 |
0 |
0 |
T3 |
0 |
10 |
0 |
0 |
T10 |
0 |
12 |
0 |
0 |
T27 |
0 |
12 |
0 |
0 |
T39 |
0 |
4 |
0 |
0 |
T44 |
0 |
12 |
0 |
0 |
T45 |
0 |
8 |
0 |
0 |
T47 |
0 |
28 |
0 |
0 |
T48 |
0 |
2 |
0 |
0 |
T49 |
1457 |
0 |
0 |
0 |
T50 |
1111 |
0 |
0 |
0 |
T51 |
2316 |
0 |
0 |
0 |
T52 |
1259 |
0 |
0 |
0 |
T53 |
2234 |
0 |
0 |
0 |
T54 |
9524 |
0 |
0 |
0 |
T55 |
757 |
0 |
0 |
0 |
T56 |
1568 |
0 |
0 |
0 |
T57 |
978 |
0 |
0 |
0 |
SyncReqAckHoldReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
102625272 |
12917 |
0 |
0 |
T1 |
31086 |
10 |
0 |
0 |
T2 |
0 |
14 |
0 |
0 |
T3 |
0 |
10 |
0 |
0 |
T10 |
0 |
12 |
0 |
0 |
T27 |
0 |
12 |
0 |
0 |
T39 |
0 |
4 |
0 |
0 |
T44 |
0 |
12 |
0 |
0 |
T45 |
0 |
8 |
0 |
0 |
T47 |
0 |
28 |
0 |
0 |
T48 |
0 |
2 |
0 |
0 |
T49 |
6074 |
0 |
0 |
0 |
T50 |
4449 |
0 |
0 |
0 |
T51 |
2413 |
0 |
0 |
0 |
T52 |
5039 |
0 |
0 |
0 |
T53 |
2327 |
0 |
0 |
0 |
T54 |
19840 |
0 |
0 |
0 |
T55 |
6304 |
0 |
0 |
0 |
T56 |
3199 |
0 |
0 |
0 |
T57 |
9794 |
0 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_reg.u_usb_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
| Line No. | Total | Covered | Percent |
TOTAL | | 36 | 36 | 100.00 |
CONT_ASSIGN | 55 | 0 | 0 | |
CONT_ASSIGN | 194 | 1 | 1 | 100.00 |
CONT_ASSIGN | 195 | 1 | 1 | 100.00 |
ALWAYS | 219 | 12 | 12 | 100.00 |
ALWAYS | 263 | 12 | 12 | 100.00 |
ALWAYS | 307 | 5 | 5 | 100.00 |
ALWAYS | 316 | 5 | 5 | 100.00 |
CONT_ASSIGN | 335 | 0 | 0 | |
ALWAYS | 339 | 0 | 0 | |
54 logic unused_req_chk;
55 unreachable assign unused_req_chk = req_chk_i;
56
57 if (EnRzHs) begin : gen_rz_hs_protocol
58 //////////////////
59 // RZ protocol //
60 //////////////////
61
62 // Types
63 typedef enum logic {
64 LoSt, HiSt
65 } rz_fsm_e;
66
67 // Signals
68 rz_fsm_e src_fsm_d, src_fsm_q;
69 rz_fsm_e dst_fsm_d, dst_fsm_q;
70 logic src_ack, dst_ack;
71 logic src_req, dst_req;
72
73 // REQ-side FSM (SRC domain)
74 always_comb begin : src_fsm
75 src_fsm_d = src_fsm_q;
76 src_ack_o = 1'b0;
77 src_req = 1'b0;
78
79 unique case (src_fsm_q)
80 LoSt: begin
81 // Wait for the ack to go back to zero before starting
82 // a new transaction.
83 if (!src_ack && src_req_i) begin
84 src_fsm_d = HiSt;
85 end
86 end
87 HiSt: begin
88 src_req = 1'b1;
89 // Forward the acknowledgement.
90 src_ack_o = src_ack;
91 // If request drops out, we go back to LoSt.
92 // If DST side asserts ack, we also go back to LoSt.
93 if (!src_req_i || src_ack) begin
94 src_fsm_d = LoSt;
95 end
96 end
97 //VCS coverage off
98 // pragma coverage off
99 default: ;
100 //VCS coverage on
101 // pragma coverage on
102 endcase
103 end
104
105 // Move ACK over to SRC domain.
106 prim_flop_2sync #(
107 .Width(1)
108 ) ack_sync (
109 .clk_i (clk_src_i),
110 .rst_ni (rst_src_ni),
111 .d_i (dst_ack),
112 .q_o (src_ack)
113 );
114
115 // Registers
116 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
117 if (!rst_src_ni) begin
118 src_fsm_q <= LoSt;
119 end else begin
120 src_fsm_q <= src_fsm_d;
121 end
122 end
123
124 // ACK-side FSM (DST domain)
125 always_comb begin : dst_fsm
126 dst_fsm_d = dst_fsm_q;
127 dst_req_o = 1'b0;
128 dst_ack = 1'b0;
129
130 unique case (dst_fsm_q)
131 LoSt: begin
132 if (dst_req) begin
133 // Forward the request.
134 dst_req_o = 1'b1;
135 // Wait for the request and acknowledge to be asserted
136 // before responding to the SRC side.
137 if (dst_ack_i) begin
138 dst_fsm_d = HiSt;
139 end
140 end
141 end
142 HiSt: begin
143 dst_ack = 1'b1;
144 // Wait for the request to drop back to zero.
145 if (!dst_req) begin
146 dst_fsm_d = LoSt;
147 end
148 end
149 //VCS coverage off
150 // pragma coverage off
151 default: ;
152 //VCS coverage on
153 // pragma coverage on
154 endcase
155 end
156
157 // Move REQ over to DST domain.
158 prim_flop_2sync #(
159 .Width(1)
160 ) req_sync (
161 .clk_i (clk_dst_i),
162 .rst_ni (rst_dst_ni),
163 .d_i (src_req),
164 .q_o (dst_req)
165 );
166
167 // Registers
168 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
169 if (!rst_dst_ni) begin
170 dst_fsm_q <= LoSt;
171 end else begin
172 dst_fsm_q <= dst_fsm_d;
173 end
174 end
175
176 end else begin : gen_nrz_hs_protocol
177 //////////////////
178 // NRZ protocol //
179 //////////////////
180
181 // Types
182 typedef enum logic {
183 EVEN, ODD
184 } sync_reqack_fsm_e;
185
186 // Signals
187 sync_reqack_fsm_e src_fsm_ns, src_fsm_cs;
188 sync_reqack_fsm_e dst_fsm_ns, dst_fsm_cs;
189
190 logic src_req_d, src_req_q, src_ack;
191 logic dst_ack_d, dst_ack_q, dst_req;
192 logic src_handshake, dst_handshake;
193
194 1/1 assign src_handshake = src_req_i & src_ack_o;
Tests: T1 T2 T3
195 1/1 assign dst_handshake = dst_req_o & dst_ack_i;
Tests: T1 T2 T3
196
197 // Move REQ over to DST domain.
198 prim_flop_2sync #(
199 .Width(1)
200 ) req_sync (
201 .clk_i (clk_dst_i),
202 .rst_ni (rst_dst_ni),
203 .d_i (src_req_q),
204 .q_o (dst_req)
205 );
206
207 // Move ACK over to SRC domain.
208 prim_flop_2sync #(
209 .Width(1)
210 ) ack_sync (
211 .clk_i (clk_src_i),
212 .rst_ni (rst_src_ni),
213 .d_i (dst_ack_q),
214 .q_o (src_ack)
215 );
216
217 // REQ-side FSM (SRC domain)
218 always_comb begin : src_fsm
219 1/1 src_fsm_ns = src_fsm_cs;
Tests: T1 T2 T3
220
221 // By default, we keep the internal REQ value and don't ACK.
222 1/1 src_req_d = src_req_q;
Tests: T1 T2 T3
223 1/1 src_ack_o = 1'b0;
Tests: T1 T2 T3
224
225 1/1 unique case (src_fsm_cs)
Tests: T1 T2 T3
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 1/1 src_req_d = src_req_i;
Tests: T1 T2 T3
230 1/1 src_ack_o = src_ack;
Tests: T1 T2 T3
231
232 // The handshake is done for exactly 1 clock cycle.
233 1/1 if (src_handshake) begin
Tests: T1 T2 T3
234 1/1 src_fsm_ns = ODD;
Tests: T1 T2 T3
235 end
MISSING_ELSE
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 1/1 src_req_d = ~src_req_i;
Tests: T1 T2 T3
242 1/1 src_ack_o = ~src_ack;
Tests: T1 T2 T3
243
244 // The handshake is done for exactly 1 clock cycle.
245 1/1 if (src_handshake) begin
Tests: T1 T2 T3
246 1/1 src_fsm_ns = EVEN;
Tests: T3 T27 T10
247 end
MISSING_ELSE
248 end
249
250 //VCS coverage off
251 // pragma coverage off
252
253 default: ;
254
255 //VCS coverage on
256 // pragma coverage on
257
258 endcase
259 end
260
261 // ACK-side FSM (DST domain)
262 always_comb begin : dst_fsm
263 1/1 dst_fsm_ns = dst_fsm_cs;
Tests: T1 T2 T3
264
265 // By default, we don't REQ and keep the internal ACK.
266 1/1 dst_req_o = 1'b0;
Tests: T1 T2 T3
267 1/1 dst_ack_d = dst_ack_q;
Tests: T1 T2 T3
268
269 1/1 unique case (dst_fsm_cs)
Tests: T1 T2 T3
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 1/1 dst_req_o = dst_req;
Tests: T1 T2 T3
274 1/1 dst_ack_d = dst_ack_i;
Tests: T1 T2 T3
275
276 // The handshake is done for exactly 1 clock cycle.
277 1/1 if (dst_handshake) begin
Tests: T1 T2 T3
278 1/1 dst_fsm_ns = ODD;
Tests: T1 T2 T3
279 end
MISSING_ELSE
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 1/1 dst_req_o = ~dst_req;
Tests: T1 T2 T3
286 1/1 dst_ack_d = ~dst_ack_i;
Tests: T1 T2 T3
287
288 // The handshake is done for exactly 1 clock cycle.
289 1/1 if (dst_handshake) begin
Tests: T1 T2 T3
290 1/1 dst_fsm_ns = EVEN;
Tests: T3 T27 T10
291 end
MISSING_ELSE
292 end
293
294 //VCS coverage off
295 // pragma coverage off
296
297 default: ;
298
299 //VCS coverage on
300 // pragma coverage on
301
302 endcase
303 end
304
305 // Registers
306 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
307 1/1 if (!rst_src_ni) begin
Tests: T4 T5 T6
308 1/1 src_fsm_cs <= EVEN;
Tests: T4 T5 T6
309 1/1 src_req_q <= 1'b0;
Tests: T4 T5 T6
310 end else begin
311 1/1 src_fsm_cs <= src_fsm_ns;
Tests: T4 T5 T6
312 1/1 src_req_q <= src_req_d;
Tests: T4 T5 T6
313 end
314 end
315 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
316 1/1 if (!rst_dst_ni) begin
Tests: T4 T5 T6
317 1/1 dst_fsm_cs <= EVEN;
Tests: T4 T5 T6
318 1/1 dst_ack_q <= 1'b0;
Tests: T4 T5 T6
319 end else begin
320 1/1 dst_fsm_cs <= dst_fsm_ns;
Tests: T4 T5 T6
321 1/1 dst_ack_q <= dst_ack_d;
Tests: T4 T5 T6
322 end
323 end
324 end
325
326 ////////////////
327 // Assertions //
328 ////////////////
329
330 `ifdef INC_ASSERT
331 //VCS coverage off
332 // pragma coverage off
333
334 logic effective_rst_n;
335 unreachable assign effective_rst_n = rst_src_ni && rst_dst_ni;
336
337 logic chk_flag;
338 always_ff @(posedge clk_src_i or negedge effective_rst_n) begin
339 unreachable if (!effective_rst_n) begin
340 unreachable chk_flag <= '0;
341 unreachable end else if (src_req_i && !chk_flag) begin
342 unreachable chk_flag <= 1'b1;
343 end
==> MISSING_ELSE
Cond Coverage for Instance : tb.dut.u_reg.u_usb_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
| Total | Covered | Percent |
Conditions | 4 | 3 | 75.00 |
Logical | 4 | 3 | 75.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 194
EXPRESSION (src_req_i & src_ack_o)
----1---- ----2----
-1- | -2- | Status | Tests |
0 | 1 | Not Covered | |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T1,T2,T3 |
LINE 195
EXPRESSION (dst_req_o & dst_ack_i)
----1---- ----2----
-1- | -2- | Status | Tests | Exclude Annotation |
0 | 1 | Excluded | |
VC_COV_UNR |
1 | 0 | Excluded | |
VC_COV_UNR |
1 | 1 | Covered | T1,T2,T3 |
Branch Coverage for Instance : tb.dut.u_reg.u_usb_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
| Line No. | Total | Covered | Percent |
Branches |
|
12 |
12 |
100.00 |
CASE |
225 |
4 |
4 |
100.00 |
CASE |
269 |
4 |
4 |
100.00 |
IF |
307 |
2 |
2 |
100.00 |
IF |
316 |
2 |
2 |
100.00 |
225 unique case (src_fsm_cs)
-1-
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 src_req_d = src_req_i;
230 src_ack_o = src_ack;
231
232 // The handshake is done for exactly 1 clock cycle.
233 if (src_handshake) begin
-2-
234 src_fsm_ns = ODD;
==>
235 end
MISSING_ELSE
==>
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 src_req_d = ~src_req_i;
242 src_ack_o = ~src_ack;
243
244 // The handshake is done for exactly 1 clock cycle.
245 if (src_handshake) begin
-3-
246 src_fsm_ns = EVEN;
==>
247 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T1,T2,T3 |
EVEN |
0 |
- |
Covered |
T1,T2,T3 |
ODD |
- |
1 |
Covered |
T3,T27,T10 |
ODD |
- |
0 |
Covered |
T1,T2,T3 |
269 unique case (dst_fsm_cs)
-1-
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 dst_req_o = dst_req;
274 dst_ack_d = dst_ack_i;
275
276 // The handshake is done for exactly 1 clock cycle.
277 if (dst_handshake) begin
-2-
278 dst_fsm_ns = ODD;
==>
279 end
MISSING_ELSE
==>
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 dst_req_o = ~dst_req;
286 dst_ack_d = ~dst_ack_i;
287
288 // The handshake is done for exactly 1 clock cycle.
289 if (dst_handshake) begin
-3-
290 dst_fsm_ns = EVEN;
==>
291 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T1,T2,T3 |
EVEN |
0 |
- |
Covered |
T1,T2,T3 |
ODD |
- |
1 |
Covered |
T3,T27,T10 |
ODD |
- |
0 |
Covered |
T1,T2,T3 |
307 if (!rst_src_ni) begin
-1-
308 src_fsm_cs <= EVEN;
==>
309 src_req_q <= 1'b0;
310 end else begin
311 src_fsm_cs <= src_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
316 if (!rst_dst_ni) begin
-1-
317 dst_fsm_cs <= EVEN;
==>
318 dst_ack_q <= 1'b0;
319 end else begin
320 dst_fsm_cs <= dst_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
Assert Coverage for Instance : tb.dut.u_reg.u_usb_meas_ctrl_en_cdc.u_arb.gen_wr_req.u_dst_update_sync
Assertion Details
SyncReqAckAckNeedsReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
40545146 |
13106 |
0 |
0 |
T1 |
27978 |
5 |
0 |
0 |
T2 |
0 |
7 |
0 |
0 |
T3 |
0 |
10 |
0 |
0 |
T10 |
0 |
9 |
0 |
0 |
T27 |
0 |
12 |
0 |
0 |
T39 |
0 |
4 |
0 |
0 |
T44 |
0 |
12 |
0 |
0 |
T45 |
0 |
8 |
0 |
0 |
T47 |
0 |
28 |
0 |
0 |
T48 |
0 |
2 |
0 |
0 |
T49 |
1457 |
0 |
0 |
0 |
T50 |
1111 |
0 |
0 |
0 |
T51 |
2316 |
0 |
0 |
0 |
T52 |
1259 |
0 |
0 |
0 |
T53 |
2234 |
0 |
0 |
0 |
T54 |
9524 |
0 |
0 |
0 |
T55 |
757 |
0 |
0 |
0 |
T56 |
1568 |
0 |
0 |
0 |
T57 |
978 |
0 |
0 |
0 |
SyncReqAckHoldReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
49222570 |
12481 |
0 |
0 |
T2 |
27225 |
7 |
0 |
0 |
T3 |
29614 |
10 |
0 |
0 |
T7 |
0 |
42 |
0 |
0 |
T10 |
18721 |
8 |
0 |
0 |
T27 |
32746 |
12 |
0 |
0 |
T37 |
3899 |
0 |
0 |
0 |
T38 |
9467 |
0 |
0 |
0 |
T39 |
13627 |
4 |
0 |
0 |
T40 |
1306 |
0 |
0 |
0 |
T41 |
2746 |
0 |
0 |
0 |
T44 |
0 |
12 |
0 |
0 |
T45 |
0 |
8 |
0 |
0 |
T47 |
0 |
28 |
0 |
0 |
T48 |
0 |
2 |
0 |
0 |
T58 |
2042 |
0 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_io_meas.u_err_sync
| Line No. | Total | Covered | Percent |
TOTAL | | 36 | 36 | 100.00 |
CONT_ASSIGN | 55 | 0 | 0 | |
CONT_ASSIGN | 194 | 1 | 1 | 100.00 |
CONT_ASSIGN | 195 | 1 | 1 | 100.00 |
ALWAYS | 219 | 12 | 12 | 100.00 |
ALWAYS | 263 | 12 | 12 | 100.00 |
ALWAYS | 307 | 5 | 5 | 100.00 |
ALWAYS | 316 | 5 | 5 | 100.00 |
CONT_ASSIGN | 335 | 0 | 0 | |
ALWAYS | 339 | 0 | 0 | |
54 logic unused_req_chk;
55 unreachable assign unused_req_chk = req_chk_i;
56
57 if (EnRzHs) begin : gen_rz_hs_protocol
58 //////////////////
59 // RZ protocol //
60 //////////////////
61
62 // Types
63 typedef enum logic {
64 LoSt, HiSt
65 } rz_fsm_e;
66
67 // Signals
68 rz_fsm_e src_fsm_d, src_fsm_q;
69 rz_fsm_e dst_fsm_d, dst_fsm_q;
70 logic src_ack, dst_ack;
71 logic src_req, dst_req;
72
73 // REQ-side FSM (SRC domain)
74 always_comb begin : src_fsm
75 src_fsm_d = src_fsm_q;
76 src_ack_o = 1'b0;
77 src_req = 1'b0;
78
79 unique case (src_fsm_q)
80 LoSt: begin
81 // Wait for the ack to go back to zero before starting
82 // a new transaction.
83 if (!src_ack && src_req_i) begin
84 src_fsm_d = HiSt;
85 end
86 end
87 HiSt: begin
88 src_req = 1'b1;
89 // Forward the acknowledgement.
90 src_ack_o = src_ack;
91 // If request drops out, we go back to LoSt.
92 // If DST side asserts ack, we also go back to LoSt.
93 if (!src_req_i || src_ack) begin
94 src_fsm_d = LoSt;
95 end
96 end
97 //VCS coverage off
98 // pragma coverage off
99 default: ;
100 //VCS coverage on
101 // pragma coverage on
102 endcase
103 end
104
105 // Move ACK over to SRC domain.
106 prim_flop_2sync #(
107 .Width(1)
108 ) ack_sync (
109 .clk_i (clk_src_i),
110 .rst_ni (rst_src_ni),
111 .d_i (dst_ack),
112 .q_o (src_ack)
113 );
114
115 // Registers
116 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
117 if (!rst_src_ni) begin
118 src_fsm_q <= LoSt;
119 end else begin
120 src_fsm_q <= src_fsm_d;
121 end
122 end
123
124 // ACK-side FSM (DST domain)
125 always_comb begin : dst_fsm
126 dst_fsm_d = dst_fsm_q;
127 dst_req_o = 1'b0;
128 dst_ack = 1'b0;
129
130 unique case (dst_fsm_q)
131 LoSt: begin
132 if (dst_req) begin
133 // Forward the request.
134 dst_req_o = 1'b1;
135 // Wait for the request and acknowledge to be asserted
136 // before responding to the SRC side.
137 if (dst_ack_i) begin
138 dst_fsm_d = HiSt;
139 end
140 end
141 end
142 HiSt: begin
143 dst_ack = 1'b1;
144 // Wait for the request to drop back to zero.
145 if (!dst_req) begin
146 dst_fsm_d = LoSt;
147 end
148 end
149 //VCS coverage off
150 // pragma coverage off
151 default: ;
152 //VCS coverage on
153 // pragma coverage on
154 endcase
155 end
156
157 // Move REQ over to DST domain.
158 prim_flop_2sync #(
159 .Width(1)
160 ) req_sync (
161 .clk_i (clk_dst_i),
162 .rst_ni (rst_dst_ni),
163 .d_i (src_req),
164 .q_o (dst_req)
165 );
166
167 // Registers
168 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
169 if (!rst_dst_ni) begin
170 dst_fsm_q <= LoSt;
171 end else begin
172 dst_fsm_q <= dst_fsm_d;
173 end
174 end
175
176 end else begin : gen_nrz_hs_protocol
177 //////////////////
178 // NRZ protocol //
179 //////////////////
180
181 // Types
182 typedef enum logic {
183 EVEN, ODD
184 } sync_reqack_fsm_e;
185
186 // Signals
187 sync_reqack_fsm_e src_fsm_ns, src_fsm_cs;
188 sync_reqack_fsm_e dst_fsm_ns, dst_fsm_cs;
189
190 logic src_req_d, src_req_q, src_ack;
191 logic dst_ack_d, dst_ack_q, dst_req;
192 logic src_handshake, dst_handshake;
193
194 1/1 assign src_handshake = src_req_i & src_ack_o;
Tests: T45 T7 T35
195 1/1 assign dst_handshake = dst_req_o & dst_ack_i;
Tests: T45 T7 T35
196
197 // Move REQ over to DST domain.
198 prim_flop_2sync #(
199 .Width(1)
200 ) req_sync (
201 .clk_i (clk_dst_i),
202 .rst_ni (rst_dst_ni),
203 .d_i (src_req_q),
204 .q_o (dst_req)
205 );
206
207 // Move ACK over to SRC domain.
208 prim_flop_2sync #(
209 .Width(1)
210 ) ack_sync (
211 .clk_i (clk_src_i),
212 .rst_ni (rst_src_ni),
213 .d_i (dst_ack_q),
214 .q_o (src_ack)
215 );
216
217 // REQ-side FSM (SRC domain)
218 always_comb begin : src_fsm
219 1/1 src_fsm_ns = src_fsm_cs;
Tests: T45 T7 T35
220
221 // By default, we keep the internal REQ value and don't ACK.
222 1/1 src_req_d = src_req_q;
Tests: T45 T7 T35
223 1/1 src_ack_o = 1'b0;
Tests: T45 T7 T35
224
225 1/1 unique case (src_fsm_cs)
Tests: T45 T7 T35
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 1/1 src_req_d = src_req_i;
Tests: T45 T7 T35
230 1/1 src_ack_o = src_ack;
Tests: T45 T7 T35
231
232 // The handshake is done for exactly 1 clock cycle.
233 1/1 if (src_handshake) begin
Tests: T45 T7 T35
234 1/1 src_fsm_ns = ODD;
Tests: T45 T7 T35
235 end
MISSING_ELSE
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 1/1 src_req_d = ~src_req_i;
Tests: T45 T7 T35
242 1/1 src_ack_o = ~src_ack;
Tests: T45 T7 T35
243
244 // The handshake is done for exactly 1 clock cycle.
245 1/1 if (src_handshake) begin
Tests: T45 T7 T35
246 1/1 src_fsm_ns = EVEN;
Tests: T45 T7 T35
247 end
MISSING_ELSE
248 end
249
250 //VCS coverage off
251 // pragma coverage off
252
253 default: ;
254
255 //VCS coverage on
256 // pragma coverage on
257
258 endcase
259 end
260
261 // ACK-side FSM (DST domain)
262 always_comb begin : dst_fsm
263 1/1 dst_fsm_ns = dst_fsm_cs;
Tests: T45 T7 T35
264
265 // By default, we don't REQ and keep the internal ACK.
266 1/1 dst_req_o = 1'b0;
Tests: T45 T7 T35
267 1/1 dst_ack_d = dst_ack_q;
Tests: T45 T7 T35
268
269 1/1 unique case (dst_fsm_cs)
Tests: T45 T7 T35
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 1/1 dst_req_o = dst_req;
Tests: T45 T7 T35
274 1/1 dst_ack_d = dst_ack_i;
Tests: T45 T7 T35
275
276 // The handshake is done for exactly 1 clock cycle.
277 1/1 if (dst_handshake) begin
Tests: T45 T7 T35
278 1/1 dst_fsm_ns = ODD;
Tests: T45 T7 T35
279 end
MISSING_ELSE
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 1/1 dst_req_o = ~dst_req;
Tests: T45 T7 T35
286 1/1 dst_ack_d = ~dst_ack_i;
Tests: T45 T7 T35
287
288 // The handshake is done for exactly 1 clock cycle.
289 1/1 if (dst_handshake) begin
Tests: T45 T7 T35
290 1/1 dst_fsm_ns = EVEN;
Tests: T45 T7 T35
291 end
MISSING_ELSE
292 end
293
294 //VCS coverage off
295 // pragma coverage off
296
297 default: ;
298
299 //VCS coverage on
300 // pragma coverage on
301
302 endcase
303 end
304
305 // Registers
306 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
307 1/1 if (!rst_src_ni) begin
Tests: T4 T5 T6
308 1/1 src_fsm_cs <= EVEN;
Tests: T4 T5 T6
309 1/1 src_req_q <= 1'b0;
Tests: T4 T5 T6
310 end else begin
311 1/1 src_fsm_cs <= src_fsm_ns;
Tests: T4 T5 T6
312 1/1 src_req_q <= src_req_d;
Tests: T4 T5 T6
313 end
314 end
315 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
316 1/1 if (!rst_dst_ni) begin
Tests: T4 T5 T6
317 1/1 dst_fsm_cs <= EVEN;
Tests: T4 T5 T6
318 1/1 dst_ack_q <= 1'b0;
Tests: T4 T5 T6
319 end else begin
320 1/1 dst_fsm_cs <= dst_fsm_ns;
Tests: T4 T5 T6
321 1/1 dst_ack_q <= dst_ack_d;
Tests: T4 T5 T6
322 end
323 end
324 end
325
326 ////////////////
327 // Assertions //
328 ////////////////
329
330 `ifdef INC_ASSERT
331 //VCS coverage off
332 // pragma coverage off
333
334 logic effective_rst_n;
335 unreachable assign effective_rst_n = rst_src_ni && rst_dst_ni;
336
337 logic chk_flag;
338 always_ff @(posedge clk_src_i or negedge effective_rst_n) begin
339 unreachable if (!effective_rst_n) begin
340 unreachable chk_flag <= '0;
341 unreachable end else if (src_req_i && !chk_flag) begin
342 unreachable chk_flag <= 1'b1;
343 end
==> MISSING_ELSE
Cond Coverage for Instance : tb.dut.u_io_meas.u_err_sync
| Total | Covered | Percent |
Conditions | 4 | 3 | 75.00 |
Logical | 4 | 3 | 75.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 194
EXPRESSION (src_req_i & src_ack_o)
----1---- ----2----
-1- | -2- | Status | Tests |
0 | 1 | Not Covered | |
1 | 0 | Covered | T45,T7,T35 |
1 | 1 | Covered | T45,T7,T35 |
LINE 195
EXPRESSION (dst_req_o & dst_ack_i)
----1---- ----2----
-1- | -2- | Status | Tests | Exclude Annotation |
0 | 1 | Excluded | |
VC_COV_UNR |
1 | 0 | Excluded | |
VC_COV_UNR |
1 | 1 | Covered | T45,T7,T35 |
Branch Coverage for Instance : tb.dut.u_io_meas.u_err_sync
| Line No. | Total | Covered | Percent |
Branches |
|
12 |
12 |
100.00 |
CASE |
225 |
4 |
4 |
100.00 |
CASE |
269 |
4 |
4 |
100.00 |
IF |
307 |
2 |
2 |
100.00 |
IF |
316 |
2 |
2 |
100.00 |
225 unique case (src_fsm_cs)
-1-
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 src_req_d = src_req_i;
230 src_ack_o = src_ack;
231
232 // The handshake is done for exactly 1 clock cycle.
233 if (src_handshake) begin
-2-
234 src_fsm_ns = ODD;
==>
235 end
MISSING_ELSE
==>
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 src_req_d = ~src_req_i;
242 src_ack_o = ~src_ack;
243
244 // The handshake is done for exactly 1 clock cycle.
245 if (src_handshake) begin
-3-
246 src_fsm_ns = EVEN;
==>
247 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T45,T7,T35 |
EVEN |
0 |
- |
Covered |
T45,T7,T35 |
ODD |
- |
1 |
Covered |
T45,T7,T35 |
ODD |
- |
0 |
Covered |
T45,T7,T35 |
269 unique case (dst_fsm_cs)
-1-
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 dst_req_o = dst_req;
274 dst_ack_d = dst_ack_i;
275
276 // The handshake is done for exactly 1 clock cycle.
277 if (dst_handshake) begin
-2-
278 dst_fsm_ns = ODD;
==>
279 end
MISSING_ELSE
==>
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 dst_req_o = ~dst_req;
286 dst_ack_d = ~dst_ack_i;
287
288 // The handshake is done for exactly 1 clock cycle.
289 if (dst_handshake) begin
-3-
290 dst_fsm_ns = EVEN;
==>
291 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T45,T7,T35 |
EVEN |
0 |
- |
Covered |
T45,T7,T35 |
ODD |
- |
1 |
Covered |
T45,T7,T35 |
ODD |
- |
0 |
Covered |
T45,T7,T35 |
307 if (!rst_src_ni) begin
-1-
308 src_fsm_cs <= EVEN;
==>
309 src_req_q <= 1'b0;
310 end else begin
311 src_fsm_cs <= src_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
316 if (!rst_dst_ni) begin
-1-
317 dst_fsm_cs <= EVEN;
==>
318 dst_ack_q <= 1'b0;
319 end else begin
320 dst_fsm_cs <= dst_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
Assert Coverage for Instance : tb.dut.u_io_meas.u_err_sync
Assertion Details
SyncReqAckAckNeedsReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
39604799 |
1543 |
0 |
0 |
T7 |
54981 |
14 |
0 |
0 |
T9 |
0 |
17 |
0 |
0 |
T11 |
0 |
17 |
0 |
0 |
T12 |
0 |
4 |
0 |
0 |
T13 |
0 |
4 |
0 |
0 |
T14 |
0 |
3 |
0 |
0 |
T15 |
0 |
4 |
0 |
0 |
T17 |
0 |
3 |
0 |
0 |
T18 |
1129 |
0 |
0 |
0 |
T19 |
14804 |
0 |
0 |
0 |
T20 |
1824 |
0 |
0 |
0 |
T35 |
0 |
7 |
0 |
0 |
T45 |
19980 |
4 |
0 |
0 |
T59 |
968 |
0 |
0 |
0 |
T60 |
1812 |
0 |
0 |
0 |
T61 |
2081 |
0 |
0 |
0 |
T62 |
3755 |
0 |
0 |
0 |
T63 |
1449 |
0 |
0 |
0 |
SyncReqAckHoldReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
90243933 |
1543 |
0 |
0 |
T7 |
239916 |
14 |
0 |
0 |
T9 |
0 |
17 |
0 |
0 |
T11 |
0 |
17 |
0 |
0 |
T12 |
0 |
4 |
0 |
0 |
T13 |
0 |
4 |
0 |
0 |
T14 |
0 |
3 |
0 |
0 |
T15 |
0 |
4 |
0 |
0 |
T17 |
0 |
3 |
0 |
0 |
T18 |
4337 |
0 |
0 |
0 |
T19 |
56851 |
0 |
0 |
0 |
T20 |
1805 |
0 |
0 |
0 |
T35 |
0 |
7 |
0 |
0 |
T45 |
42622 |
4 |
0 |
0 |
T59 |
3839 |
0 |
0 |
0 |
T60 |
1812 |
0 |
0 |
0 |
T61 |
2038 |
0 |
0 |
0 |
T62 |
3605 |
0 |
0 |
0 |
T63 |
5568 |
0 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_io_div2_meas.u_err_sync
| Line No. | Total | Covered | Percent |
TOTAL | | 36 | 36 | 100.00 |
CONT_ASSIGN | 55 | 0 | 0 | |
CONT_ASSIGN | 194 | 1 | 1 | 100.00 |
CONT_ASSIGN | 195 | 1 | 1 | 100.00 |
ALWAYS | 219 | 12 | 12 | 100.00 |
ALWAYS | 263 | 12 | 12 | 100.00 |
ALWAYS | 307 | 5 | 5 | 100.00 |
ALWAYS | 316 | 5 | 5 | 100.00 |
CONT_ASSIGN | 335 | 0 | 0 | |
ALWAYS | 339 | 0 | 0 | |
54 logic unused_req_chk;
55 unreachable assign unused_req_chk = req_chk_i;
56
57 if (EnRzHs) begin : gen_rz_hs_protocol
58 //////////////////
59 // RZ protocol //
60 //////////////////
61
62 // Types
63 typedef enum logic {
64 LoSt, HiSt
65 } rz_fsm_e;
66
67 // Signals
68 rz_fsm_e src_fsm_d, src_fsm_q;
69 rz_fsm_e dst_fsm_d, dst_fsm_q;
70 logic src_ack, dst_ack;
71 logic src_req, dst_req;
72
73 // REQ-side FSM (SRC domain)
74 always_comb begin : src_fsm
75 src_fsm_d = src_fsm_q;
76 src_ack_o = 1'b0;
77 src_req = 1'b0;
78
79 unique case (src_fsm_q)
80 LoSt: begin
81 // Wait for the ack to go back to zero before starting
82 // a new transaction.
83 if (!src_ack && src_req_i) begin
84 src_fsm_d = HiSt;
85 end
86 end
87 HiSt: begin
88 src_req = 1'b1;
89 // Forward the acknowledgement.
90 src_ack_o = src_ack;
91 // If request drops out, we go back to LoSt.
92 // If DST side asserts ack, we also go back to LoSt.
93 if (!src_req_i || src_ack) begin
94 src_fsm_d = LoSt;
95 end
96 end
97 //VCS coverage off
98 // pragma coverage off
99 default: ;
100 //VCS coverage on
101 // pragma coverage on
102 endcase
103 end
104
105 // Move ACK over to SRC domain.
106 prim_flop_2sync #(
107 .Width(1)
108 ) ack_sync (
109 .clk_i (clk_src_i),
110 .rst_ni (rst_src_ni),
111 .d_i (dst_ack),
112 .q_o (src_ack)
113 );
114
115 // Registers
116 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
117 if (!rst_src_ni) begin
118 src_fsm_q <= LoSt;
119 end else begin
120 src_fsm_q <= src_fsm_d;
121 end
122 end
123
124 // ACK-side FSM (DST domain)
125 always_comb begin : dst_fsm
126 dst_fsm_d = dst_fsm_q;
127 dst_req_o = 1'b0;
128 dst_ack = 1'b0;
129
130 unique case (dst_fsm_q)
131 LoSt: begin
132 if (dst_req) begin
133 // Forward the request.
134 dst_req_o = 1'b1;
135 // Wait for the request and acknowledge to be asserted
136 // before responding to the SRC side.
137 if (dst_ack_i) begin
138 dst_fsm_d = HiSt;
139 end
140 end
141 end
142 HiSt: begin
143 dst_ack = 1'b1;
144 // Wait for the request to drop back to zero.
145 if (!dst_req) begin
146 dst_fsm_d = LoSt;
147 end
148 end
149 //VCS coverage off
150 // pragma coverage off
151 default: ;
152 //VCS coverage on
153 // pragma coverage on
154 endcase
155 end
156
157 // Move REQ over to DST domain.
158 prim_flop_2sync #(
159 .Width(1)
160 ) req_sync (
161 .clk_i (clk_dst_i),
162 .rst_ni (rst_dst_ni),
163 .d_i (src_req),
164 .q_o (dst_req)
165 );
166
167 // Registers
168 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
169 if (!rst_dst_ni) begin
170 dst_fsm_q <= LoSt;
171 end else begin
172 dst_fsm_q <= dst_fsm_d;
173 end
174 end
175
176 end else begin : gen_nrz_hs_protocol
177 //////////////////
178 // NRZ protocol //
179 //////////////////
180
181 // Types
182 typedef enum logic {
183 EVEN, ODD
184 } sync_reqack_fsm_e;
185
186 // Signals
187 sync_reqack_fsm_e src_fsm_ns, src_fsm_cs;
188 sync_reqack_fsm_e dst_fsm_ns, dst_fsm_cs;
189
190 logic src_req_d, src_req_q, src_ack;
191 logic dst_ack_d, dst_ack_q, dst_req;
192 logic src_handshake, dst_handshake;
193
194 1/1 assign src_handshake = src_req_i & src_ack_o;
Tests: T27 T7 T35
195 1/1 assign dst_handshake = dst_req_o & dst_ack_i;
Tests: T27 T7 T35
196
197 // Move REQ over to DST domain.
198 prim_flop_2sync #(
199 .Width(1)
200 ) req_sync (
201 .clk_i (clk_dst_i),
202 .rst_ni (rst_dst_ni),
203 .d_i (src_req_q),
204 .q_o (dst_req)
205 );
206
207 // Move ACK over to SRC domain.
208 prim_flop_2sync #(
209 .Width(1)
210 ) ack_sync (
211 .clk_i (clk_src_i),
212 .rst_ni (rst_src_ni),
213 .d_i (dst_ack_q),
214 .q_o (src_ack)
215 );
216
217 // REQ-side FSM (SRC domain)
218 always_comb begin : src_fsm
219 1/1 src_fsm_ns = src_fsm_cs;
Tests: T27 T7 T35
220
221 // By default, we keep the internal REQ value and don't ACK.
222 1/1 src_req_d = src_req_q;
Tests: T27 T7 T35
223 1/1 src_ack_o = 1'b0;
Tests: T27 T7 T35
224
225 1/1 unique case (src_fsm_cs)
Tests: T27 T7 T35
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 1/1 src_req_d = src_req_i;
Tests: T27 T7 T35
230 1/1 src_ack_o = src_ack;
Tests: T27 T7 T35
231
232 // The handshake is done for exactly 1 clock cycle.
233 1/1 if (src_handshake) begin
Tests: T27 T7 T35
234 1/1 src_fsm_ns = ODD;
Tests: T27 T7 T35
235 end
MISSING_ELSE
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 1/1 src_req_d = ~src_req_i;
Tests: T27 T7 T35
242 1/1 src_ack_o = ~src_ack;
Tests: T27 T7 T35
243
244 // The handshake is done for exactly 1 clock cycle.
245 1/1 if (src_handshake) begin
Tests: T27 T7 T35
246 1/1 src_fsm_ns = EVEN;
Tests: T27 T7 T35
247 end
MISSING_ELSE
248 end
249
250 //VCS coverage off
251 // pragma coverage off
252
253 default: ;
254
255 //VCS coverage on
256 // pragma coverage on
257
258 endcase
259 end
260
261 // ACK-side FSM (DST domain)
262 always_comb begin : dst_fsm
263 1/1 dst_fsm_ns = dst_fsm_cs;
Tests: T27 T7 T35
264
265 // By default, we don't REQ and keep the internal ACK.
266 1/1 dst_req_o = 1'b0;
Tests: T27 T7 T35
267 1/1 dst_ack_d = dst_ack_q;
Tests: T27 T7 T35
268
269 1/1 unique case (dst_fsm_cs)
Tests: T27 T7 T35
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 1/1 dst_req_o = dst_req;
Tests: T27 T7 T35
274 1/1 dst_ack_d = dst_ack_i;
Tests: T27 T7 T35
275
276 // The handshake is done for exactly 1 clock cycle.
277 1/1 if (dst_handshake) begin
Tests: T27 T7 T35
278 1/1 dst_fsm_ns = ODD;
Tests: T27 T7 T35
279 end
MISSING_ELSE
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 1/1 dst_req_o = ~dst_req;
Tests: T27 T7 T35
286 1/1 dst_ack_d = ~dst_ack_i;
Tests: T27 T7 T35
287
288 // The handshake is done for exactly 1 clock cycle.
289 1/1 if (dst_handshake) begin
Tests: T27 T7 T35
290 1/1 dst_fsm_ns = EVEN;
Tests: T27 T7 T35
291 end
MISSING_ELSE
292 end
293
294 //VCS coverage off
295 // pragma coverage off
296
297 default: ;
298
299 //VCS coverage on
300 // pragma coverage on
301
302 endcase
303 end
304
305 // Registers
306 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
307 1/1 if (!rst_src_ni) begin
Tests: T4 T5 T6
308 1/1 src_fsm_cs <= EVEN;
Tests: T4 T5 T6
309 1/1 src_req_q <= 1'b0;
Tests: T4 T5 T6
310 end else begin
311 1/1 src_fsm_cs <= src_fsm_ns;
Tests: T4 T5 T6
312 1/1 src_req_q <= src_req_d;
Tests: T4 T5 T6
313 end
314 end
315 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
316 1/1 if (!rst_dst_ni) begin
Tests: T4 T5 T6
317 1/1 dst_fsm_cs <= EVEN;
Tests: T4 T5 T6
318 1/1 dst_ack_q <= 1'b0;
Tests: T4 T5 T6
319 end else begin
320 1/1 dst_fsm_cs <= dst_fsm_ns;
Tests: T4 T5 T6
321 1/1 dst_ack_q <= dst_ack_d;
Tests: T4 T5 T6
322 end
323 end
324 end
325
326 ////////////////
327 // Assertions //
328 ////////////////
329
330 `ifdef INC_ASSERT
331 //VCS coverage off
332 // pragma coverage off
333
334 logic effective_rst_n;
335 unreachable assign effective_rst_n = rst_src_ni && rst_dst_ni;
336
337 logic chk_flag;
338 always_ff @(posedge clk_src_i or negedge effective_rst_n) begin
339 unreachable if (!effective_rst_n) begin
340 unreachable chk_flag <= '0;
341 unreachable end else if (src_req_i && !chk_flag) begin
342 unreachable chk_flag <= 1'b1;
343 end
==> MISSING_ELSE
Cond Coverage for Instance : tb.dut.u_io_div2_meas.u_err_sync
| Total | Covered | Percent |
Conditions | 4 | 3 | 75.00 |
Logical | 4 | 3 | 75.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 194
EXPRESSION (src_req_i & src_ack_o)
----1---- ----2----
-1- | -2- | Status | Tests |
0 | 1 | Not Covered | |
1 | 0 | Covered | T27,T7,T35 |
1 | 1 | Covered | T27,T7,T35 |
LINE 195
EXPRESSION (dst_req_o & dst_ack_i)
----1---- ----2----
-1- | -2- | Status | Tests | Exclude Annotation |
0 | 1 | Excluded | |
VC_COV_UNR |
1 | 0 | Excluded | |
VC_COV_UNR |
1 | 1 | Covered | T27,T7,T35 |
Branch Coverage for Instance : tb.dut.u_io_div2_meas.u_err_sync
| Line No. | Total | Covered | Percent |
Branches |
|
12 |
12 |
100.00 |
CASE |
225 |
4 |
4 |
100.00 |
CASE |
269 |
4 |
4 |
100.00 |
IF |
307 |
2 |
2 |
100.00 |
IF |
316 |
2 |
2 |
100.00 |
225 unique case (src_fsm_cs)
-1-
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 src_req_d = src_req_i;
230 src_ack_o = src_ack;
231
232 // The handshake is done for exactly 1 clock cycle.
233 if (src_handshake) begin
-2-
234 src_fsm_ns = ODD;
==>
235 end
MISSING_ELSE
==>
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 src_req_d = ~src_req_i;
242 src_ack_o = ~src_ack;
243
244 // The handshake is done for exactly 1 clock cycle.
245 if (src_handshake) begin
-3-
246 src_fsm_ns = EVEN;
==>
247 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T27,T7,T35 |
EVEN |
0 |
- |
Covered |
T27,T7,T35 |
ODD |
- |
1 |
Covered |
T27,T7,T35 |
ODD |
- |
0 |
Covered |
T27,T7,T35 |
269 unique case (dst_fsm_cs)
-1-
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 dst_req_o = dst_req;
274 dst_ack_d = dst_ack_i;
275
276 // The handshake is done for exactly 1 clock cycle.
277 if (dst_handshake) begin
-2-
278 dst_fsm_ns = ODD;
==>
279 end
MISSING_ELSE
==>
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 dst_req_o = ~dst_req;
286 dst_ack_d = ~dst_ack_i;
287
288 // The handshake is done for exactly 1 clock cycle.
289 if (dst_handshake) begin
-3-
290 dst_fsm_ns = EVEN;
==>
291 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T27,T7,T35 |
EVEN |
0 |
- |
Covered |
T27,T7,T35 |
ODD |
- |
1 |
Covered |
T27,T7,T35 |
ODD |
- |
0 |
Covered |
T27,T7,T35 |
307 if (!rst_src_ni) begin
-1-
308 src_fsm_cs <= EVEN;
==>
309 src_req_q <= 1'b0;
310 end else begin
311 src_fsm_cs <= src_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
316 if (!rst_dst_ni) begin
-1-
317 dst_fsm_cs <= EVEN;
==>
318 dst_ack_q <= 1'b0;
319 end else begin
320 dst_fsm_cs <= dst_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
Assert Coverage for Instance : tb.dut.u_io_div2_meas.u_err_sync
Assertion Details
SyncReqAckAckNeedsReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
39604799 |
1467 |
0 |
0 |
T7 |
0 |
3 |
0 |
0 |
T9 |
0 |
15 |
0 |
0 |
T10 |
10140 |
0 |
0 |
0 |
T11 |
0 |
14 |
0 |
0 |
T12 |
0 |
11 |
0 |
0 |
T13 |
0 |
19 |
0 |
0 |
T16 |
0 |
10 |
0 |
0 |
T17 |
0 |
3 |
0 |
0 |
T27 |
33429 |
3 |
0 |
0 |
T35 |
0 |
4 |
0 |
0 |
T36 |
0 |
4 |
0 |
0 |
T37 |
2274 |
0 |
0 |
0 |
T38 |
2564 |
0 |
0 |
0 |
T39 |
6813 |
0 |
0 |
0 |
T40 |
652 |
0 |
0 |
0 |
T41 |
752 |
0 |
0 |
0 |
T42 |
2815 |
0 |
0 |
0 |
T43 |
2088 |
0 |
0 |
0 |
T44 |
32206 |
0 |
0 |
0 |
SyncReqAckHoldReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
44418973 |
1467 |
0 |
0 |
T7 |
0 |
3 |
0 |
0 |
T9 |
0 |
15 |
0 |
0 |
T10 |
12709 |
0 |
0 |
0 |
T11 |
0 |
14 |
0 |
0 |
T12 |
0 |
11 |
0 |
0 |
T13 |
0 |
19 |
0 |
0 |
T16 |
0 |
10 |
0 |
0 |
T17 |
0 |
3 |
0 |
0 |
T27 |
32678 |
3 |
0 |
0 |
T35 |
0 |
4 |
0 |
0 |
T36 |
0 |
4 |
0 |
0 |
T37 |
4439 |
0 |
0 |
0 |
T38 |
9434 |
0 |
0 |
0 |
T39 |
13567 |
0 |
0 |
0 |
T40 |
1267 |
0 |
0 |
0 |
T41 |
2659 |
0 |
0 |
0 |
T42 |
26966 |
0 |
0 |
0 |
T43 |
9974 |
0 |
0 |
0 |
T44 |
24419 |
0 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_io_div4_meas.u_err_sync
| Line No. | Total | Covered | Percent |
TOTAL | | 36 | 36 | 100.00 |
CONT_ASSIGN | 55 | 0 | 0 | |
CONT_ASSIGN | 194 | 1 | 1 | 100.00 |
CONT_ASSIGN | 195 | 1 | 1 | 100.00 |
ALWAYS | 219 | 12 | 12 | 100.00 |
ALWAYS | 263 | 12 | 12 | 100.00 |
ALWAYS | 307 | 5 | 5 | 100.00 |
ALWAYS | 316 | 5 | 5 | 100.00 |
CONT_ASSIGN | 335 | 0 | 0 | |
ALWAYS | 339 | 0 | 0 | |
54 logic unused_req_chk;
55 unreachable assign unused_req_chk = req_chk_i;
56
57 if (EnRzHs) begin : gen_rz_hs_protocol
58 //////////////////
59 // RZ protocol //
60 //////////////////
61
62 // Types
63 typedef enum logic {
64 LoSt, HiSt
65 } rz_fsm_e;
66
67 // Signals
68 rz_fsm_e src_fsm_d, src_fsm_q;
69 rz_fsm_e dst_fsm_d, dst_fsm_q;
70 logic src_ack, dst_ack;
71 logic src_req, dst_req;
72
73 // REQ-side FSM (SRC domain)
74 always_comb begin : src_fsm
75 src_fsm_d = src_fsm_q;
76 src_ack_o = 1'b0;
77 src_req = 1'b0;
78
79 unique case (src_fsm_q)
80 LoSt: begin
81 // Wait for the ack to go back to zero before starting
82 // a new transaction.
83 if (!src_ack && src_req_i) begin
84 src_fsm_d = HiSt;
85 end
86 end
87 HiSt: begin
88 src_req = 1'b1;
89 // Forward the acknowledgement.
90 src_ack_o = src_ack;
91 // If request drops out, we go back to LoSt.
92 // If DST side asserts ack, we also go back to LoSt.
93 if (!src_req_i || src_ack) begin
94 src_fsm_d = LoSt;
95 end
96 end
97 //VCS coverage off
98 // pragma coverage off
99 default: ;
100 //VCS coverage on
101 // pragma coverage on
102 endcase
103 end
104
105 // Move ACK over to SRC domain.
106 prim_flop_2sync #(
107 .Width(1)
108 ) ack_sync (
109 .clk_i (clk_src_i),
110 .rst_ni (rst_src_ni),
111 .d_i (dst_ack),
112 .q_o (src_ack)
113 );
114
115 // Registers
116 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
117 if (!rst_src_ni) begin
118 src_fsm_q <= LoSt;
119 end else begin
120 src_fsm_q <= src_fsm_d;
121 end
122 end
123
124 // ACK-side FSM (DST domain)
125 always_comb begin : dst_fsm
126 dst_fsm_d = dst_fsm_q;
127 dst_req_o = 1'b0;
128 dst_ack = 1'b0;
129
130 unique case (dst_fsm_q)
131 LoSt: begin
132 if (dst_req) begin
133 // Forward the request.
134 dst_req_o = 1'b1;
135 // Wait for the request and acknowledge to be asserted
136 // before responding to the SRC side.
137 if (dst_ack_i) begin
138 dst_fsm_d = HiSt;
139 end
140 end
141 end
142 HiSt: begin
143 dst_ack = 1'b1;
144 // Wait for the request to drop back to zero.
145 if (!dst_req) begin
146 dst_fsm_d = LoSt;
147 end
148 end
149 //VCS coverage off
150 // pragma coverage off
151 default: ;
152 //VCS coverage on
153 // pragma coverage on
154 endcase
155 end
156
157 // Move REQ over to DST domain.
158 prim_flop_2sync #(
159 .Width(1)
160 ) req_sync (
161 .clk_i (clk_dst_i),
162 .rst_ni (rst_dst_ni),
163 .d_i (src_req),
164 .q_o (dst_req)
165 );
166
167 // Registers
168 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
169 if (!rst_dst_ni) begin
170 dst_fsm_q <= LoSt;
171 end else begin
172 dst_fsm_q <= dst_fsm_d;
173 end
174 end
175
176 end else begin : gen_nrz_hs_protocol
177 //////////////////
178 // NRZ protocol //
179 //////////////////
180
181 // Types
182 typedef enum logic {
183 EVEN, ODD
184 } sync_reqack_fsm_e;
185
186 // Signals
187 sync_reqack_fsm_e src_fsm_ns, src_fsm_cs;
188 sync_reqack_fsm_e dst_fsm_ns, dst_fsm_cs;
189
190 logic src_req_d, src_req_q, src_ack;
191 logic dst_ack_d, dst_ack_q, dst_req;
192 logic src_handshake, dst_handshake;
193
194 1/1 assign src_handshake = src_req_i & src_ack_o;
Tests: T7 T8 T35
195 1/1 assign dst_handshake = dst_req_o & dst_ack_i;
Tests: T7 T8 T35
196
197 // Move REQ over to DST domain.
198 prim_flop_2sync #(
199 .Width(1)
200 ) req_sync (
201 .clk_i (clk_dst_i),
202 .rst_ni (rst_dst_ni),
203 .d_i (src_req_q),
204 .q_o (dst_req)
205 );
206
207 // Move ACK over to SRC domain.
208 prim_flop_2sync #(
209 .Width(1)
210 ) ack_sync (
211 .clk_i (clk_src_i),
212 .rst_ni (rst_src_ni),
213 .d_i (dst_ack_q),
214 .q_o (src_ack)
215 );
216
217 // REQ-side FSM (SRC domain)
218 always_comb begin : src_fsm
219 1/1 src_fsm_ns = src_fsm_cs;
Tests: T7 T8 T35
220
221 // By default, we keep the internal REQ value and don't ACK.
222 1/1 src_req_d = src_req_q;
Tests: T7 T8 T35
223 1/1 src_ack_o = 1'b0;
Tests: T7 T8 T35
224
225 1/1 unique case (src_fsm_cs)
Tests: T7 T8 T35
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 1/1 src_req_d = src_req_i;
Tests: T7 T8 T35
230 1/1 src_ack_o = src_ack;
Tests: T7 T8 T35
231
232 // The handshake is done for exactly 1 clock cycle.
233 1/1 if (src_handshake) begin
Tests: T7 T8 T35
234 1/1 src_fsm_ns = ODD;
Tests: T7 T8 T35
235 end
MISSING_ELSE
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 1/1 src_req_d = ~src_req_i;
Tests: T7 T8 T35
242 1/1 src_ack_o = ~src_ack;
Tests: T7 T8 T35
243
244 // The handshake is done for exactly 1 clock cycle.
245 1/1 if (src_handshake) begin
Tests: T7 T8 T35
246 1/1 src_fsm_ns = EVEN;
Tests: T7 T8 T35
247 end
MISSING_ELSE
248 end
249
250 //VCS coverage off
251 // pragma coverage off
252
253 default: ;
254
255 //VCS coverage on
256 // pragma coverage on
257
258 endcase
259 end
260
261 // ACK-side FSM (DST domain)
262 always_comb begin : dst_fsm
263 1/1 dst_fsm_ns = dst_fsm_cs;
Tests: T7 T8 T35
264
265 // By default, we don't REQ and keep the internal ACK.
266 1/1 dst_req_o = 1'b0;
Tests: T7 T8 T35
267 1/1 dst_ack_d = dst_ack_q;
Tests: T7 T8 T35
268
269 1/1 unique case (dst_fsm_cs)
Tests: T7 T8 T35
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 1/1 dst_req_o = dst_req;
Tests: T7 T8 T35
274 1/1 dst_ack_d = dst_ack_i;
Tests: T7 T8 T35
275
276 // The handshake is done for exactly 1 clock cycle.
277 1/1 if (dst_handshake) begin
Tests: T7 T8 T35
278 1/1 dst_fsm_ns = ODD;
Tests: T7 T8 T35
279 end
MISSING_ELSE
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 1/1 dst_req_o = ~dst_req;
Tests: T7 T8 T35
286 1/1 dst_ack_d = ~dst_ack_i;
Tests: T7 T8 T35
287
288 // The handshake is done for exactly 1 clock cycle.
289 1/1 if (dst_handshake) begin
Tests: T7 T8 T35
290 1/1 dst_fsm_ns = EVEN;
Tests: T7 T8 T35
291 end
MISSING_ELSE
292 end
293
294 //VCS coverage off
295 // pragma coverage off
296
297 default: ;
298
299 //VCS coverage on
300 // pragma coverage on
301
302 endcase
303 end
304
305 // Registers
306 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
307 1/1 if (!rst_src_ni) begin
Tests: T4 T5 T6
308 1/1 src_fsm_cs <= EVEN;
Tests: T4 T5 T6
309 1/1 src_req_q <= 1'b0;
Tests: T4 T5 T6
310 end else begin
311 1/1 src_fsm_cs <= src_fsm_ns;
Tests: T4 T5 T6
312 1/1 src_req_q <= src_req_d;
Tests: T4 T5 T6
313 end
314 end
315 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
316 1/1 if (!rst_dst_ni) begin
Tests: T4 T5 T6
317 1/1 dst_fsm_cs <= EVEN;
Tests: T4 T5 T6
318 1/1 dst_ack_q <= 1'b0;
Tests: T4 T5 T6
319 end else begin
320 1/1 dst_fsm_cs <= dst_fsm_ns;
Tests: T4 T5 T6
321 1/1 dst_ack_q <= dst_ack_d;
Tests: T4 T5 T6
322 end
323 end
324 end
325
326 ////////////////
327 // Assertions //
328 ////////////////
329
330 `ifdef INC_ASSERT
331 //VCS coverage off
332 // pragma coverage off
333
334 logic effective_rst_n;
335 unreachable assign effective_rst_n = rst_src_ni && rst_dst_ni;
336
337 logic chk_flag;
338 always_ff @(posedge clk_src_i or negedge effective_rst_n) begin
339 unreachable if (!effective_rst_n) begin
340 unreachable chk_flag <= '0;
341 unreachable end else if (src_req_i && !chk_flag) begin
342 unreachable chk_flag <= 1'b1;
343 end
==> MISSING_ELSE
Cond Coverage for Instance : tb.dut.u_io_div4_meas.u_err_sync
| Total | Covered | Percent |
Conditions | 4 | 3 | 75.00 |
Logical | 4 | 3 | 75.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 194
EXPRESSION (src_req_i & src_ack_o)
----1---- ----2----
-1- | -2- | Status | Tests |
0 | 1 | Not Covered | |
1 | 0 | Covered | T7,T8,T35 |
1 | 1 | Covered | T7,T8,T35 |
LINE 195
EXPRESSION (dst_req_o & dst_ack_i)
----1---- ----2----
-1- | -2- | Status | Tests | Exclude Annotation |
0 | 1 | Excluded | |
VC_COV_UNR |
1 | 0 | Excluded | |
VC_COV_UNR |
1 | 1 | Covered | T7,T8,T35 |
Branch Coverage for Instance : tb.dut.u_io_div4_meas.u_err_sync
| Line No. | Total | Covered | Percent |
Branches |
|
12 |
12 |
100.00 |
CASE |
225 |
4 |
4 |
100.00 |
CASE |
269 |
4 |
4 |
100.00 |
IF |
307 |
2 |
2 |
100.00 |
IF |
316 |
2 |
2 |
100.00 |
225 unique case (src_fsm_cs)
-1-
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 src_req_d = src_req_i;
230 src_ack_o = src_ack;
231
232 // The handshake is done for exactly 1 clock cycle.
233 if (src_handshake) begin
-2-
234 src_fsm_ns = ODD;
==>
235 end
MISSING_ELSE
==>
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 src_req_d = ~src_req_i;
242 src_ack_o = ~src_ack;
243
244 // The handshake is done for exactly 1 clock cycle.
245 if (src_handshake) begin
-3-
246 src_fsm_ns = EVEN;
==>
247 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T7,T8,T35 |
EVEN |
0 |
- |
Covered |
T7,T8,T35 |
ODD |
- |
1 |
Covered |
T7,T8,T35 |
ODD |
- |
0 |
Covered |
T7,T8,T35 |
269 unique case (dst_fsm_cs)
-1-
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 dst_req_o = dst_req;
274 dst_ack_d = dst_ack_i;
275
276 // The handshake is done for exactly 1 clock cycle.
277 if (dst_handshake) begin
-2-
278 dst_fsm_ns = ODD;
==>
279 end
MISSING_ELSE
==>
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 dst_req_o = ~dst_req;
286 dst_ack_d = ~dst_ack_i;
287
288 // The handshake is done for exactly 1 clock cycle.
289 if (dst_handshake) begin
-3-
290 dst_fsm_ns = EVEN;
==>
291 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T7,T8,T35 |
EVEN |
0 |
- |
Covered |
T7,T8,T35 |
ODD |
- |
1 |
Covered |
T7,T8,T35 |
ODD |
- |
0 |
Covered |
T7,T8,T35 |
307 if (!rst_src_ni) begin
-1-
308 src_fsm_cs <= EVEN;
==>
309 src_req_q <= 1'b0;
310 end else begin
311 src_fsm_cs <= src_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
316 if (!rst_dst_ni) begin
-1-
317 dst_fsm_cs <= EVEN;
==>
318 dst_ack_q <= 1'b0;
319 end else begin
320 dst_fsm_cs <= dst_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
Assert Coverage for Instance : tb.dut.u_io_div4_meas.u_err_sync
Assertion Details
SyncReqAckAckNeedsReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
39604799 |
1567 |
0 |
0 |
T7 |
54981 |
3 |
0 |
0 |
T8 |
0 |
8 |
0 |
0 |
T9 |
0 |
13 |
0 |
0 |
T11 |
0 |
4 |
0 |
0 |
T14 |
0 |
8 |
0 |
0 |
T15 |
0 |
13 |
0 |
0 |
T16 |
0 |
3 |
0 |
0 |
T18 |
1129 |
0 |
0 |
0 |
T19 |
14804 |
0 |
0 |
0 |
T20 |
1824 |
0 |
0 |
0 |
T21 |
1695 |
0 |
0 |
0 |
T22 |
32155 |
0 |
0 |
0 |
T23 |
1901 |
0 |
0 |
0 |
T24 |
1667 |
0 |
0 |
0 |
T25 |
80392 |
0 |
0 |
0 |
T26 |
753 |
0 |
0 |
0 |
T35 |
0 |
7 |
0 |
0 |
T36 |
0 |
10 |
0 |
0 |
T46 |
0 |
4 |
0 |
0 |
SyncReqAckHoldReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
22209072 |
1566 |
0 |
0 |
T7 |
59956 |
3 |
0 |
0 |
T8 |
0 |
8 |
0 |
0 |
T9 |
0 |
13 |
0 |
0 |
T11 |
0 |
4 |
0 |
0 |
T14 |
0 |
8 |
0 |
0 |
T15 |
0 |
13 |
0 |
0 |
T16 |
0 |
3 |
0 |
0 |
T18 |
1070 |
0 |
0 |
0 |
T19 |
12085 |
0 |
0 |
0 |
T20 |
431 |
0 |
0 |
0 |
T21 |
411 |
0 |
0 |
0 |
T22 |
24020 |
0 |
0 |
0 |
T23 |
5134 |
0 |
0 |
0 |
T24 |
8546 |
0 |
0 |
0 |
T25 |
10950 |
0 |
0 |
0 |
T26 |
704 |
0 |
0 |
0 |
T35 |
0 |
7 |
0 |
0 |
T36 |
0 |
10 |
0 |
0 |
T46 |
0 |
4 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_main_meas.u_err_sync
| Line No. | Total | Covered | Percent |
TOTAL | | 36 | 36 | 100.00 |
CONT_ASSIGN | 55 | 0 | 0 | |
CONT_ASSIGN | 194 | 1 | 1 | 100.00 |
CONT_ASSIGN | 195 | 1 | 1 | 100.00 |
ALWAYS | 219 | 12 | 12 | 100.00 |
ALWAYS | 263 | 12 | 12 | 100.00 |
ALWAYS | 307 | 5 | 5 | 100.00 |
ALWAYS | 316 | 5 | 5 | 100.00 |
CONT_ASSIGN | 335 | 0 | 0 | |
ALWAYS | 339 | 0 | 0 | |
54 logic unused_req_chk;
55 unreachable assign unused_req_chk = req_chk_i;
56
57 if (EnRzHs) begin : gen_rz_hs_protocol
58 //////////////////
59 // RZ protocol //
60 //////////////////
61
62 // Types
63 typedef enum logic {
64 LoSt, HiSt
65 } rz_fsm_e;
66
67 // Signals
68 rz_fsm_e src_fsm_d, src_fsm_q;
69 rz_fsm_e dst_fsm_d, dst_fsm_q;
70 logic src_ack, dst_ack;
71 logic src_req, dst_req;
72
73 // REQ-side FSM (SRC domain)
74 always_comb begin : src_fsm
75 src_fsm_d = src_fsm_q;
76 src_ack_o = 1'b0;
77 src_req = 1'b0;
78
79 unique case (src_fsm_q)
80 LoSt: begin
81 // Wait for the ack to go back to zero before starting
82 // a new transaction.
83 if (!src_ack && src_req_i) begin
84 src_fsm_d = HiSt;
85 end
86 end
87 HiSt: begin
88 src_req = 1'b1;
89 // Forward the acknowledgement.
90 src_ack_o = src_ack;
91 // If request drops out, we go back to LoSt.
92 // If DST side asserts ack, we also go back to LoSt.
93 if (!src_req_i || src_ack) begin
94 src_fsm_d = LoSt;
95 end
96 end
97 //VCS coverage off
98 // pragma coverage off
99 default: ;
100 //VCS coverage on
101 // pragma coverage on
102 endcase
103 end
104
105 // Move ACK over to SRC domain.
106 prim_flop_2sync #(
107 .Width(1)
108 ) ack_sync (
109 .clk_i (clk_src_i),
110 .rst_ni (rst_src_ni),
111 .d_i (dst_ack),
112 .q_o (src_ack)
113 );
114
115 // Registers
116 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
117 if (!rst_src_ni) begin
118 src_fsm_q <= LoSt;
119 end else begin
120 src_fsm_q <= src_fsm_d;
121 end
122 end
123
124 // ACK-side FSM (DST domain)
125 always_comb begin : dst_fsm
126 dst_fsm_d = dst_fsm_q;
127 dst_req_o = 1'b0;
128 dst_ack = 1'b0;
129
130 unique case (dst_fsm_q)
131 LoSt: begin
132 if (dst_req) begin
133 // Forward the request.
134 dst_req_o = 1'b1;
135 // Wait for the request and acknowledge to be asserted
136 // before responding to the SRC side.
137 if (dst_ack_i) begin
138 dst_fsm_d = HiSt;
139 end
140 end
141 end
142 HiSt: begin
143 dst_ack = 1'b1;
144 // Wait for the request to drop back to zero.
145 if (!dst_req) begin
146 dst_fsm_d = LoSt;
147 end
148 end
149 //VCS coverage off
150 // pragma coverage off
151 default: ;
152 //VCS coverage on
153 // pragma coverage on
154 endcase
155 end
156
157 // Move REQ over to DST domain.
158 prim_flop_2sync #(
159 .Width(1)
160 ) req_sync (
161 .clk_i (clk_dst_i),
162 .rst_ni (rst_dst_ni),
163 .d_i (src_req),
164 .q_o (dst_req)
165 );
166
167 // Registers
168 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
169 if (!rst_dst_ni) begin
170 dst_fsm_q <= LoSt;
171 end else begin
172 dst_fsm_q <= dst_fsm_d;
173 end
174 end
175
176 end else begin : gen_nrz_hs_protocol
177 //////////////////
178 // NRZ protocol //
179 //////////////////
180
181 // Types
182 typedef enum logic {
183 EVEN, ODD
184 } sync_reqack_fsm_e;
185
186 // Signals
187 sync_reqack_fsm_e src_fsm_ns, src_fsm_cs;
188 sync_reqack_fsm_e dst_fsm_ns, dst_fsm_cs;
189
190 logic src_req_d, src_req_q, src_ack;
191 logic dst_ack_d, dst_ack_q, dst_req;
192 logic src_handshake, dst_handshake;
193
194 1/1 assign src_handshake = src_req_i & src_ack_o;
Tests: T27 T7 T35
195 1/1 assign dst_handshake = dst_req_o & dst_ack_i;
Tests: T27 T7 T35
196
197 // Move REQ over to DST domain.
198 prim_flop_2sync #(
199 .Width(1)
200 ) req_sync (
201 .clk_i (clk_dst_i),
202 .rst_ni (rst_dst_ni),
203 .d_i (src_req_q),
204 .q_o (dst_req)
205 );
206
207 // Move ACK over to SRC domain.
208 prim_flop_2sync #(
209 .Width(1)
210 ) ack_sync (
211 .clk_i (clk_src_i),
212 .rst_ni (rst_src_ni),
213 .d_i (dst_ack_q),
214 .q_o (src_ack)
215 );
216
217 // REQ-side FSM (SRC domain)
218 always_comb begin : src_fsm
219 1/1 src_fsm_ns = src_fsm_cs;
Tests: T27 T7 T35
220
221 // By default, we keep the internal REQ value and don't ACK.
222 1/1 src_req_d = src_req_q;
Tests: T27 T7 T35
223 1/1 src_ack_o = 1'b0;
Tests: T27 T7 T35
224
225 1/1 unique case (src_fsm_cs)
Tests: T27 T7 T35
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 1/1 src_req_d = src_req_i;
Tests: T27 T7 T35
230 1/1 src_ack_o = src_ack;
Tests: T27 T7 T35
231
232 // The handshake is done for exactly 1 clock cycle.
233 1/1 if (src_handshake) begin
Tests: T27 T7 T35
234 1/1 src_fsm_ns = ODD;
Tests: T27 T7 T35
235 end
MISSING_ELSE
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 1/1 src_req_d = ~src_req_i;
Tests: T27 T7 T35
242 1/1 src_ack_o = ~src_ack;
Tests: T27 T7 T35
243
244 // The handshake is done for exactly 1 clock cycle.
245 1/1 if (src_handshake) begin
Tests: T27 T7 T35
246 1/1 src_fsm_ns = EVEN;
Tests: T27 T7 T35
247 end
MISSING_ELSE
248 end
249
250 //VCS coverage off
251 // pragma coverage off
252
253 default: ;
254
255 //VCS coverage on
256 // pragma coverage on
257
258 endcase
259 end
260
261 // ACK-side FSM (DST domain)
262 always_comb begin : dst_fsm
263 1/1 dst_fsm_ns = dst_fsm_cs;
Tests: T27 T7 T35
264
265 // By default, we don't REQ and keep the internal ACK.
266 1/1 dst_req_o = 1'b0;
Tests: T27 T7 T35
267 1/1 dst_ack_d = dst_ack_q;
Tests: T27 T7 T35
268
269 1/1 unique case (dst_fsm_cs)
Tests: T27 T7 T35
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 1/1 dst_req_o = dst_req;
Tests: T27 T7 T35
274 1/1 dst_ack_d = dst_ack_i;
Tests: T27 T7 T35
275
276 // The handshake is done for exactly 1 clock cycle.
277 1/1 if (dst_handshake) begin
Tests: T27 T7 T35
278 1/1 dst_fsm_ns = ODD;
Tests: T27 T7 T35
279 end
MISSING_ELSE
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 1/1 dst_req_o = ~dst_req;
Tests: T27 T7 T35
286 1/1 dst_ack_d = ~dst_ack_i;
Tests: T27 T7 T35
287
288 // The handshake is done for exactly 1 clock cycle.
289 1/1 if (dst_handshake) begin
Tests: T27 T7 T35
290 1/1 dst_fsm_ns = EVEN;
Tests: T27 T7 T35
291 end
MISSING_ELSE
292 end
293
294 //VCS coverage off
295 // pragma coverage off
296
297 default: ;
298
299 //VCS coverage on
300 // pragma coverage on
301
302 endcase
303 end
304
305 // Registers
306 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
307 1/1 if (!rst_src_ni) begin
Tests: T4 T5 T6
308 1/1 src_fsm_cs <= EVEN;
Tests: T4 T5 T6
309 1/1 src_req_q <= 1'b0;
Tests: T4 T5 T6
310 end else begin
311 1/1 src_fsm_cs <= src_fsm_ns;
Tests: T4 T5 T6
312 1/1 src_req_q <= src_req_d;
Tests: T4 T5 T6
313 end
314 end
315 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
316 1/1 if (!rst_dst_ni) begin
Tests: T4 T5 T6
317 1/1 dst_fsm_cs <= EVEN;
Tests: T4 T5 T6
318 1/1 dst_ack_q <= 1'b0;
Tests: T4 T5 T6
319 end else begin
320 1/1 dst_fsm_cs <= dst_fsm_ns;
Tests: T4 T5 T6
321 1/1 dst_ack_q <= dst_ack_d;
Tests: T4 T5 T6
322 end
323 end
324 end
325
326 ////////////////
327 // Assertions //
328 ////////////////
329
330 `ifdef INC_ASSERT
331 //VCS coverage off
332 // pragma coverage off
333
334 logic effective_rst_n;
335 unreachable assign effective_rst_n = rst_src_ni && rst_dst_ni;
336
337 logic chk_flag;
338 always_ff @(posedge clk_src_i or negedge effective_rst_n) begin
339 unreachable if (!effective_rst_n) begin
340 unreachable chk_flag <= '0;
341 unreachable end else if (src_req_i && !chk_flag) begin
342 unreachable chk_flag <= 1'b1;
343 end
==> MISSING_ELSE
Cond Coverage for Instance : tb.dut.u_main_meas.u_err_sync
| Total | Covered | Percent |
Conditions | 4 | 3 | 75.00 |
Logical | 4 | 3 | 75.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 194
EXPRESSION (src_req_i & src_ack_o)
----1---- ----2----
-1- | -2- | Status | Tests |
0 | 1 | Not Covered | |
1 | 0 | Covered | T27,T7,T35 |
1 | 1 | Covered | T27,T7,T35 |
LINE 195
EXPRESSION (dst_req_o & dst_ack_i)
----1---- ----2----
-1- | -2- | Status | Tests | Exclude Annotation |
0 | 1 | Excluded | |
VC_COV_UNR |
1 | 0 | Excluded | |
VC_COV_UNR |
1 | 1 | Covered | T27,T7,T35 |
Branch Coverage for Instance : tb.dut.u_main_meas.u_err_sync
| Line No. | Total | Covered | Percent |
Branches |
|
12 |
12 |
100.00 |
CASE |
225 |
4 |
4 |
100.00 |
CASE |
269 |
4 |
4 |
100.00 |
IF |
307 |
2 |
2 |
100.00 |
IF |
316 |
2 |
2 |
100.00 |
225 unique case (src_fsm_cs)
-1-
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 src_req_d = src_req_i;
230 src_ack_o = src_ack;
231
232 // The handshake is done for exactly 1 clock cycle.
233 if (src_handshake) begin
-2-
234 src_fsm_ns = ODD;
==>
235 end
MISSING_ELSE
==>
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 src_req_d = ~src_req_i;
242 src_ack_o = ~src_ack;
243
244 // The handshake is done for exactly 1 clock cycle.
245 if (src_handshake) begin
-3-
246 src_fsm_ns = EVEN;
==>
247 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T27,T7,T35 |
EVEN |
0 |
- |
Covered |
T27,T7,T35 |
ODD |
- |
1 |
Covered |
T27,T7,T35 |
ODD |
- |
0 |
Covered |
T27,T7,T35 |
269 unique case (dst_fsm_cs)
-1-
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 dst_req_o = dst_req;
274 dst_ack_d = dst_ack_i;
275
276 // The handshake is done for exactly 1 clock cycle.
277 if (dst_handshake) begin
-2-
278 dst_fsm_ns = ODD;
==>
279 end
MISSING_ELSE
==>
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 dst_req_o = ~dst_req;
286 dst_ack_d = ~dst_ack_i;
287
288 // The handshake is done for exactly 1 clock cycle.
289 if (dst_handshake) begin
-3-
290 dst_fsm_ns = EVEN;
==>
291 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T27,T7,T35 |
EVEN |
0 |
- |
Covered |
T27,T7,T35 |
ODD |
- |
1 |
Covered |
T27,T7,T35 |
ODD |
- |
0 |
Covered |
T27,T7,T35 |
307 if (!rst_src_ni) begin
-1-
308 src_fsm_cs <= EVEN;
==>
309 src_req_q <= 1'b0;
310 end else begin
311 src_fsm_cs <= src_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
316 if (!rst_dst_ni) begin
-1-
317 dst_fsm_cs <= EVEN;
==>
318 dst_ack_q <= 1'b0;
319 end else begin
320 dst_fsm_cs <= dst_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
Assert Coverage for Instance : tb.dut.u_main_meas.u_err_sync
Assertion Details
SyncReqAckAckNeedsReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
39604799 |
1547 |
0 |
0 |
T7 |
0 |
25 |
0 |
0 |
T9 |
0 |
12 |
0 |
0 |
T10 |
10140 |
0 |
0 |
0 |
T11 |
0 |
14 |
0 |
0 |
T12 |
0 |
11 |
0 |
0 |
T13 |
0 |
3 |
0 |
0 |
T15 |
0 |
4 |
0 |
0 |
T16 |
0 |
7 |
0 |
0 |
T27 |
33429 |
3 |
0 |
0 |
T35 |
0 |
17 |
0 |
0 |
T36 |
0 |
4 |
0 |
0 |
T37 |
2274 |
0 |
0 |
0 |
T38 |
2564 |
0 |
0 |
0 |
T39 |
6813 |
0 |
0 |
0 |
T40 |
652 |
0 |
0 |
0 |
T41 |
752 |
0 |
0 |
0 |
T42 |
2815 |
0 |
0 |
0 |
T43 |
2088 |
0 |
0 |
0 |
T44 |
32206 |
0 |
0 |
0 |
SyncReqAckHoldReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
99737448 |
1547 |
0 |
0 |
T7 |
0 |
25 |
0 |
0 |
T9 |
0 |
12 |
0 |
0 |
T10 |
39002 |
0 |
0 |
0 |
T11 |
0 |
14 |
0 |
0 |
T12 |
0 |
11 |
0 |
0 |
T13 |
0 |
3 |
0 |
0 |
T15 |
0 |
4 |
0 |
0 |
T16 |
0 |
7 |
0 |
0 |
T27 |
68221 |
3 |
0 |
0 |
T35 |
0 |
17 |
0 |
0 |
T36 |
0 |
4 |
0 |
0 |
T37 |
8122 |
0 |
0 |
0 |
T38 |
19723 |
0 |
0 |
0 |
T39 |
16391 |
0 |
0 |
0 |
T40 |
2721 |
0 |
0 |
0 |
T41 |
5598 |
0 |
0 |
0 |
T42 |
56321 |
0 |
0 |
0 |
T43 |
20892 |
0 |
0 |
0 |
T44 |
68901 |
0 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_usb_meas.u_err_sync
| Line No. | Total | Covered | Percent |
TOTAL | | 36 | 36 | 100.00 |
CONT_ASSIGN | 55 | 0 | 0 | |
CONT_ASSIGN | 194 | 1 | 1 | 100.00 |
CONT_ASSIGN | 195 | 1 | 1 | 100.00 |
ALWAYS | 219 | 12 | 12 | 100.00 |
ALWAYS | 263 | 12 | 12 | 100.00 |
ALWAYS | 307 | 5 | 5 | 100.00 |
ALWAYS | 316 | 5 | 5 | 100.00 |
CONT_ASSIGN | 335 | 0 | 0 | |
ALWAYS | 339 | 0 | 0 | |
54 logic unused_req_chk;
55 unreachable assign unused_req_chk = req_chk_i;
56
57 if (EnRzHs) begin : gen_rz_hs_protocol
58 //////////////////
59 // RZ protocol //
60 //////////////////
61
62 // Types
63 typedef enum logic {
64 LoSt, HiSt
65 } rz_fsm_e;
66
67 // Signals
68 rz_fsm_e src_fsm_d, src_fsm_q;
69 rz_fsm_e dst_fsm_d, dst_fsm_q;
70 logic src_ack, dst_ack;
71 logic src_req, dst_req;
72
73 // REQ-side FSM (SRC domain)
74 always_comb begin : src_fsm
75 src_fsm_d = src_fsm_q;
76 src_ack_o = 1'b0;
77 src_req = 1'b0;
78
79 unique case (src_fsm_q)
80 LoSt: begin
81 // Wait for the ack to go back to zero before starting
82 // a new transaction.
83 if (!src_ack && src_req_i) begin
84 src_fsm_d = HiSt;
85 end
86 end
87 HiSt: begin
88 src_req = 1'b1;
89 // Forward the acknowledgement.
90 src_ack_o = src_ack;
91 // If request drops out, we go back to LoSt.
92 // If DST side asserts ack, we also go back to LoSt.
93 if (!src_req_i || src_ack) begin
94 src_fsm_d = LoSt;
95 end
96 end
97 //VCS coverage off
98 // pragma coverage off
99 default: ;
100 //VCS coverage on
101 // pragma coverage on
102 endcase
103 end
104
105 // Move ACK over to SRC domain.
106 prim_flop_2sync #(
107 .Width(1)
108 ) ack_sync (
109 .clk_i (clk_src_i),
110 .rst_ni (rst_src_ni),
111 .d_i (dst_ack),
112 .q_o (src_ack)
113 );
114
115 // Registers
116 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
117 if (!rst_src_ni) begin
118 src_fsm_q <= LoSt;
119 end else begin
120 src_fsm_q <= src_fsm_d;
121 end
122 end
123
124 // ACK-side FSM (DST domain)
125 always_comb begin : dst_fsm
126 dst_fsm_d = dst_fsm_q;
127 dst_req_o = 1'b0;
128 dst_ack = 1'b0;
129
130 unique case (dst_fsm_q)
131 LoSt: begin
132 if (dst_req) begin
133 // Forward the request.
134 dst_req_o = 1'b1;
135 // Wait for the request and acknowledge to be asserted
136 // before responding to the SRC side.
137 if (dst_ack_i) begin
138 dst_fsm_d = HiSt;
139 end
140 end
141 end
142 HiSt: begin
143 dst_ack = 1'b1;
144 // Wait for the request to drop back to zero.
145 if (!dst_req) begin
146 dst_fsm_d = LoSt;
147 end
148 end
149 //VCS coverage off
150 // pragma coverage off
151 default: ;
152 //VCS coverage on
153 // pragma coverage on
154 endcase
155 end
156
157 // Move REQ over to DST domain.
158 prim_flop_2sync #(
159 .Width(1)
160 ) req_sync (
161 .clk_i (clk_dst_i),
162 .rst_ni (rst_dst_ni),
163 .d_i (src_req),
164 .q_o (dst_req)
165 );
166
167 // Registers
168 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
169 if (!rst_dst_ni) begin
170 dst_fsm_q <= LoSt;
171 end else begin
172 dst_fsm_q <= dst_fsm_d;
173 end
174 end
175
176 end else begin : gen_nrz_hs_protocol
177 //////////////////
178 // NRZ protocol //
179 //////////////////
180
181 // Types
182 typedef enum logic {
183 EVEN, ODD
184 } sync_reqack_fsm_e;
185
186 // Signals
187 sync_reqack_fsm_e src_fsm_ns, src_fsm_cs;
188 sync_reqack_fsm_e dst_fsm_ns, dst_fsm_cs;
189
190 logic src_req_d, src_req_q, src_ack;
191 logic dst_ack_d, dst_ack_q, dst_req;
192 logic src_handshake, dst_handshake;
193
194 1/1 assign src_handshake = src_req_i & src_ack_o;
Tests: T27 T7 T35
195 1/1 assign dst_handshake = dst_req_o & dst_ack_i;
Tests: T27 T7 T35
196
197 // Move REQ over to DST domain.
198 prim_flop_2sync #(
199 .Width(1)
200 ) req_sync (
201 .clk_i (clk_dst_i),
202 .rst_ni (rst_dst_ni),
203 .d_i (src_req_q),
204 .q_o (dst_req)
205 );
206
207 // Move ACK over to SRC domain.
208 prim_flop_2sync #(
209 .Width(1)
210 ) ack_sync (
211 .clk_i (clk_src_i),
212 .rst_ni (rst_src_ni),
213 .d_i (dst_ack_q),
214 .q_o (src_ack)
215 );
216
217 // REQ-side FSM (SRC domain)
218 always_comb begin : src_fsm
219 1/1 src_fsm_ns = src_fsm_cs;
Tests: T27 T7 T35
220
221 // By default, we keep the internal REQ value and don't ACK.
222 1/1 src_req_d = src_req_q;
Tests: T27 T7 T35
223 1/1 src_ack_o = 1'b0;
Tests: T27 T7 T35
224
225 1/1 unique case (src_fsm_cs)
Tests: T27 T7 T35
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 1/1 src_req_d = src_req_i;
Tests: T27 T7 T35
230 1/1 src_ack_o = src_ack;
Tests: T27 T7 T35
231
232 // The handshake is done for exactly 1 clock cycle.
233 1/1 if (src_handshake) begin
Tests: T27 T7 T35
234 1/1 src_fsm_ns = ODD;
Tests: T27 T7 T35
235 end
MISSING_ELSE
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 1/1 src_req_d = ~src_req_i;
Tests: T27 T7 T35
242 1/1 src_ack_o = ~src_ack;
Tests: T27 T7 T35
243
244 // The handshake is done for exactly 1 clock cycle.
245 1/1 if (src_handshake) begin
Tests: T27 T7 T35
246 1/1 src_fsm_ns = EVEN;
Tests: T27 T7 T35
247 end
MISSING_ELSE
248 end
249
250 //VCS coverage off
251 // pragma coverage off
252
253 default: ;
254
255 //VCS coverage on
256 // pragma coverage on
257
258 endcase
259 end
260
261 // ACK-side FSM (DST domain)
262 always_comb begin : dst_fsm
263 1/1 dst_fsm_ns = dst_fsm_cs;
Tests: T27 T7 T35
264
265 // By default, we don't REQ and keep the internal ACK.
266 1/1 dst_req_o = 1'b0;
Tests: T27 T7 T35
267 1/1 dst_ack_d = dst_ack_q;
Tests: T27 T7 T35
268
269 1/1 unique case (dst_fsm_cs)
Tests: T27 T7 T35
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 1/1 dst_req_o = dst_req;
Tests: T27 T7 T35
274 1/1 dst_ack_d = dst_ack_i;
Tests: T27 T7 T35
275
276 // The handshake is done for exactly 1 clock cycle.
277 1/1 if (dst_handshake) begin
Tests: T27 T7 T35
278 1/1 dst_fsm_ns = ODD;
Tests: T27 T7 T35
279 end
MISSING_ELSE
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 1/1 dst_req_o = ~dst_req;
Tests: T27 T7 T35
286 1/1 dst_ack_d = ~dst_ack_i;
Tests: T27 T7 T35
287
288 // The handshake is done for exactly 1 clock cycle.
289 1/1 if (dst_handshake) begin
Tests: T27 T7 T35
290 1/1 dst_fsm_ns = EVEN;
Tests: T27 T7 T35
291 end
MISSING_ELSE
292 end
293
294 //VCS coverage off
295 // pragma coverage off
296
297 default: ;
298
299 //VCS coverage on
300 // pragma coverage on
301
302 endcase
303 end
304
305 // Registers
306 always_ff @(posedge clk_src_i or negedge rst_src_ni) begin
307 1/1 if (!rst_src_ni) begin
Tests: T4 T5 T6
308 1/1 src_fsm_cs <= EVEN;
Tests: T4 T5 T6
309 1/1 src_req_q <= 1'b0;
Tests: T4 T5 T6
310 end else begin
311 1/1 src_fsm_cs <= src_fsm_ns;
Tests: T4 T5 T6
312 1/1 src_req_q <= src_req_d;
Tests: T4 T5 T6
313 end
314 end
315 always_ff @(posedge clk_dst_i or negedge rst_dst_ni) begin
316 1/1 if (!rst_dst_ni) begin
Tests: T4 T5 T6
317 1/1 dst_fsm_cs <= EVEN;
Tests: T4 T5 T6
318 1/1 dst_ack_q <= 1'b0;
Tests: T4 T5 T6
319 end else begin
320 1/1 dst_fsm_cs <= dst_fsm_ns;
Tests: T4 T5 T6
321 1/1 dst_ack_q <= dst_ack_d;
Tests: T4 T5 T6
322 end
323 end
324 end
325
326 ////////////////
327 // Assertions //
328 ////////////////
329
330 `ifdef INC_ASSERT
331 //VCS coverage off
332 // pragma coverage off
333
334 logic effective_rst_n;
335 unreachable assign effective_rst_n = rst_src_ni && rst_dst_ni;
336
337 logic chk_flag;
338 always_ff @(posedge clk_src_i or negedge effective_rst_n) begin
339 unreachable if (!effective_rst_n) begin
340 unreachable chk_flag <= '0;
341 unreachable end else if (src_req_i && !chk_flag) begin
342 unreachable chk_flag <= 1'b1;
343 end
==> MISSING_ELSE
Cond Coverage for Instance : tb.dut.u_usb_meas.u_err_sync
| Total | Covered | Percent |
Conditions | 4 | 3 | 75.00 |
Logical | 4 | 3 | 75.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 194
EXPRESSION (src_req_i & src_ack_o)
----1---- ----2----
-1- | -2- | Status | Tests |
0 | 1 | Not Covered | |
1 | 0 | Covered | T27,T7,T35 |
1 | 1 | Covered | T27,T7,T35 |
LINE 195
EXPRESSION (dst_req_o & dst_ack_i)
----1---- ----2----
-1- | -2- | Status | Tests | Exclude Annotation |
0 | 1 | Excluded | |
VC_COV_UNR |
1 | 0 | Excluded | |
VC_COV_UNR |
1 | 1 | Covered | T27,T7,T35 |
Branch Coverage for Instance : tb.dut.u_usb_meas.u_err_sync
| Line No. | Total | Covered | Percent |
Branches |
|
12 |
12 |
100.00 |
CASE |
225 |
4 |
4 |
100.00 |
CASE |
269 |
4 |
4 |
100.00 |
IF |
307 |
2 |
2 |
100.00 |
IF |
316 |
2 |
2 |
100.00 |
225 unique case (src_fsm_cs)
-1-
226
227 EVEN: begin
228 // Simply forward REQ and ACK.
229 src_req_d = src_req_i;
230 src_ack_o = src_ack;
231
232 // The handshake is done for exactly 1 clock cycle.
233 if (src_handshake) begin
-2-
234 src_fsm_ns = ODD;
==>
235 end
MISSING_ELSE
==>
236 end
237
238 ODD: begin
239 // Internal REQ and ACK have inverted meaning now. If src_req_i is high again, this
240 // signals a new transaction.
241 src_req_d = ~src_req_i;
242 src_ack_o = ~src_ack;
243
244 // The handshake is done for exactly 1 clock cycle.
245 if (src_handshake) begin
-3-
246 src_fsm_ns = EVEN;
==>
247 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T27,T7,T35 |
EVEN |
0 |
- |
Covered |
T27,T7,T35 |
ODD |
- |
1 |
Covered |
T27,T7,T35 |
ODD |
- |
0 |
Covered |
T27,T7,T35 |
269 unique case (dst_fsm_cs)
-1-
270
271 EVEN: begin
272 // Simply forward REQ and ACK.
273 dst_req_o = dst_req;
274 dst_ack_d = dst_ack_i;
275
276 // The handshake is done for exactly 1 clock cycle.
277 if (dst_handshake) begin
-2-
278 dst_fsm_ns = ODD;
==>
279 end
MISSING_ELSE
==>
280 end
281
282 ODD: begin
283 // Internal REQ and ACK have inverted meaning now. If dst_req goes low, this signals a new
284 // transaction.
285 dst_req_o = ~dst_req;
286 dst_ack_d = ~dst_ack_i;
287
288 // The handshake is done for exactly 1 clock cycle.
289 if (dst_handshake) begin
-3-
290 dst_fsm_ns = EVEN;
==>
291 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
EVEN |
1 |
- |
Covered |
T27,T7,T35 |
EVEN |
0 |
- |
Covered |
T27,T7,T35 |
ODD |
- |
1 |
Covered |
T27,T7,T35 |
ODD |
- |
0 |
Covered |
T27,T7,T35 |
307 if (!rst_src_ni) begin
-1-
308 src_fsm_cs <= EVEN;
==>
309 src_req_q <= 1'b0;
310 end else begin
311 src_fsm_cs <= src_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
316 if (!rst_dst_ni) begin
-1-
317 dst_fsm_cs <= EVEN;
==>
318 dst_ack_q <= 1'b0;
319 end else begin
320 dst_fsm_cs <= dst_fsm_ns;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T4,T5,T6 |
0 |
Covered |
T4,T5,T6 |
Assert Coverage for Instance : tb.dut.u_usb_meas.u_err_sync
Assertion Details
SyncReqAckAckNeedsReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
39604799 |
1561 |
0 |
0 |
T7 |
0 |
3 |
0 |
0 |
T9 |
0 |
11 |
0 |
0 |
T10 |
10140 |
0 |
0 |
0 |
T11 |
0 |
4 |
0 |
0 |
T13 |
0 |
18 |
0 |
0 |
T16 |
0 |
14 |
0 |
0 |
T27 |
33429 |
7 |
0 |
0 |
T35 |
0 |
6 |
0 |
0 |
T36 |
0 |
3 |
0 |
0 |
T37 |
2274 |
0 |
0 |
0 |
T38 |
2564 |
0 |
0 |
0 |
T39 |
6813 |
0 |
0 |
0 |
T40 |
652 |
0 |
0 |
0 |
T41 |
752 |
0 |
0 |
0 |
T42 |
2815 |
0 |
0 |
0 |
T43 |
2088 |
0 |
0 |
0 |
T44 |
32206 |
0 |
0 |
0 |
T46 |
0 |
3 |
0 |
0 |
T64 |
0 |
4 |
0 |
0 |
SyncReqAckHoldReq
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
47836459 |
1561 |
0 |
0 |
T7 |
0 |
3 |
0 |
0 |
T9 |
0 |
11 |
0 |
0 |
T10 |
18721 |
0 |
0 |
0 |
T11 |
0 |
4 |
0 |
0 |
T13 |
0 |
18 |
0 |
0 |
T16 |
0 |
14 |
0 |
0 |
T27 |
32746 |
7 |
0 |
0 |
T35 |
0 |
6 |
0 |
0 |
T36 |
0 |
3 |
0 |
0 |
T37 |
3899 |
0 |
0 |
0 |
T38 |
9467 |
0 |
0 |
0 |
T39 |
13627 |
0 |
0 |
0 |
T40 |
1306 |
0 |
0 |
0 |
T41 |
2746 |
0 |
0 |
0 |
T42 |
27035 |
0 |
0 |
0 |
T43 |
10028 |
0 |
0 |
0 |
T44 |
35953 |
0 |
0 |
0 |
T46 |
0 |
3 |
0 |
0 |
T64 |
0 |
4 |
0 |
0 |