Line Coverage for Module :
i2c_target_fsm
| Line No. | Total | Covered | Percent |
TOTAL | | 355 | 333 | 93.80 |
ALWAYS | 130 | 8 | 7 | 87.50 |
ALWAYS | 144 | 3 | 3 | 100.00 |
ALWAYS | 154 | 6 | 6 | 100.00 |
ALWAYS | 165 | 5 | 5 | 100.00 |
CONT_ASSIGN | 175 | 1 | 1 | 100.00 |
CONT_ASSIGN | 176 | 1 | 1 | 100.00 |
CONT_ASSIGN | 177 | 1 | 1 | 100.00 |
CONT_ASSIGN | 178 | 1 | 1 | 100.00 |
ALWAYS | 182 | 3 | 3 | 100.00 |
ALWAYS | 191 | 3 | 3 | 100.00 |
ALWAYS | 200 | 7 | 7 | 100.00 |
CONT_ASSIGN | 212 | 1 | 1 | 100.00 |
ALWAYS | 216 | 9 | 9 | 100.00 |
CONT_ASSIGN | 231 | 1 | 1 | 100.00 |
CONT_ASSIGN | 233 | 1 | 1 | 100.00 |
CONT_ASSIGN | 235 | 1 | 1 | 100.00 |
ALWAYS | 239 | 7 | 7 | 100.00 |
ALWAYS | 250 | 5 | 5 | 100.00 |
CONT_ASSIGN | 267 | 1 | 1 | 100.00 |
CONT_ASSIGN | 270 | 1 | 1 | 100.00 |
CONT_ASSIGN | 271 | 1 | 1 | 100.00 |
ALWAYS | 302 | 4 | 4 | 100.00 |
CONT_ASSIGN | 319 | 1 | 1 | 100.00 |
CONT_ASSIGN | 323 | 1 | 1 | 100.00 |
CONT_ASSIGN | 327 | 1 | 1 | 100.00 |
ALWAYS | 331 | 148 | 139 | 93.92 |
CONT_ASSIGN | 646 | 1 | 1 | 100.00 |
CONT_ASSIGN | 647 | 1 | 1 | 100.00 |
CONT_ASSIGN | 651 | 1 | 1 | 100.00 |
CONT_ASSIGN | 665 | 1 | 1 | 100.00 |
CONT_ASSIGN | 670 | 1 | 1 | 100.00 |
ALWAYS | 674 | 119 | 107 | 89.92 |
ALWAYS | 1007 | 3 | 3 | 100.00 |
ALWAYS | 1016 | 3 | 3 | 100.00 |
CONT_ASSIGN | 1023 | 1 | 1 | 100.00 |
CONT_ASSIGN | 1024 | 1 | 1 | 100.00 |
CONT_ASSIGN | 1027 | 1 | 1 | 100.00 |
129 always_comb begin : counter_functions
130 1/1 tcount_d = tcount_q;
Tests: T1 T2 T3
131 1/1 if (load_tcount) begin
Tests: T1 T2 T3
132 1/1 unique case (tcount_sel)
Tests: T6 T8 T9
133 1/1 tSetupData : tcount_d = 13'(t_r_i) + 13'(tsu_dat_i);
Tests: T6 T9 T10
134 1/1 tHoldData : tcount_d = 16'(thd_dat_i);
Tests: T6 T8 T9
135 0/1 ==> tNoDelay : tcount_d = 16'h0001;
136 default : tcount_d = 16'h0001;
137 endcase
138 1/1 end else if (target_enable_i) begin
Tests: T1 T2 T3
139 1/1 tcount_d = tcount_q - 1'b1;
Tests: T6 T8 T9
140 end
MISSING_ELSE
141 end
142
143 always_ff @ (posedge clk_i or negedge rst_ni) begin : clk_counter
144 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
145 1/1 tcount_q <= '1;
Tests: T1 T2 T3
146 end else begin
147 1/1 tcount_q <= tcount_d;
Tests: T1 T2 T3
148 end
149 end
150
151 // Keep track of how long the target has been stretching. This is used to
152 // timeout and send a NACK instead.
153 always_ff @ (posedge clk_i or negedge rst_ni) begin : clk_nack_after_stretch
154 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
155 1/1 stretch_active_cnt <= '0;
Tests: T1 T2 T3
156 1/1 end else if (actively_stretching) begin
Tests: T1 T2 T3
157 1/1 stretch_active_cnt <= stretch_active_cnt + 1'b1;
Tests: T6 T9 T10
158 1/1 end else if (start_detect_i && target_idle_o) begin
Tests: T1 T2 T3
159 1/1 stretch_active_cnt <= '0;
Tests: T3 T4 T5
160 end
MISSING_ELSE
161 end
162
163 // Track remaining number of bytes that may be automatically ACK'd
164 always_ff @(posedge clk_i or negedge rst_ni) begin
165 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
166 1/1 auto_ack_cnt_q <= '0;
Tests: T1 T2 T3
167 1/1 end else if (auto_ack_load_i && ack_ctrl_stretching) begin
Tests: T1 T2 T3
168 // Loads are only accepted while stretching to avoid races.
169 1/1 auto_ack_cnt_q <= auto_ack_load_value_i;
Tests: T46 T47 T48
170 end else begin
171 1/1 auto_ack_cnt_q <= auto_ack_cnt_d;
Tests: T1 T2 T3
172 end
173 end
174
175 1/1 assign can_auto_ack = !ack_ctrl_mode_i || (auto_ack_cnt_q > '0);
Tests: T1 T2 T3
176 1/1 assign auto_ack_cnt_o = auto_ack_cnt_q;
Tests: T1 T2 T3
177 1/1 assign ack_ctrl_stretching_o = ack_ctrl_stretching;
Tests: T1 T2 T3
178 1/1 assign acq_fifo_next_data_o = input_byte;
Tests: T1 T2 T3
179
180 // Latch whether this transaction is to be NACK'd.
181 always_ff @ (posedge clk_i or negedge rst_ni) begin : clk_nack_transaction
182 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
183 1/1 nack_transaction_q <= 1'b0;
Tests: T1 T2 T3
184 end else begin
185 1/1 nack_transaction_q <= nack_transaction_d;
Tests: T1 T2 T3
186 end
187 end
188
189 // SDA and SCL at the previous clock edge
190 always_ff @ (posedge clk_i or negedge rst_ni) begin : bus_prev
191 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
192 1/1 scl_i_q <= 1'b1;
Tests: T1 T2 T3
193 end else begin
194 1/1 scl_i_q <= scl_i;
Tests: T1 T2 T3
195 end
196 end
197
198 // Track the transaction framing and this target's participation in it.
199 always_ff @ (posedge clk_i or negedge rst_ni) begin
200 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
201 1/1 restart_det_q <= 1'b0;
Tests: T1 T2 T3
202 1/1 xact_for_us_q <= 1'b0;
Tests: T1 T2 T3
203 1/1 xfer_for_us_q <= 1'b0;
Tests: T1 T2 T3
204 end else begin
205 1/1 restart_det_q <= restart_det_d;
Tests: T1 T2 T3
206 1/1 xact_for_us_q <= xact_for_us_d;
Tests: T1 T2 T3
207 1/1 xfer_for_us_q <= xfer_for_us_d;
Tests: T1 T2 T3
208 end
209 end
210
211 // Bit counter on the target side
212 1/1 assign bit_ack = (bit_idx == 4'd8); // ack
Tests: T1 T2 T3
213
214 // Increment counter on negative SCL edge
215 always_ff @ (posedge clk_i or negedge rst_ni) begin : tgt_bit_counter
216 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
217 1/1 bit_idx <= 4'd0;
Tests: T1 T2 T3
218 1/1 end else if (start_detect_i) begin
Tests: T1 T2 T3
219 1/1 bit_idx <= 4'd0;
Tests: T3 T4 T5
220 1/1 end else if (scl_i_q && !scl_i) begin
Tests: T1 T2 T3
221 // input byte clear is always asserted on a "start"
222 // condition.
223 2/2 if (input_byte_clr || bit_ack) bit_idx <= 4'd0;
Tests: T1 T2 T3 | T3 T4 T5
224 1/1 else bit_idx <= bit_idx + 1'b1;
Tests: T1 T2 T3
225 end else begin
226 1/1 bit_idx <= bit_idx;
Tests: T1 T2 T3
227 end
228 end
229
230 // Deserializer for a byte read from the bus on the target side
231 1/1 assign address0_match = ((input_byte[7:1] & target_mask0_i) == target_address0_i) &&
Tests: T1 T2 T3
232 (target_mask0_i != '0);
233 1/1 assign address1_match = ((input_byte[7:1] & target_mask1_i) == target_address1_i) &&
Tests: T1 T2 T3
234 (target_mask1_i != '0);
235 1/1 assign address_match = (address0_match || address1_match);
Tests: T1 T2 T3
236
237 // Shift data in on positive SCL edge
238 always_ff @ (posedge clk_i or negedge rst_ni) begin : tgt_input_register
239 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
240 1/1 input_byte <= 8'h00;
Tests: T1 T2 T3
241 1/1 end else if (input_byte_clr) begin
Tests: T1 T2 T3
242 1/1 input_byte <= 8'h00;
Tests: T6 T8 T9
243 1/1 end else if (!scl_i_q && scl_i) begin
Tests: T1 T2 T3
244 2/2 if (!bit_ack) input_byte[7:0] <= {input_byte[6:0], sda_i}; // MSB goes in first
Tests: T1 T3 T4 | T1 T3 T4
MISSING_ELSE
245 end
MISSING_ELSE
246 end
247
248 // Detection by the target of ACK bit sent by the host
249 always_ff @ (posedge clk_i or negedge rst_ni) begin : host_ack_register
250 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
251 1/1 host_ack <= 1'b0;
Tests: T1 T2 T3
252 1/1 end else if (!scl_i_q && scl_i) begin
Tests: T1 T2 T3
253 2/2 if (bit_ack) host_ack <= ~sda_i;
Tests: T1 T3 T4 | T3 T4 T5
MISSING_ELSE
254 end
MISSING_ELSE
255 end
256
257 // An artificial acq_fifo_wready is used here to ensure we always have
258 // space to asborb a stop / repeat start format byte. Without guaranteeing
259 // space for this entry, the target module would need to stretch the
260 // repeat start / stop indication. If a system does not support stretching,
261 // there's no good way for a stop to be NACK'd.
262 // Besides the space necessary for the stop format byte, we also need one
263 // space to send a NACK. This means that we can notify software that a NACK
264 // has happened while still keeping space for a subsequent stop or repeated
265 // start.
266 logic [AcqFifoDepthWidth-1:0] acq_fifo_remainder;
267 1/1 assign acq_fifo_remainder = AcqFifoDepth - acq_fifo_depth_i;
Tests: T1 T2 T3
268 // This is used for acq_fifo_full_o to send the ACQ FIFO full alert to
269 // software.
270 1/1 assign acq_fifo_plenty_space = acq_fifo_remainder > AcqFifoDepthWidth'(2);
Tests: T1 T2 T3
271 1/1 assign acq_fifo_full_or_last_space = acq_fifo_remainder <= AcqFifoDepthWidth'(1);
Tests: T1 T2 T3
272
273 // State definitions
274 typedef enum logic [4:0] {
275 Idle,
276 /////////////////////////
277 // Target function states
278 /////////////////////////
279
280 // Target function receives start and address from external host
281 AcquireStart, AddrRead,
282 // Target function acknowledges the address and returns an ack to external host
283 AddrAckWait, AddrAckSetup, AddrAckPulse, AddrAckHold,
284 // Target function sends read data to external host-receiver
285 TransmitWait, TransmitSetup, TransmitPulse, TransmitHold,
286 // Target function receives ack from external host
287 TransmitAck, TransmitAckPulse, WaitForStop,
288 // Target function receives write data from the external host
289 AcquireByte,
290 // Target function sends ack to external host
291 AcquireAckWait, AcquireAckSetup, AcquireAckPulse, AcquireAckHold,
292 // Target function clock stretch handling.
293 StretchAddrAck, StretchAddrAckSetup, StretchAddr,
294 StretchTx, StretchTxSetup,
295 StretchAcqFull, StretchAcqSetup
296 } state_e;
297
298 state_e state_q, state_d;
299
300 logic rw_bit_q;
301 always_ff @(posedge clk_i or negedge rst_ni) begin
302 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
303 1/1 rw_bit_q <= '0;
Tests: T1 T2 T3
304 1/1 end else if (bit_ack && address_match) begin
Tests: T1 T2 T3
305 1/1 rw_bit_q <= rw_bit;
Tests: T6 T8 T9
306 end
MISSING_ELSE
307 end
308
309 // Reverse the bit order since data should be sent out MSB first
310 logic [TX_FIFO_WIDTH-1:0] tx_fifo_rdata;
311 assign tx_fifo_rdata = {<<1{tx_fifo_rdata_i}};
312
313 // The usage of target_idle_o directly confuses xcelium and leads the
314 // the simulator to a combinational loop. While it may be a tool recognized
315 // loop, it is not an actual physical loop, since target_idle affects only
316 // state_d, which is not used directly by any logic in this module.
317 // This is a work around for a known tool limitation.
318 logic target_idle;
319 1/1 assign target_idle = target_idle_o;
Tests: T1 T2 T3
320
321 // During a host issued read, a stop was received without first seeing a nack.
322 // This may be harmless but is technically illegal behavior, notify software.
323 1/1 assign event_unexp_stop_o = target_enable_i & xfer_for_us_q & rw_bit_q &
Tests: T1 T2 T3
324 stop_detect_i & !expect_stop;
325
326 // Record each transaction that gets NACK'd.
327 1/1 assign event_target_nack_o = !nack_transaction_q && nack_transaction_d;
Tests: T1 T2 T3
328
329 // Outputs for each state
330 always_comb begin : state_outputs
331 1/1 target_idle_o = 1'b1;
Tests: T1 T2 T3
332 1/1 sda_d = 1'b1;
Tests: T1 T2 T3
333 1/1 scl_d = 1'b1;
Tests: T1 T2 T3
334 1/1 transmitting_o = 1'b0;
Tests: T1 T2 T3
335 1/1 tx_fifo_rready_o = 1'b0;
Tests: T1 T2 T3
336 1/1 acq_fifo_wvalid_o = 1'b0;
Tests: T1 T2 T3
337 1/1 acq_fifo_wdata_o = ACQ_FIFO_WIDTH'(0);
Tests: T1 T2 T3
338 1/1 event_cmd_complete_o = 1'b0;
Tests: T1 T2 T3
339 1/1 rw_bit = rw_bit_q;
Tests: T1 T2 T3
340 1/1 expect_stop = 1'b0;
Tests: T1 T2 T3
341 1/1 restart_det_d = restart_det_q;
Tests: T1 T2 T3
342 1/1 xact_for_us_d = xact_for_us_q;
Tests: T1 T2 T3
343 1/1 xfer_for_us_d = xfer_for_us_q;
Tests: T1 T2 T3
344 1/1 auto_ack_cnt_d = auto_ack_cnt_q;
Tests: T1 T2 T3
345 1/1 ack_ctrl_stretching = 1'b0;
Tests: T1 T2 T3
346 1/1 nack_transaction_d = nack_transaction_q;
Tests: T1 T2 T3
347 1/1 actively_stretching = 1'b0;
Tests: T1 T2 T3
348 1/1 event_tx_arbitration_lost_o = 1'b0;
Tests: T1 T2 T3
349 1/1 event_tx_bus_timeout_o = 1'b0;
Tests: T1 T2 T3
350 1/1 event_read_cmd_received_o = 1'b0;
Tests: T1 T2 T3
351
352 1/1 unique case (state_q)
Tests: T1 T2 T3
353 // Idle: initial state, SDA is released (high), SCL is released if the
354 // bus is idle. Otherwise, if no STOP condition has been sent yet,
355 // continue pulling SCL low in host mode.
356 Idle : begin
357 1/1 sda_d = 1'b1;
Tests: T1 T2 T3
358 1/1 scl_d = 1'b1;
Tests: T1 T2 T3
359 1/1 restart_det_d = 1'b0;
Tests: T1 T2 T3
360 1/1 xact_for_us_d = 1'b0;
Tests: T1 T2 T3
361 1/1 xfer_for_us_d = 1'b0;
Tests: T1 T2 T3
362 1/1 nack_transaction_d = 1'b0;
Tests: T1 T2 T3
363 end
364
365 /////////////////
366 // TARGET MODE //
367 /////////////////
368
369 // AcquireStart: hold for the end of the start condition
370 AcquireStart : begin
371 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
372 1/1 xfer_for_us_d = 1'b0;
Tests: T6 T8 T9
373 1/1 auto_ack_cnt_d = '0;
Tests: T6 T8 T9
374 end
375 // AddrRead: read and compare target address
376 AddrRead : begin
377 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
378 1/1 rw_bit = input_byte[0];
Tests: T6 T8 T9
379
380 1/1 if (bit_ack) begin
Tests: T6 T8 T9
381 1/1 if (address_match) begin
Tests: T6 T8 T9
382 1/1 xact_for_us_d = 1'b1;
Tests: T6 T8 T9
383 1/1 xfer_for_us_d = 1'b1;
Tests: T6 T8 T9
384 end
MISSING_ELSE
385 end
MISSING_ELSE
386 end
387 // AddrAckWait: pause for hold time before acknowledging
388 AddrAckWait : begin
389 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
390
391 1/1 if (scl_i) begin
Tests: T6 T8 T9
392 // The controller is going too fast. Abandon the transaction.
393 // Nothing gets recorded for this case.
394 0/1 ==> nack_transaction_d = 1'b1;
395 end
MISSING_ELSE
396 end
397 // AddrAckSetup: target pulls SDA low while SCL is low
398 AddrAckSetup : begin
399 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
400 1/1 sda_d = 1'b0;
Tests: T6 T8 T9
401 1/1 transmitting_o = 1'b1;
Tests: T6 T8 T9
402 end
403 // AddrAckPulse: target pulls SDA low while SCL is released
404 AddrAckPulse : begin
405 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
406 1/1 sda_d = 1'b0;
Tests: T6 T8 T9
407 1/1 transmitting_o = 1'b1;
Tests: T6 T8 T9
408 end
409 // AddrAckHold: target pulls SDA low while SCL is pulled low
410 AddrAckHold : begin
411 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
412 1/1 sda_d = 1'b0;
Tests: T6 T8 T9
413 1/1 transmitting_o = 1'b1;
Tests: T6 T8 T9
414
415 // Upon transition to next state, populate the acquisition fifo
416 1/1 if (tcount_q == 20'd1) begin
Tests: T6 T8 T9
417 1/1 if (nack_transaction_q) begin
Tests: T6 T8 T9
418 // No need to record anything here. We already recorded the first
419 // NACK'd byte in a stretch state or abandoned the transaction in
420 // AddrAckWait.
421 1/1 end else if (!stretch_addr) begin
Tests: T6 T8 T9
422 // Only write to fifo if stretching conditions are not met
423 1/1 acq_fifo_wvalid_o = 1'b1;
Tests: T6 T8 T9
424 1/1 event_read_cmd_received_o = rw_bit_q;
Tests: T6 T8 T9
425 end
MISSING_ELSE
426
427 1/1 if (restart_det_q) begin
Tests: T6 T8 T9
428 1/1 acq_fifo_wdata_o = {AcqRestart, input_byte};
Tests: T6 T8 T9
429 end else begin
430 1/1 acq_fifo_wdata_o = {AcqStart, input_byte};
Tests: T6 T8 T9
431 end
432 end
==> MISSING_ELSE
433 end
434 // TransmitWait: Check if data is available prior to transmit
435 TransmitWait : begin
436 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
437 end
438 // TransmitSetup: target shifts indexed bit onto SDA while SCL is low
439 TransmitSetup : begin
440 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
441 1/1 sda_d = tx_fifo_rdata[3'(bit_idx)];
Tests: T6 T8 T9
442 1/1 transmitting_o = 1'b1;
Tests: T6 T8 T9
443 end
444 // TransmitPulse: target holds indexed bit onto SDA while SCL is released
445 TransmitPulse : begin
446 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
447
448 // Hold value
449 1/1 sda_d = sda_q;
Tests: T6 T8 T9
450 1/1 transmitting_o = 1'b1;
Tests: T6 T8 T9
451 end
452 // TransmitHold: target holds indexed bit onto SDA while SCL is pulled low, for the hold time
453 TransmitHold : begin
454 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
455
456 // Hold value
457 1/1 sda_d = sda_q;
Tests: T6 T8 T9
458 1/1 transmitting_o = 1'b1;
Tests: T6 T8 T9
459 end
460 // TransmitAck: target waits for host to ACK transmission
461 TransmitAck : begin
462 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
463 end
464 TransmitAckPulse : begin
465 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
466 1/1 if (!scl_i) begin
Tests: T6 T8 T9
467 // Pop Fifo regardless of ack/nack
468 1/1 tx_fifo_rready_o = 1'b1;
Tests: T6 T8 T9
469 end
MISSING_ELSE
470 end
471 // WaitForStop just waiting for host to trigger a stop after nack
472 WaitForStop : begin
473 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
474 1/1 expect_stop = 1'b1;
Tests: T6 T8 T9
475 1/1 sda_d = 1'b1;
Tests: T6 T8 T9
476 end
477 // AcquireByte: target acquires a byte
478 AcquireByte : begin
479 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
480 end
481 // AcquireAckWait: pause before acknowledging
482 AcquireAckWait : begin
483 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
484 1/1 if (scl_i) begin
Tests: T6 T8 T9
485 // The controller is going too fast. Abandon the transaction.
486 // Nothing is recorded for this case.
487 0/1 ==> nack_transaction_d = 1'b1;
488 end
MISSING_ELSE
489 end
490 // AcquireAckSetup: target pulls SDA low while SCL is low
491 AcquireAckSetup : begin
492 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
493 1/1 sda_d = 1'b0;
Tests: T6 T8 T9
494 1/1 transmitting_o = 1'b1;
Tests: T6 T8 T9
495 end
496 // AcquireAckPulse: target pulls SDA low while SCL is released
497 AcquireAckPulse : begin
498 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
499 1/1 sda_d = 1'b0;
Tests: T6 T8 T9
500 1/1 transmitting_o = 1'b1;
Tests: T6 T8 T9
501 end
502 // AcquireAckHold: target pulls SDA low while SCL is pulled low
503 AcquireAckHold : begin
504 1/1 target_idle_o = 1'b0;
Tests: T6 T8 T9
505 1/1 sda_d = 1'b0;
Tests: T6 T8 T9
506 1/1 transmitting_o = 1'b1;
Tests: T6 T8 T9
507
508 1/1 if (tcount_q == 20'd1) begin
Tests: T6 T8 T9
509 1/1 auto_ack_cnt_d = auto_ack_cnt_q - 1'b1;
Tests: T6 T8 T9
510 1/1 acq_fifo_wvalid_o = ~stretch_rx; // assert that acq_fifo has space
Tests: T6 T8 T9
511 1/1 acq_fifo_wdata_o = {AcqData, input_byte}; // transfer data to acq_fifo
Tests: T6 T8 T9
512 end
==> MISSING_ELSE
513 end
514 // StretchAddrAck: target stretches the clock if matching address cannot be
515 // deposited yet. (During ACK phase)
516 StretchAddrAck : begin
517 1/1 target_idle_o = 1'b0;
Tests: T49 T50 T51
518 1/1 scl_d = 1'b0;
Tests: T49 T50 T51
519 1/1 actively_stretching = stretch_addr;
Tests: T49 T50 T51
520
521 1/1 if (nack_timeout) begin
Tests: T49 T50 T51
522 1/1 nack_transaction_d = 1'b1;
Tests: T49 T50 T51
523 // Record NACK'd Start bytes as long as there is space.
524 // The next state is always WaitForStop, so the ACQ FIFO needs to be
525 // written here.
526 1/1 acq_fifo_wvalid_o = !acq_fifo_full_or_last_space;
Tests: T49 T50 T51
527 1/1 acq_fifo_wdata_o = {AcqNackStart, input_byte};
Tests: T49 T50 T51
528 end
MISSING_ELSE
529 end
530 // StretchAddrAckSetup: target pulls SDA low while pulling SCL low for
531 // setup time. This is to prepare the setup time after a stretch.
532 StretchAddrAckSetup : begin
533 0/1 ==> target_idle_o = 1'b0;
534 0/1 ==> sda_d = 1'b0;
535 0/1 ==> scl_d = 1'b0;
536 0/1 ==> transmitting_o = 1'b1;
537 end
538 // StretchAddr: target stretches the clock if matching address cannot be
539 // deposited yet.
540 StretchAddr : begin
541 1/1 target_idle_o = 1'b0;
Tests: T52 T53 T54
542 1/1 scl_d = 1'b0;
Tests: T52 T53 T54
543 1/1 actively_stretching = stretch_addr;
Tests: T52 T53 T54
544
545 1/1 if (nack_timeout) begin
Tests: T52 T53 T54
546 1/1 nack_transaction_d = 1'b1;
Tests: T55 T56 T57
547 // Record NACK'd Start bytes as long as there is space.
548 // The next state is always WaitForStop, so the ACQ FIFO needs to be
549 // written here.
550 1/1 acq_fifo_wvalid_o = !acq_fifo_full_or_last_space;
Tests: T55 T56 T57
551 1/1 acq_fifo_wdata_o = {AcqNackStart, input_byte};
Tests: T55 T56 T57
552 1/1 end else if (!stretch_addr) begin
Tests: T52 T53 T54
553 1/1 acq_fifo_wvalid_o = 1'b1;
Tests: T54 T58 T59
554 1/1 if (restart_det_q) begin
Tests: T54 T58 T59
555 1/1 acq_fifo_wdata_o = {AcqRestart, input_byte};
Tests: T54 T58 T59
556 end else begin
557 1/1 acq_fifo_wdata_o = {AcqStart, input_byte};
Tests: T54 T58 T59
558 end
559 end
MISSING_ELSE
560 end
561 // StretchTx: target stretches the clock when tx_fifo is empty
562 StretchTx : begin
563 1/1 target_idle_o = 1'b0;
Tests: T6 T9 T10
564 1/1 scl_d = 1'b0;
Tests: T6 T9 T10
565 1/1 actively_stretching = stretch_tx;
Tests: T6 T9 T10
566
567 1/1 if (nack_timeout) begin
Tests: T6 T9 T10
568 // Only the NackStop will get recorded (later) to provide ACQ FIFO
569 // history of the failed transaction. Meanwhile, the NACK timeout
570 // will still get reported.
571 1/1 nack_transaction_d = 1'b1;
Tests: T60 T61 T62
572 end
MISSING_ELSE
573 end
574 // StretchTxSetup: drive the return data
575 StretchTxSetup : begin
576 1/1 target_idle_o = 1'b0;
Tests: T6 T9 T10
577 1/1 scl_d = 1'b0;
Tests: T6 T9 T10
578 1/1 sda_d = tx_fifo_rdata[3'(bit_idx)];
Tests: T6 T9 T10
579 1/1 transmitting_o = 1'b1;
Tests: T6 T9 T10
580 end
581 // StretchAcqFull: target stretches the clock when acq_fifo is full
582 StretchAcqFull : begin
583 1/1 target_idle_o = 1'b0;
Tests: T52 T46 T47
584 1/1 scl_d = 1'b0;
Tests: T52 T46 T47
585 1/1 ack_ctrl_stretching = !can_auto_ack;
Tests: T52 T46 T47
586 1/1 actively_stretching = stretch_rx;
Tests: T52 T46 T47
587
588
589 1/1 if (nack_timeout || (sw_nack_i && !can_auto_ack)) begin
Tests: T52 T46 T47
590 1/1 nack_transaction_d = 1'b1;
Tests: T63 T64 T65
591 1/1 acq_fifo_wvalid_o = !acq_fifo_full_or_last_space;
Tests: T63 T64 T65
592 1/1 acq_fifo_wdata_o = {AcqNack, input_byte};
Tests: T63 T64 T65
593 end
MISSING_ELSE
594 end
595 // StretchAcqSetup: Drive the ACK and wait for tSetupData before
596 // releasing SCL
597 StretchAcqSetup : begin
598 1/1 target_idle_o = 1'b0;
Tests: T46 T47 T48
599 1/1 scl_d = 1'b0;
Tests: T46 T47 T48
600 1/1 sda_d = 1'b0;
Tests: T46 T47 T48
601 1/1 transmitting_o = 1'b1;
Tests: T46 T47 T48
602 end
603 // default
604 default : begin
605 target_idle_o = 1'b1;
606 sda_d = 1'b1;
607 scl_d = 1'b1;
608 transmitting_o = 1'b0;
609 tx_fifo_rready_o = 1'b0;
610 acq_fifo_wvalid_o = 1'b0;
611 acq_fifo_wdata_o = ACQ_FIFO_WIDTH'(0);
612 event_cmd_complete_o = 1'b0;
613 restart_det_d = 1'b0;
614 xact_for_us_d = 1'b0;
615 auto_ack_cnt_d = '0;
616 ack_ctrl_stretching = 1'b0;
617 nack_transaction_d = 1'b0;
618 actively_stretching = 1'b0;
619 end
620 endcase // unique case (state_q)
621
622 // start / stop override
623 1/1 if (target_enable_i && (stop_detect_i || bus_timeout_i)) begin
Tests: T1 T2 T3
624 1/1 event_cmd_complete_o = xfer_for_us_q;
Tests: T6 T8 T9
625 1/1 event_tx_bus_timeout_o = bus_timeout_i && rw_bit_q;
Tests: T6 T8 T9
626 // Note that we assume the ACQ FIFO can accept a new item and will
627 // receive the arbiter grant without delay. No other FIFOs should have
628 // activity during a Start or Stop symbol.
629 // TODO: Add an assertion.
630 1/1 acq_fifo_wvalid_o = xact_for_us_q;
Tests: T6 T8 T9
631 1/1 if (nack_transaction_q || bus_timeout_i) begin
Tests: T6 T8 T9
632 1/1 acq_fifo_wdata_o = {AcqNackStop, input_byte};
Tests: T63 T64 T65
633 end else begin
634 1/1 acq_fifo_wdata_o = {AcqStop, input_byte};
Tests: T6 T8 T9
635 end
636 1/1 end else if (target_enable_i && start_detect_i) begin
Tests: T1 T2 T3
637 1/1 restart_det_d = !target_idle_o;
Tests: T6 T8 T9
638 1/1 event_cmd_complete_o = xfer_for_us_q;
Tests: T6 T8 T9
639 1/1 end else if (arbitration_lost_i) begin
Tests: T1 T2 T3
640 0/1 ==> nack_transaction_d = 1'b1;
641 0/1 ==> event_cmd_complete_o = xfer_for_us_q;
642 0/1 ==> event_tx_arbitration_lost_o = rw_bit_q;
643 end
MISSING_ELSE
644 end
645
646 1/1 assign stretch_rx = !acq_fifo_plenty_space || !can_auto_ack;
Tests: T1 T2 T3
647 1/1 assign stretch_addr = !acq_fifo_plenty_space;
Tests: T1 T2 T3
648
649 // This condition determines whether this target has stretched beyond the
650 // timeout in which case it must now send a NACK to the host.
651 1/1 assign nack_timeout = nack_timeout_en_i && stretch_active_cnt >= nack_timeout_i;
Tests: T1 T2 T3
652
653 // Stretch Tx phase when:
654 // 1. When there is no data to return to host
655 // 2. When the acq_fifo contains any entry other than a singular start condition
656 // read command.
657 // 3. When there are unhandled events set in the TX_EVENTS CSR. This is
658 // a synchronization point with software, which needs to clear them
659 // first.
660 //
661 // Besides the unhandled events, only the fifo depth is checked here, because
662 // stretch_tx is only evaluated by the fsm on the read path. This means a read
663 // start byte has already been deposited, and there is no need for checking
664 // the value of the current state for this signal.
665 1/1 assign stretch_tx = !tx_fifo_rvalid_i || unhandled_tx_stretch_event_i ||
Tests: T1 T2 T3
666 (acq_fifo_depth_i > AcqFifoDepthWidth'(1'b1));
667
668 // Only used for assertion
669 logic unused_acq_rdata;
670 1/1 assign unused_acq_rdata = |acq_fifo_rdata_i;
Tests: T1 T2 T3
671
672 // Conditional state transition
673 always_comb begin : state_functions
674 1/1 state_d = state_q;
Tests: T1 T2 T3
675 1/1 load_tcount = 1'b0;
Tests: T1 T2 T3
676 1/1 tcount_sel = tNoDelay;
Tests: T1 T2 T3
677 1/1 input_byte_clr = 1'b0;
Tests: T1 T2 T3
678 1/1 event_tx_stretch_o = 1'b0;
Tests: T1 T2 T3
679
680 1/1 unique case (state_q)
Tests: T1 T2 T3
681 // Idle: initial state, SDA and SCL are released (high)
682 Idle : begin
683 // The bus is idle. Waiting for a Start.
684 end
685
686 /////////////////
687 // TARGET MODE //
688 /////////////////
689
690 // AcquireStart: hold for the end of the start condition
691 AcquireStart : begin
692 1/1 if (!scl_i) begin
Tests: T6 T8 T9
693 1/1 state_d = AddrRead;
Tests: T6 T8 T9
694 1/1 input_byte_clr = 1'b1;
Tests: T6 T8 T9
695 end
MISSING_ELSE
696 end
697 // AddrRead: read and compare target address
698 AddrRead : begin
699 // bit_ack goes high the cycle after scl_i goes low, after the 8th bit
700 // was captured.
701 1/1 if (bit_ack) begin
Tests: T6 T8 T9
702 1/1 if (address_match) begin
Tests: T6 T8 T9
703 1/1 state_d = AddrAckWait;
Tests: T6 T8 T9
704 // Wait for hold time to avoid interfering with the controller.
705 1/1 load_tcount = 1'b1;
Tests: T6 T8 T9
706 1/1 tcount_sel = tHoldData;
Tests: T6 T8 T9
707 end else begin // !address_match
708 // This means this transfer is not meant for us.
709 1/1 state_d = WaitForStop;
Tests: T47 T66 T67
710 end
711 end
MISSING_ELSE
712 end
713 // AddrAckWait: pause for hold time before acknowledging
714 AddrAckWait : begin
715 1/1 if (scl_i) begin
Tests: T6 T8 T9
716 // The controller is going too fast. Abandon the transaction.
717 0/1 ==> state_d = WaitForStop;
718 1/1 end else if (tcount_q == 20'd1) begin
Tests: T6 T8 T9
719 1/1 if (!nack_addr_after_timeout_i) begin
Tests: T6 T8 T9
720 // Always ACK addresses in this mode.
721 1/1 state_d = AddrAckSetup;
Tests: T6 T8 T9
722 end else begin
723 1/1 if (nack_transaction_q) begin
Tests: T64 T65 T68
724 // We must have stretched before, and software has been notified
725 // through an ACQ FIFO full event. For writes we should NACK all
726 // bytes in the transfer unconditionally. For reads, we NACK
727 // the address byte, then release SDA for the rest of the
728 // transfer.
729 // Essentially, we're waiting for the end of the transaction.
730 0/1 ==> state_d = WaitForStop;
731 1/1 end else if (stretch_addr) begin
Tests: T64 T65 T68
732 // Not enough bytes to capture the Start/address byte, but might
733 // need to NACK.
734 1/1 state_d = StretchAddrAck;
Tests: T49 T50 T51
735 end else begin
736 // The transaction hasn't already been NACK'd, and there is
737 // room in the ACQ FIFO. Proceed.
738 1/1 state_d = AddrAckSetup;
Tests: T64 T65 T68
739 end
740 end
741 end
==> MISSING_ELSE
742 end
743 // AddrAckSetup: target pulls SDA low while SCL is low
744 AddrAckSetup : begin
745 2/2 if (scl_i) state_d = AddrAckPulse;
Tests: T6 T8 T9 | T6 T8 T9
MISSING_ELSE
746 end
747 // AddrAckPulse: target pulls SDA low while SCL is released
748 AddrAckPulse : begin
749 1/1 if (!scl_i) begin
Tests: T6 T8 T9
750 1/1 state_d = AddrAckHold;
Tests: T6 T8 T9
751 1/1 load_tcount = 1'b1;
Tests: T6 T8 T9
752 1/1 tcount_sel = tHoldData;
Tests: T6 T8 T9
753 end
MISSING_ELSE
754 end
755 // AddrAckHold: target pulls SDA low while SCL is pulled low
756 AddrAckHold : begin
757 1/1 if (tcount_q == 20'd1) begin
Tests: T6 T8 T9
758 // Stretch when requested by software or when there is insufficient
759 // space to hold the start / address format byte.
760 // If there is sufficient space, the format byte is written into the acquisition fifo.
761 // Don't stretch when we are unconditionally nacking the next byte
762 // anyways.
763 1/1 if (nack_transaction_q) begin
Tests: T6 T8 T9
764 // If the Target is set to NACK already, release SDA and wait
765 // for a Stop. This isn't an ideal response for SMBus reads, since
766 // 127 bytes of 0xff will just happen to have a correct PEC. It's
767 // best for software to ensure there is always space in the ACQ
768 // FIFO.
769 0/1 ==> state_d = WaitForStop;
770 1/1 end else if (stretch_addr) begin // !nack_transaction_q
Tests: T6 T8 T9
771 // Stretching because there is insufficient space to hold the
772 // start / address format byte.
773 // We should only reach here with !nack_addr_after_timeout_i, since
774 // we had enough space for nack_addr_after_timeout_i already,
775 // before issuing the ACK.
776 1/1 state_d = StretchAddr;
Tests: T52 T53 T54
777 1/1 end else if (rw_bit_q) begin
Tests: T6 T8 T9
778 // Not NACKing automatically, not stretching, and it's a read.
779 1/1 state_d = TransmitWait;
Tests: T6 T8 T9
780 end else begin
781 // Not NACKing automatically, not stretching, and it's a write.
782 1/1 state_d = AcquireByte;
Tests: T6 T8 T9
783 end
784 end
==> MISSING_ELSE
785 end
786 // TransmitWait: Evaluate whether there are entries to send first
787 TransmitWait : begin
788 1/1 if (stretch_tx) begin
Tests: T6 T8 T9
789 1/1 state_d = StretchTx;
Tests: T6 T9 T10
790 end else begin
791 1/1 state_d = TransmitSetup;
Tests: T6 T8 T9
792 end
793 end
794 // TransmitSetup: target shifts indexed bit onto SDA while SCL is low
795 TransmitSetup : begin
796 2/2 if (scl_i) state_d = TransmitPulse;
Tests: T6 T8 T9 | T6 T8 T9
MISSING_ELSE
797 end
798 // TransmitPulse: target shifts indexed bit onto SDA while SCL is released
799 TransmitPulse : begin
800 1/1 if (!scl_i) begin
Tests: T6 T8 T9
801 1/1 state_d = TransmitHold;
Tests: T6 T8 T9
802 1/1 load_tcount = 1'b1;
Tests: T6 T8 T9
803 1/1 tcount_sel = tHoldData;
Tests: T6 T8 T9
804 end
MISSING_ELSE
805 end
806 // TransmitHold: target shifts indexed bit onto SDA while SCL is pulled low
807 TransmitHold : begin
808 1/1 if (tcount_q == 20'd1) begin
Tests: T6 T8 T9
809 1/1 if (bit_ack) begin
Tests: T6 T8 T9
810 1/1 state_d = TransmitAck;
Tests: T6 T8 T9
811 end else begin
812 1/1 load_tcount = 1'b1;
Tests: T6 T8 T9
813 1/1 tcount_sel = tHoldData;
Tests: T6 T8 T9
814 1/1 state_d = TransmitSetup;
Tests: T6 T8 T9
815 end
816 end
==> MISSING_ELSE
817 end
818 // Wait for clock to become positive.
819 TransmitAck : begin
820 1/1 if (scl_i) begin
Tests: T6 T8 T9
821 1/1 state_d = TransmitAckPulse;
Tests: T6 T8 T9
822 end
MISSING_ELSE
823 end
824 // TransmitAckPulse: target waits for host to ACK transmission
825 // If a nak is received, that means a stop is incoming.
826 TransmitAckPulse : begin
827 1/1 if (!scl_i) begin
Tests: T6 T8 T9
828 // If host acknowledged, that means we must continue
829 1/1 if (host_ack) begin
Tests: T6 T8 T9
830 1/1 state_d = TransmitWait;
Tests: T6 T8 T9
831 end else begin
832 // If host nak'd then the transaction is about to terminate, go to a wait state
833 1/1 state_d = WaitForStop;
Tests: T6 T8 T9
834 end
835 end
MISSING_ELSE
836 end
837 // An inert state just waiting for host to issue a stop
838 // Cannot cycle back to idle directly as other events depend on the system being
839 // non-idle.
840 WaitForStop : begin
841 1/1 state_d = WaitForStop;
Tests: T6 T8 T9
842 end
843 // AcquireByte: target acquires a byte
844 AcquireByte : begin
845 1/1 if (bit_ack) begin
Tests: T6 T8 T9
846 1/1 state_d = AcquireAckWait;
Tests: T6 T8 T9
847 1/1 load_tcount = 1'b1;
Tests: T6 T8 T9
848 1/1 tcount_sel = tHoldData;
Tests: T6 T8 T9
849 end
MISSING_ELSE
850 end
851 // AcquireAckWait: pause for hold time before acknowledging
852 AcquireAckWait : begin
853 1/1 if (scl_i) begin
Tests: T6 T8 T9
854 // The controller is going too fast. Abandon the transaction.
855 0/1 ==> state_d = WaitForStop;
856 1/1 end else if (tcount_q == 20'd1) begin
Tests: T6 T8 T9
857 1/1 if (nack_transaction_q) begin
Tests: T6 T8 T9
858 0/1 ==> state_d = WaitForStop;
859 1/1 end else if (stretch_rx) begin
Tests: T6 T8 T9
860 // If there is no space for the current entry, stretch clocks and
861 // wait for software to make space. Also stretch if ACK Control
862 // Mode is enabled and the auto_ack_cnt is exhausted.
863 1/1 state_d = StretchAcqFull;
Tests: T52 T46 T47
864 end else begin
865 1/1 state_d = AcquireAckSetup;
Tests: T6 T8 T9
866 end
867 end
==> MISSING_ELSE
868 end
869 // AcquireAckSetup: target pulls SDA low while SCL is low
870 AcquireAckSetup : begin
871 2/2 if (scl_i) state_d = AcquireAckPulse;
Tests: T6 T8 T9 | T6 T8 T9
MISSING_ELSE
872 end
873 // AcquireAckPulse: target pulls SDA low while SCL is released
874 AcquireAckPulse : begin
875 1/1 if (!scl_i) begin
Tests: T6 T8 T9
876 1/1 state_d = AcquireAckHold;
Tests: T6 T8 T9
877 1/1 load_tcount = 1'b1;
Tests: T6 T8 T9
878 1/1 tcount_sel = tHoldData;
Tests: T6 T8 T9
879 end
MISSING_ELSE
880 end
881 // AcquireAckHold: target pulls SDA low while SCL is pulled low
882 AcquireAckHold : begin
883 1/1 if (tcount_q == 20'd1) begin
Tests: T6 T8 T9
884 1/1 state_d = AcquireByte;
Tests: T6 T8 T9
885 end
==> MISSING_ELSE
886 end
887 // StretchAddrAck: The address phase can not yet be completed, stretch
888 // clock and wait.
889 StretchAddrAck : begin
890 // When there is space in the FIFO go to the next state.
891 // If we hit our nack timeout, we must nack the full transaction.
892 1/1 if (nack_timeout) begin
Tests: T49 T50 T51
893 1/1 state_d = WaitForStop;
Tests: T49 T50 T51
894 1/1 end else if (!stretch_addr) begin
Tests: T49 T50 T51
895 0/1 ==> state_d = StretchAddrAckSetup;
896 0/1 ==> load_tcount = 1'b1;
897 0/1 ==> tcount_sel = tSetupData;
898 end
MISSING_ELSE
899 end
900 // StretchAddrAckSetup: target pulls SDA low while pulling SCL low for
901 // setup time. This is to prepare the setup time after a stretch.
902 StretchAddrAckSetup : begin
903 0/1 ==> if (tcount_q == 20'd1) begin
904 0/1 ==> state_d = AddrAckSetup;
905 end
==> MISSING_ELSE
906 end
907 // StretchAddr: The address phase can not yet be completed, stretch
908 // clock and wait.
909 StretchAddr : begin
910 // When there is space in the FIFO go to the next state.
911 // If we hit our nack timeout, we must nack the full transaction.
912 1/1 if (nack_timeout) begin
Tests: T52 T53 T54
913 1/1 state_d = WaitForStop;
Tests: T55 T56 T57
914 1/1 end else if (!stretch_addr) begin
Tests: T52 T53 T54
915 // When transmitting after an address stretch, we need to assume
916 // that it looks like a Tx stretch. This is because if we try
917 // to follow the normal path, the logic will release the clock
918 // too early relative to driving the data. This will cause a
919 // setup violation. This is the same case to needing StretchTxSetup.
920 1/1 state_d = rw_bit_q ? StretchTx : AcquireByte;
Tests: T54 T58 T59
921 end
MISSING_ELSE
922 end
923 // StretchTx: target stretches the clock when tx conditions are not satisfied.
924 StretchTx : begin
925 // When in stretch state, always notify software that help is required.
926 1/1 event_tx_stretch_o = 1'b1;
Tests: T6 T9 T10
927 1/1 if (nack_timeout) begin
Tests: T6 T9 T10
928 1/1 state_d = WaitForStop;
Tests: T60 T61 T62
929 1/1 end else if (!stretch_tx) begin
Tests: T6 T9 T10
930 // When data becomes available, we must first drive it onto the line
931 // for at least the "setup" period. If we do not, once the clock is released, the
932 // pull-up in the system will likely immediately trigger a rising clock
933 // edge (since the stretch likely pushed us way beyond the original intended
934 // rise). If we do not artificially create the setup period here, it will
935 // likely create a timing violation.
936 1/1 state_d = StretchTxSetup;
Tests: T6 T9 T10
937 1/1 load_tcount = 1'b1;
Tests: T6 T9 T10
938 1/1 tcount_sel = tSetupData;
Tests: T6 T9 T10
939
940 // When leaving stretch state, de-assert software notification
941 1/1 event_tx_stretch_o = 1'b0;
Tests: T6 T9 T10
942 end
MISSING_ELSE
943 end
944 // StretchTxSetup: Wait for tSetupData before going to transmit
945 StretchTxSetup : begin
946 1/1 if (tcount_q == 20'd1) begin
Tests: T6 T9 T10
947 1/1 state_d = TransmitSetup;
Tests: T6 T9 T10
948 end
MISSING_ELSE
949 end
950 // StretchAcqFull: target stretches the clock when acq_fifo is full
951 // When space becomes available, move on to prepare to ACK. If we hit
952 // our NACK timeout we must continue and unconditionally NACK the next
953 // one.
954 // If ACK Control Mode is enabled, also stretch if the Auto ACK counter
955 // is exhausted. If the conditions for an ACK Control stretch are
956 // present, NACK the transaction if directed by SW.
957 StretchAcqFull : begin
958 1/1 if (nack_timeout || (sw_nack_i && !can_auto_ack)) begin
Tests: T52 T46 T47
959 1/1 state_d = WaitForStop;
Tests: T63 T64 T65
960 1/1 end else if (~stretch_rx) begin
Tests: T52 T46 T47
961 1/1 state_d = StretchAcqSetup;
Tests: T46 T47 T48
962 1/1 load_tcount = 1'b1;
Tests: T46 T47 T48
963 1/1 tcount_sel = tSetupData;
Tests: T46 T47 T48
964 end
MISSING_ELSE
965 end
966 // StretchAcqSetup: Drive the ACK and wait for tSetupData before
967 // releasing SCL
968 StretchAcqSetup : begin
969 1/1 if (tcount_q == 20'd1) begin
Tests: T46 T47 T48
970 1/1 state_d = AcquireAckSetup;
Tests: T46 T47 T48
971 end
MISSING_ELSE
972 end
973 // default
974 default : begin
975 state_d = Idle;
976 load_tcount = 1'b0;
977 tcount_sel = tNoDelay;
978 input_byte_clr = 1'b0;
979 event_tx_stretch_o = 1'b0;
980 end
981 endcase // unique case (state_q)
982
983 // When a start is detected, always go to the acquire start state.
984 // Differences in repeated start / start handling are done in the
985 // other FSM.
986 1/1 if (!target_idle && !target_enable_i) begin
Tests: T1 T2 T3
987 // If the target function is currently not idle but target_enable is suddenly dropped,
988 // (maybe because the host locked up and we want to cycle back to an initial state),
989 // transition immediately.
990 // The same treatment is not given to the host mode because it already attempts to
991 // gracefully terminate. If the host cannot gracefully terminate for whatever reason,
992 // (the other side is holding SCL low), we may need to forcefully reset the module.
993 // ICEBOX(#18004): It may be worth having a force stop condition to force the host back to
994 // Idle in case graceful termination is not possible.
995 0/1 ==> state_d = Idle;
996 1/1 end else if (target_enable_i && start_detect_i) begin
Tests: T1 T2 T3
997 1/1 state_d = AcquireStart;
Tests: T6 T8 T9
998 1/1 end else if (stop_detect_i || bus_timeout_i) begin
Tests: T1 T2 T3
999 1/1 state_d = Idle;
Tests: T1 T3 T4
1000 1/1 end else if (arbitration_lost_i) begin
Tests: T1 T2 T3
1001 0/1 ==> state_d = WaitForStop;
1002 end
MISSING_ELSE
1003 end
1004
1005 // Synchronous state transition
1006 always_ff @ (posedge clk_i or negedge rst_ni) begin : state_transition
1007 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
1008 1/1 state_q <= Idle;
Tests: T1 T2 T3
1009 end else begin
1010 1/1 state_q <= state_d;
Tests: T1 T2 T3
1011 end
1012 end
1013
1014 // Saved sda output used in certain states.
1015 always_ff @(posedge clk_i or negedge rst_ni) begin
1016 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
1017 1/1 sda_q <= 1'b1;
Tests: T1 T2 T3
1018 end else begin
1019 1/1 sda_q <= sda_d;
Tests: T1 T2 T3
1020 end
1021 end
1022
1023 1/1 assign scl_o = scl_d;
Tests: T1 T2 T3
1024 1/1 assign sda_o = sda_d;
Tests: T1 T2 T3
1025
1026 // Fed out for interrupt purposes
1027 1/1 assign acq_fifo_full_o = !acq_fifo_plenty_space;
Tests: T1 T2 T3
Cond Coverage for Module :
i2c_target_fsm
| Total | Covered | Percent |
Conditions | 120 | 96 | 80.00 |
Logical | 120 | 96 | 80.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 158
EXPRESSION (start_detect_i && target_idle_o)
-------1------ ------2------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T6,T8,T9 |
1 | 1 | Covered | T3,T4,T5 |
LINE 167
EXPRESSION (auto_ack_load_i && ack_ctrl_stretching)
-------1------- ---------2---------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T46,T47,T48 |
1 | 0 | Not Covered | |
1 | 1 | Covered | T46,T47,T48 |
LINE 175
EXPRESSION (((!ack_ctrl_mode_i)) || (auto_ack_cnt_q > '0))
----------1--------- ----------2----------
-1- | -2- | Status | Tests |
0 | 0 | Covered | T46,T47,T48 |
0 | 1 | Covered | T46,T47,T48 |
1 | 0 | Covered | T1,T2,T3 |
LINE 212
EXPRESSION (bit_idx == 4'd8)
--------1--------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T3,T4,T5 |
LINE 220
EXPRESSION (scl_i_q && ((!scl_i)))
---1--- -----2----
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T1,T2,T3 |
LINE 223
EXPRESSION (input_byte_clr || bit_ack)
-------1------ ---2---
-1- | -2- | Status | Tests |
0 | 0 | Covered | T1,T2,T3 |
0 | 1 | Covered | T3,T4,T5 |
1 | 0 | Covered | T6,T8,T9 |
LINE 231
EXPRESSION (((input_byte[7:1] & target_mask0_i) == target_address0_i) && (target_mask0_i != '0))
----------------------------1---------------------------- -----------2----------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T6,T8,T9 |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T6,T8,T9 |
LINE 231
SUB-EXPRESSION ((input_byte[7:1] & target_mask0_i) == target_address0_i)
----------------------------1----------------------------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 231
SUB-EXPRESSION (target_mask0_i != '0)
-----------1----------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T6,T8,T9 |
LINE 233
EXPRESSION (((input_byte[7:1] & target_mask1_i) == target_address1_i) && (target_mask1_i != '0))
----------------------------1---------------------------- -----------2----------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T6,T8,T9 |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T6,T8,T9 |
LINE 233
SUB-EXPRESSION ((input_byte[7:1] & target_mask1_i) == target_address1_i)
----------------------------1----------------------------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 233
SUB-EXPRESSION (target_mask1_i != '0)
-----------1----------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T6,T8,T9 |
LINE 235
EXPRESSION (address0_match || address1_match)
-------1------ -------2------
-1- | -2- | Status | Tests |
0 | 0 | Covered | T1,T2,T3 |
0 | 1 | Covered | T6,T8,T9 |
1 | 0 | Covered | T6,T8,T9 |
LINE 243
EXPRESSION (((!scl_i_q)) && scl_i)
------1----- --2--
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T1,T3,T4 |
LINE 252
EXPRESSION (((!scl_i_q)) && scl_i)
------1----- --2--
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T1,T3,T4 |
LINE 304
EXPRESSION (bit_ack && address_match)
---1--- ------2------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T6,T8,T9 |
1 | 0 | Covered | T3,T4,T5 |
1 | 1 | Covered | T6,T8,T9 |
LINE 323
EXPRESSION (target_enable_i & xfer_for_us_q & rw_bit_q & stop_detect_i & ((!expect_stop)))
-------1------- ------2------ ----3--- ------4------ --------5-------
-1- | -2- | -3- | -4- | -5- | Status | Tests |
0 | 1 | 1 | 1 | 1 | Not Covered | |
1 | 0 | 1 | 1 | 1 | Covered | T52,T53,T60 |
1 | 1 | 0 | 1 | 1 | Covered | T6,T8,T10 |
1 | 1 | 1 | 0 | 1 | Covered | T6,T8,T9 |
1 | 1 | 1 | 1 | 0 | Covered | T8,T9,T10 |
1 | 1 | 1 | 1 | 1 | Covered | T52,T53 |
LINE 327
EXPRESSION (((!nack_transaction_q)) && nack_transaction_d)
-----------1----------- ---------2--------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T63,T64,T65 |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T63,T64,T65 |
LINE 416
EXPRESSION (tcount_q == 16'b1)
---------1---------
-1- | Status | Tests |
0 | Not Covered | |
1 | Covered | T6,T8,T9 |
LINE 508
EXPRESSION (tcount_q == 16'b1)
---------1---------
-1- | Status | Tests |
0 | Not Covered | |
1 | Covered | T6,T8,T9 |
LINE 589
EXPRESSION (nack_timeout || (sw_nack_i && ((!can_auto_ack))))
------1----- ----------------2---------------
-1- | -2- | Status | Tests |
0 | 0 | Covered | T52,T46,T47 |
0 | 1 | Not Covered | |
1 | 0 | Covered | T63,T64,T65 |
LINE 589
SUB-EXPRESSION (sw_nack_i && ((!can_auto_ack)))
----1---- --------2--------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T46,T47,T48 |
1 | 0 | Not Covered | |
1 | 1 | Not Covered | |
LINE 623
EXPRESSION (target_enable_i && (stop_detect_i || bus_timeout_i))
-------1------- ----------------2---------------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T3,T4 |
1 | 0 | Covered | T6,T8,T9 |
1 | 1 | Covered | T6,T8,T9 |
LINE 623
SUB-EXPRESSION (stop_detect_i || bus_timeout_i)
------1------ ------2------
-1- | -2- | Status | Tests |
0 | 0 | Covered | T1,T2,T3 |
0 | 1 | Not Covered | |
1 | 0 | Covered | T1,T3,T4 |
LINE 625
EXPRESSION (bus_timeout_i && rw_bit_q)
------1------ ----2---
-1- | -2- | Status | Tests |
0 | 1 | Covered | T8,T9,T10 |
1 | 0 | Not Covered | |
1 | 1 | Not Covered | |
LINE 631
EXPRESSION (nack_transaction_q || bus_timeout_i)
---------1-------- ------2------
-1- | -2- | Status | Tests |
0 | 0 | Covered | T6,T8,T9 |
0 | 1 | Not Covered | |
1 | 0 | Covered | T63,T64,T65 |
LINE 636
EXPRESSION (target_enable_i && start_detect_i)
-------1------- -------2------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T3,T4,T5 |
1 | 0 | Covered | T6,T8,T9 |
1 | 1 | Covered | T6,T8,T9 |
LINE 646
EXPRESSION (((!acq_fifo_plenty_space)) || ((!can_auto_ack)))
-------------1------------ --------2--------
-1- | -2- | Status | Tests |
0 | 0 | Covered | T1,T2,T3 |
0 | 1 | Covered | T46,T47,T48 |
1 | 0 | Covered | T52,T63,T64 |
LINE 651
EXPRESSION (nack_timeout_en_i && (stretch_active_cnt >= nack_timeout_i))
--------1-------- -------------------2------------------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T63,T64,T65 |
1 | 1 | Covered | T63,T64,T65 |
LINE 665
EXPRESSION (((!tx_fifo_rvalid_i)) || unhandled_tx_stretch_event_i || (acq_fifo_depth_i > 9'(1'b1)))
----------1---------- --------------2------------- --------------3--------------
-1- | -2- | -3- | Status | Tests |
0 | 0 | 0 | Covered | T6,T8,T9 |
0 | 0 | 1 | Covered | T9,T10,T44 |
0 | 1 | 0 | Covered | T69,T70,T60 |
1 | 0 | 0 | Covered | T1,T2,T3 |
LINE 718
EXPRESSION (tcount_q == 16'b1)
---------1---------
-1- | Status | Tests |
0 | Not Covered | |
1 | Covered | T6,T8,T9 |
LINE 757
EXPRESSION (tcount_q == 16'b1)
---------1---------
-1- | Status | Tests |
0 | Not Covered | |
1 | Covered | T6,T8,T9 |
LINE 808
EXPRESSION (tcount_q == 16'b1)
---------1---------
-1- | Status | Tests |
0 | Not Covered | |
1 | Covered | T6,T8,T9 |
LINE 856
EXPRESSION (tcount_q == 16'b1)
---------1---------
-1- | Status | Tests |
0 | Not Covered | |
1 | Covered | T6,T8,T9 |
LINE 883
EXPRESSION (tcount_q == 16'b1)
---------1---------
-1- | Status | Tests |
0 | Not Covered | |
1 | Covered | T6,T8,T9 |
LINE 903
EXPRESSION (tcount_q == 16'b1)
---------1---------
-1- | Status | Tests |
0 | Not Covered | |
1 | Not Covered | |
LINE 920
EXPRESSION (rw_bit_q ? StretchTx : AcquireByte)
----1---
-1- | Status | Tests |
0 | Covered | T54,T58,T59 |
1 | Not Covered | |
LINE 946
EXPRESSION (tcount_q == 16'b1)
---------1---------
-1- | Status | Tests |
0 | Covered | T6,T9,T10 |
1 | Covered | T6,T9,T10 |
LINE 958
EXPRESSION (nack_timeout || (sw_nack_i && ((!can_auto_ack))))
------1----- ----------------2---------------
-1- | -2- | Status | Tests |
0 | 0 | Covered | T52,T46,T47 |
0 | 1 | Not Covered | |
1 | 0 | Covered | T63,T64,T65 |
LINE 958
SUB-EXPRESSION (sw_nack_i && ((!can_auto_ack)))
----1---- --------2--------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T46,T47,T48 |
1 | 0 | Not Covered | |
1 | 1 | Not Covered | |
LINE 969
EXPRESSION (tcount_q == 16'b1)
---------1---------
-1- | Status | Tests |
0 | Covered | T46,T47,T48 |
1 | Covered | T46,T47,T48 |
LINE 986
EXPRESSION (((!target_idle)) && ((!target_enable_i)))
--------1------- ----------2---------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T6,T8,T9 |
1 | 1 | Not Covered | |
LINE 996
EXPRESSION (target_enable_i && start_detect_i)
-------1------- -------2------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T3,T4,T5 |
1 | 0 | Covered | T6,T8,T9 |
1 | 1 | Covered | T6,T8,T9 |
LINE 998
EXPRESSION (stop_detect_i || bus_timeout_i)
------1------ ------2------
-1- | -2- | Status | Tests |
0 | 0 | Covered | T1,T2,T3 |
0 | 1 | Not Covered | |
1 | 0 | Covered | T1,T3,T4 |
FSM Coverage for Module :
i2c_target_fsm
Summary for FSM :: state_q
| Total | Covered | Percent | |
States |
26 |
25 |
96.15 |
(Not included in score) |
Transitions |
106 |
78 |
73.58 |
|
Sequences |
0 |
0 |
|
|
State, Transition and Sequence Details for FSM :: state_q
| | | |
AcquireAckHold |
876 |
Covered |
T6,T8,T9 |
AcquireAckPulse |
871 |
Covered |
T6,T8,T9 |
AcquireAckSetup |
865 |
Covered |
T6,T8,T9 |
AcquireAckWait |
846 |
Covered |
T6,T8,T9 |
AcquireByte |
782 |
Covered |
T6,T8,T9 |
AcquireStart |
997 |
Covered |
T6,T8,T9 |
AddrAckHold |
750 |
Covered |
T6,T8,T9 |
AddrAckPulse |
745 |
Covered |
T6,T8,T9 |
AddrAckSetup |
721 |
Covered |
T6,T8,T9 |
AddrAckWait |
703 |
Covered |
T6,T8,T9 |
AddrRead |
693 |
Covered |
T6,T8,T9 |
Idle |
995 |
Covered |
T1,T2,T3 |
StretchAcqFull |
863 |
Covered |
T52,T46,T47 |
StretchAcqSetup |
961 |
Covered |
T46,T47,T48 |
StretchAddr |
776 |
Covered |
T52,T53,T54 |
StretchAddrAck |
734 |
Covered |
T49,T50,T51 |
StretchAddrAckSetup |
895 |
Not Covered |
|
StretchTx |
789 |
Covered |
T6,T9,T10 |
StretchTxSetup |
936 |
Covered |
T6,T9,T10 |
TransmitAck |
810 |
Covered |
T6,T8,T9 |
TransmitAckPulse |
821 |
Covered |
T6,T8,T9 |
TransmitHold |
801 |
Covered |
T6,T8,T9 |
TransmitPulse |
796 |
Covered |
T6,T8,T9 |
TransmitSetup |
791 |
Covered |
T6,T8,T9 |
TransmitWait |
779 |
Covered |
T6,T8,T9 |
WaitForStop |
709 |
Covered |
T6,T8,T9 |
| | | |
AcquireAckHold->AcquireByte |
884 |
Covered |
T6,T8,T9 |
AcquireAckHold->AcquireStart |
997 |
Covered |
T52,T53 |
AcquireAckHold->Idle |
995 |
Covered |
T52,T53 |
AcquireAckHold->WaitForStop |
1001 |
Not Covered |
|
AcquireAckPulse->AcquireAckHold |
876 |
Covered |
T6,T8,T9 |
AcquireAckPulse->AcquireStart |
997 |
Covered |
T52,T53 |
AcquireAckPulse->Idle |
995 |
Covered |
T52,T53 |
AcquireAckPulse->WaitForStop |
1001 |
Not Covered |
|
AcquireAckSetup->AcquireAckPulse |
871 |
Covered |
T6,T8,T9 |
AcquireAckSetup->AcquireStart |
997 |
Covered |
T52,T53 |
AcquireAckSetup->Idle |
995 |
Covered |
T52,T53 |
AcquireAckSetup->WaitForStop |
1001 |
Not Covered |
|
AcquireAckWait->AcquireAckSetup |
865 |
Covered |
T6,T8,T9 |
AcquireAckWait->AcquireStart |
997 |
Covered |
T52,T53 |
AcquireAckWait->Idle |
995 |
Covered |
T52,T53 |
AcquireAckWait->StretchAcqFull |
863 |
Covered |
T52,T46,T47 |
AcquireAckWait->WaitForStop |
855 |
Not Covered |
|
AcquireByte->AcquireAckWait |
846 |
Covered |
T6,T8,T9 |
AcquireByte->AcquireStart |
997 |
Covered |
T8,T9,T10 |
AcquireByte->Idle |
995 |
Covered |
T6,T8,T10 |
AcquireByte->WaitForStop |
1001 |
Not Covered |
|
AcquireStart->AddrRead |
693 |
Covered |
T6,T8,T9 |
AcquireStart->Idle |
995 |
Covered |
T52,T53 |
AcquireStart->WaitForStop |
1001 |
Not Covered |
|
AddrAckHold->AcquireByte |
782 |
Covered |
T6,T8,T9 |
AddrAckHold->AcquireStart |
997 |
Covered |
T52,T53 |
AddrAckHold->Idle |
995 |
Covered |
T52,T53 |
AddrAckHold->StretchAddr |
776 |
Covered |
T52,T53,T54 |
AddrAckHold->TransmitWait |
779 |
Covered |
T6,T8,T9 |
AddrAckHold->WaitForStop |
769 |
Not Covered |
|
AddrAckPulse->AcquireStart |
997 |
Covered |
T52,T53 |
AddrAckPulse->AddrAckHold |
750 |
Covered |
T6,T8,T9 |
AddrAckPulse->Idle |
995 |
Covered |
T52,T53 |
AddrAckPulse->WaitForStop |
1001 |
Not Covered |
|
AddrAckSetup->AcquireStart |
997 |
Covered |
T52,T53 |
AddrAckSetup->AddrAckPulse |
745 |
Covered |
T6,T8,T9 |
AddrAckSetup->Idle |
995 |
Covered |
T52,T53 |
AddrAckSetup->WaitForStop |
1001 |
Not Covered |
|
AddrAckWait->AcquireStart |
997 |
Covered |
T52,T53 |
AddrAckWait->AddrAckSetup |
721 |
Covered |
T6,T8,T9 |
AddrAckWait->Idle |
995 |
Covered |
T52,T53 |
AddrAckWait->StretchAddrAck |
734 |
Covered |
T49,T50,T51 |
AddrAckWait->WaitForStop |
717 |
Not Covered |
|
AddrRead->AcquireStart |
997 |
Covered |
T52,T53 |
AddrRead->AddrAckWait |
703 |
Covered |
T6,T8,T9 |
AddrRead->Idle |
995 |
Covered |
T52,T53,T60 |
AddrRead->WaitForStop |
709 |
Covered |
T47,T66,T67 |
Idle->AcquireStart |
997 |
Covered |
T6,T8,T9 |
Idle->WaitForStop |
1001 |
Not Covered |
|
StretchAcqFull->AcquireStart |
997 |
Covered |
T52,T53 |
StretchAcqFull->Idle |
995 |
Covered |
T52,T53 |
StretchAcqFull->StretchAcqSetup |
961 |
Covered |
T46,T47,T48 |
StretchAcqFull->WaitForStop |
959 |
Covered |
T63,T64,T65 |
StretchAcqSetup->AcquireAckSetup |
970 |
Covered |
T46,T47,T48 |
StretchAcqSetup->AcquireStart |
997 |
Not Covered |
|
StretchAcqSetup->Idle |
995 |
Not Covered |
|
StretchAcqSetup->WaitForStop |
1001 |
Not Covered |
|
StretchAddr->AcquireByte |
920 |
Covered |
T54,T58,T59 |
StretchAddr->AcquireStart |
997 |
Covered |
T52,T53 |
StretchAddr->Idle |
995 |
Covered |
T52,T53 |
StretchAddr->StretchTx |
920 |
Not Covered |
|
StretchAddr->WaitForStop |
913 |
Covered |
T55,T56,T57 |
StretchAddrAck->AcquireStart |
997 |
Not Covered |
|
StretchAddrAck->Idle |
995 |
Not Covered |
|
StretchAddrAck->StretchAddrAckSetup |
895 |
Not Covered |
|
StretchAddrAck->WaitForStop |
893 |
Covered |
T49,T50,T51 |
StretchAddrAckSetup->AcquireStart |
997 |
Not Covered |
|
StretchAddrAckSetup->AddrAckSetup |
904 |
Not Covered |
|
StretchAddrAckSetup->Idle |
995 |
Not Covered |
|
StretchAddrAckSetup->WaitForStop |
1001 |
Not Covered |
|
StretchTx->AcquireStart |
997 |
Covered |
T52,T53 |
StretchTx->Idle |
995 |
Covered |
T52,T53 |
StretchTx->StretchTxSetup |
936 |
Covered |
T6,T9,T10 |
StretchTx->WaitForStop |
928 |
Covered |
T60,T61,T62 |
StretchTxSetup->AcquireStart |
997 |
Covered |
T52,T53 |
StretchTxSetup->Idle |
995 |
Covered |
T52,T53 |
StretchTxSetup->TransmitSetup |
947 |
Covered |
T6,T9,T10 |
StretchTxSetup->WaitForStop |
1001 |
Not Covered |
|
TransmitAck->AcquireStart |
997 |
Covered |
T52,T53 |
TransmitAck->Idle |
995 |
Covered |
T52,T53 |
TransmitAck->TransmitAckPulse |
821 |
Covered |
T6,T8,T9 |
TransmitAck->WaitForStop |
1001 |
Not Covered |
|
TransmitAckPulse->AcquireStart |
997 |
Covered |
T52,T53 |
TransmitAckPulse->Idle |
995 |
Covered |
T52,T53 |
TransmitAckPulse->TransmitWait |
830 |
Covered |
T6,T8,T9 |
TransmitAckPulse->WaitForStop |
833 |
Covered |
T6,T8,T9 |
TransmitHold->AcquireStart |
997 |
Covered |
T52,T53 |
TransmitHold->Idle |
995 |
Covered |
T52,T53 |
TransmitHold->TransmitAck |
810 |
Covered |
T6,T8,T9 |
TransmitHold->TransmitSetup |
814 |
Covered |
T6,T8,T9 |
TransmitHold->WaitForStop |
1001 |
Not Covered |
|
TransmitPulse->AcquireStart |
997 |
Covered |
T52,T53 |
TransmitPulse->Idle |
995 |
Covered |
T52,T53 |
TransmitPulse->TransmitHold |
801 |
Covered |
T6,T8,T9 |
TransmitPulse->WaitForStop |
1001 |
Not Covered |
|
TransmitSetup->AcquireStart |
997 |
Covered |
T52,T53 |
TransmitSetup->Idle |
995 |
Covered |
T52,T53 |
TransmitSetup->TransmitPulse |
796 |
Covered |
T6,T8,T9 |
TransmitSetup->WaitForStop |
1001 |
Not Covered |
|
TransmitWait->AcquireStart |
997 |
Covered |
T52,T53 |
TransmitWait->Idle |
995 |
Covered |
T52,T53 |
TransmitWait->StretchTx |
789 |
Covered |
T6,T9,T10 |
TransmitWait->TransmitSetup |
791 |
Covered |
T6,T8,T9 |
TransmitWait->WaitForStop |
1001 |
Not Covered |
|
WaitForStop->AcquireStart |
997 |
Covered |
T6,T8,T9 |
WaitForStop->Idle |
995 |
Covered |
T8,T9,T10 |
Branch Coverage for Module :
i2c_target_fsm
| Line No. | Total | Covered | Percent |
Branches |
|
165 |
138 |
83.64 |
IF |
131 |
6 |
4 |
66.67 |
IF |
144 |
2 |
2 |
100.00 |
IF |
154 |
4 |
4 |
100.00 |
IF |
165 |
3 |
3 |
100.00 |
IF |
182 |
2 |
2 |
100.00 |
IF |
191 |
2 |
2 |
100.00 |
IF |
200 |
2 |
2 |
100.00 |
IF |
216 |
5 |
5 |
100.00 |
IF |
239 |
5 |
5 |
100.00 |
IF |
250 |
4 |
4 |
100.00 |
IF |
302 |
3 |
3 |
100.00 |
CASE |
352 |
44 |
37 |
84.09 |
IF |
623 |
5 |
4 |
80.00 |
CASE |
680 |
69 |
54 |
78.26 |
IF |
986 |
5 |
3 |
60.00 |
IF |
1007 |
2 |
2 |
100.00 |
IF |
1016 |
2 |
2 |
100.00 |
131 if (load_tcount) begin
-1-
132 unique case (tcount_sel)
-2-
133 tSetupData : tcount_d = 13'(t_r_i) + 13'(tsu_dat_i);
==>
134 tHoldData : tcount_d = 16'(thd_dat_i);
==>
135 tNoDelay : tcount_d = 16'h0001;
==>
136 default : tcount_d = 16'h0001;
==>
137 endcase
138 end else if (target_enable_i) begin
-3-
139 tcount_d = tcount_q - 1'b1;
==>
140 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
1 |
tSetupData |
- |
Covered |
T6,T9,T10 |
1 |
tHoldData |
- |
Covered |
T6,T8,T9 |
1 |
tNoDelay |
- |
Not Covered |
|
1 |
default |
- |
Not Covered |
|
0 |
- |
1 |
Covered |
T6,T8,T9 |
0 |
- |
0 |
Covered |
T1,T2,T3 |
144 if (!rst_ni) begin
-1-
145 tcount_q <= '1;
==>
146 end else begin
147 tcount_q <= tcount_d;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
154 if (!rst_ni) begin
-1-
155 stretch_active_cnt <= '0;
==>
156 end else if (actively_stretching) begin
-2-
157 stretch_active_cnt <= stretch_active_cnt + 1'b1;
==>
158 end else if (start_detect_i && target_idle_o) begin
-3-
159 stretch_active_cnt <= '0;
==>
160 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
1 |
- |
- |
Covered |
T1,T2,T3 |
0 |
1 |
- |
Covered |
T6,T9,T10 |
0 |
0 |
1 |
Covered |
T3,T4,T5 |
0 |
0 |
0 |
Covered |
T1,T2,T3 |
165 if (!rst_ni) begin
-1-
166 auto_ack_cnt_q <= '0;
==>
167 end else if (auto_ack_load_i && ack_ctrl_stretching) begin
-2-
168 // Loads are only accepted while stretching to avoid races.
169 auto_ack_cnt_q <= auto_ack_load_value_i;
==>
170 end else begin
171 auto_ack_cnt_q <= auto_ack_cnt_d;
==>
Branches:
-1- | -2- | Status | Tests |
1 |
- |
Covered |
T1,T2,T3 |
0 |
1 |
Covered |
T46,T47,T48 |
0 |
0 |
Covered |
T1,T2,T3 |
182 if (!rst_ni) begin
-1-
183 nack_transaction_q <= 1'b0;
==>
184 end else begin
185 nack_transaction_q <= nack_transaction_d;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
191 if (!rst_ni) begin
-1-
192 scl_i_q <= 1'b1;
==>
193 end else begin
194 scl_i_q <= scl_i;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
200 if (!rst_ni) begin
-1-
201 restart_det_q <= 1'b0;
==>
202 xact_for_us_q <= 1'b0;
203 xfer_for_us_q <= 1'b0;
204 end else begin
205 restart_det_q <= restart_det_d;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
216 if (!rst_ni) begin
-1-
217 bit_idx <= 4'd0;
==>
218 end else if (start_detect_i) begin
-2-
219 bit_idx <= 4'd0;
==>
220 end else if (scl_i_q && !scl_i) begin
-3-
221 // input byte clear is always asserted on a "start"
222 // condition.
223 if (input_byte_clr || bit_ack) bit_idx <= 4'd0;
-4-
==>
224 else bit_idx <= bit_idx + 1'b1;
==>
225 end else begin
226 bit_idx <= bit_idx;
==>
Branches:
-1- | -2- | -3- | -4- | Status | Tests |
1 |
- |
- |
- |
Covered |
T1,T2,T3 |
0 |
1 |
- |
- |
Covered |
T3,T4,T5 |
0 |
0 |
1 |
1 |
Covered |
T3,T4,T5 |
0 |
0 |
1 |
0 |
Covered |
T1,T2,T3 |
0 |
0 |
0 |
- |
Covered |
T1,T2,T3 |
239 if (!rst_ni) begin
-1-
240 input_byte <= 8'h00;
==>
241 end else if (input_byte_clr) begin
-2-
242 input_byte <= 8'h00;
==>
243 end else if (!scl_i_q && scl_i) begin
-3-
244 if (!bit_ack) input_byte[7:0] <= {input_byte[6:0], sda_i}; // MSB goes in first
-4-
==>
MISSING_ELSE
==>
245 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | -4- | Status | Tests |
1 |
- |
- |
- |
Covered |
T1,T2,T3 |
0 |
1 |
- |
- |
Covered |
T6,T8,T9 |
0 |
0 |
1 |
1 |
Covered |
T1,T3,T4 |
0 |
0 |
1 |
0 |
Covered |
T3,T4,T5 |
0 |
0 |
0 |
- |
Covered |
T1,T2,T3 |
250 if (!rst_ni) begin
-1-
251 host_ack <= 1'b0;
==>
252 end else if (!scl_i_q && scl_i) begin
-2-
253 if (bit_ack) host_ack <= ~sda_i;
-3-
==>
MISSING_ELSE
==>
254 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
1 |
- |
- |
Covered |
T1,T2,T3 |
0 |
1 |
1 |
Covered |
T3,T4,T5 |
0 |
1 |
0 |
Covered |
T1,T3,T4 |
0 |
0 |
- |
Covered |
T1,T2,T3 |
302 if (!rst_ni) begin
-1-
303 rw_bit_q <= '0;
==>
304 end else if (bit_ack && address_match) begin
-2-
305 rw_bit_q <= rw_bit;
==>
306 end
MISSING_ELSE
==>
Branches:
-1- | -2- | Status | Tests |
1 |
- |
Covered |
T1,T2,T3 |
0 |
1 |
Covered |
T6,T8,T9 |
0 |
0 |
Covered |
T1,T2,T3 |
352 unique case (state_q)
-1-
353 // Idle: initial state, SDA is released (high), SCL is released if the
354 // bus is idle. Otherwise, if no STOP condition has been sent yet,
355 // continue pulling SCL low in host mode.
356 Idle : begin
357 sda_d = 1'b1;
==>
358 scl_d = 1'b1;
359 restart_det_d = 1'b0;
360 xact_for_us_d = 1'b0;
361 xfer_for_us_d = 1'b0;
362 nack_transaction_d = 1'b0;
363 end
364
365 /////////////////
366 // TARGET MODE //
367 /////////////////
368
369 // AcquireStart: hold for the end of the start condition
370 AcquireStart : begin
371 target_idle_o = 1'b0;
==>
372 xfer_for_us_d = 1'b0;
373 auto_ack_cnt_d = '0;
374 end
375 // AddrRead: read and compare target address
376 AddrRead : begin
377 target_idle_o = 1'b0;
378 rw_bit = input_byte[0];
379
380 if (bit_ack) begin
-2-
381 if (address_match) begin
-3-
382 xact_for_us_d = 1'b1;
==>
383 xfer_for_us_d = 1'b1;
384 end
MISSING_ELSE
==>
385 end
MISSING_ELSE
==>
386 end
387 // AddrAckWait: pause for hold time before acknowledging
388 AddrAckWait : begin
389 target_idle_o = 1'b0;
390
391 if (scl_i) begin
-4-
392 // The controller is going too fast. Abandon the transaction.
393 // Nothing gets recorded for this case.
394 nack_transaction_d = 1'b1;
==>
395 end
MISSING_ELSE
==>
396 end
397 // AddrAckSetup: target pulls SDA low while SCL is low
398 AddrAckSetup : begin
399 target_idle_o = 1'b0;
==>
400 sda_d = 1'b0;
401 transmitting_o = 1'b1;
402 end
403 // AddrAckPulse: target pulls SDA low while SCL is released
404 AddrAckPulse : begin
405 target_idle_o = 1'b0;
==>
406 sda_d = 1'b0;
407 transmitting_o = 1'b1;
408 end
409 // AddrAckHold: target pulls SDA low while SCL is pulled low
410 AddrAckHold : begin
411 target_idle_o = 1'b0;
412 sda_d = 1'b0;
413 transmitting_o = 1'b1;
414
415 // Upon transition to next state, populate the acquisition fifo
416 if (tcount_q == 20'd1) begin
-5-
417 if (nack_transaction_q) begin
-6-
==>
418 // No need to record anything here. We already recorded the first
419 // NACK'd byte in a stretch state or abandoned the transaction in
420 // AddrAckWait.
421 end else if (!stretch_addr) begin
-7-
422 // Only write to fifo if stretching conditions are not met
423 acq_fifo_wvalid_o = 1'b1;
==>
424 event_read_cmd_received_o = rw_bit_q;
425 end
MISSING_ELSE
==>
426
427 if (restart_det_q) begin
-8-
428 acq_fifo_wdata_o = {AcqRestart, input_byte};
==>
429 end else begin
430 acq_fifo_wdata_o = {AcqStart, input_byte};
==>
431 end
432 end
MISSING_ELSE
==>
433 end
434 // TransmitWait: Check if data is available prior to transmit
435 TransmitWait : begin
436 target_idle_o = 1'b0;
==>
437 end
438 // TransmitSetup: target shifts indexed bit onto SDA while SCL is low
439 TransmitSetup : begin
440 target_idle_o = 1'b0;
==>
441 sda_d = tx_fifo_rdata[3'(bit_idx)];
442 transmitting_o = 1'b1;
443 end
444 // TransmitPulse: target holds indexed bit onto SDA while SCL is released
445 TransmitPulse : begin
446 target_idle_o = 1'b0;
==>
447
448 // Hold value
449 sda_d = sda_q;
450 transmitting_o = 1'b1;
451 end
452 // TransmitHold: target holds indexed bit onto SDA while SCL is pulled low, for the hold time
453 TransmitHold : begin
454 target_idle_o = 1'b0;
==>
455
456 // Hold value
457 sda_d = sda_q;
458 transmitting_o = 1'b1;
459 end
460 // TransmitAck: target waits for host to ACK transmission
461 TransmitAck : begin
462 target_idle_o = 1'b0;
==>
463 end
464 TransmitAckPulse : begin
465 target_idle_o = 1'b0;
466 if (!scl_i) begin
-9-
467 // Pop Fifo regardless of ack/nack
468 tx_fifo_rready_o = 1'b1;
==>
469 end
MISSING_ELSE
==>
470 end
471 // WaitForStop just waiting for host to trigger a stop after nack
472 WaitForStop : begin
473 target_idle_o = 1'b0;
==>
474 expect_stop = 1'b1;
475 sda_d = 1'b1;
476 end
477 // AcquireByte: target acquires a byte
478 AcquireByte : begin
479 target_idle_o = 1'b0;
==>
480 end
481 // AcquireAckWait: pause before acknowledging
482 AcquireAckWait : begin
483 target_idle_o = 1'b0;
484 if (scl_i) begin
-10-
485 // The controller is going too fast. Abandon the transaction.
486 // Nothing is recorded for this case.
487 nack_transaction_d = 1'b1;
==>
488 end
MISSING_ELSE
==>
489 end
490 // AcquireAckSetup: target pulls SDA low while SCL is low
491 AcquireAckSetup : begin
492 target_idle_o = 1'b0;
==>
493 sda_d = 1'b0;
494 transmitting_o = 1'b1;
495 end
496 // AcquireAckPulse: target pulls SDA low while SCL is released
497 AcquireAckPulse : begin
498 target_idle_o = 1'b0;
==>
499 sda_d = 1'b0;
500 transmitting_o = 1'b1;
501 end
502 // AcquireAckHold: target pulls SDA low while SCL is pulled low
503 AcquireAckHold : begin
504 target_idle_o = 1'b0;
505 sda_d = 1'b0;
506 transmitting_o = 1'b1;
507
508 if (tcount_q == 20'd1) begin
-11-
509 auto_ack_cnt_d = auto_ack_cnt_q - 1'b1;
==>
510 acq_fifo_wvalid_o = ~stretch_rx; // assert that acq_fifo has space
511 acq_fifo_wdata_o = {AcqData, input_byte}; // transfer data to acq_fifo
512 end
MISSING_ELSE
==>
513 end
514 // StretchAddrAck: target stretches the clock if matching address cannot be
515 // deposited yet. (During ACK phase)
516 StretchAddrAck : begin
517 target_idle_o = 1'b0;
518 scl_d = 1'b0;
519 actively_stretching = stretch_addr;
520
521 if (nack_timeout) begin
-12-
522 nack_transaction_d = 1'b1;
==>
523 // Record NACK'd Start bytes as long as there is space.
524 // The next state is always WaitForStop, so the ACQ FIFO needs to be
525 // written here.
526 acq_fifo_wvalid_o = !acq_fifo_full_or_last_space;
527 acq_fifo_wdata_o = {AcqNackStart, input_byte};
528 end
MISSING_ELSE
==>
529 end
530 // StretchAddrAckSetup: target pulls SDA low while pulling SCL low for
531 // setup time. This is to prepare the setup time after a stretch.
532 StretchAddrAckSetup : begin
533 target_idle_o = 1'b0;
==>
534 sda_d = 1'b0;
535 scl_d = 1'b0;
536 transmitting_o = 1'b1;
537 end
538 // StretchAddr: target stretches the clock if matching address cannot be
539 // deposited yet.
540 StretchAddr : begin
541 target_idle_o = 1'b0;
542 scl_d = 1'b0;
543 actively_stretching = stretch_addr;
544
545 if (nack_timeout) begin
-13-
546 nack_transaction_d = 1'b1;
==>
547 // Record NACK'd Start bytes as long as there is space.
548 // The next state is always WaitForStop, so the ACQ FIFO needs to be
549 // written here.
550 acq_fifo_wvalid_o = !acq_fifo_full_or_last_space;
551 acq_fifo_wdata_o = {AcqNackStart, input_byte};
552 end else if (!stretch_addr) begin
-14-
553 acq_fifo_wvalid_o = 1'b1;
554 if (restart_det_q) begin
-15-
555 acq_fifo_wdata_o = {AcqRestart, input_byte};
==>
556 end else begin
557 acq_fifo_wdata_o = {AcqStart, input_byte};
==>
558 end
559 end
MISSING_ELSE
==>
560 end
561 // StretchTx: target stretches the clock when tx_fifo is empty
562 StretchTx : begin
563 target_idle_o = 1'b0;
564 scl_d = 1'b0;
565 actively_stretching = stretch_tx;
566
567 if (nack_timeout) begin
-16-
568 // Only the NackStop will get recorded (later) to provide ACQ FIFO
569 // history of the failed transaction. Meanwhile, the NACK timeout
570 // will still get reported.
571 nack_transaction_d = 1'b1;
==>
572 end
MISSING_ELSE
==>
573 end
574 // StretchTxSetup: drive the return data
575 StretchTxSetup : begin
576 target_idle_o = 1'b0;
==>
577 scl_d = 1'b0;
578 sda_d = tx_fifo_rdata[3'(bit_idx)];
579 transmitting_o = 1'b1;
580 end
581 // StretchAcqFull: target stretches the clock when acq_fifo is full
582 StretchAcqFull : begin
583 target_idle_o = 1'b0;
584 scl_d = 1'b0;
585 ack_ctrl_stretching = !can_auto_ack;
586 actively_stretching = stretch_rx;
587
588
589 if (nack_timeout || (sw_nack_i && !can_auto_ack)) begin
-17-
590 nack_transaction_d = 1'b1;
==>
591 acq_fifo_wvalid_o = !acq_fifo_full_or_last_space;
592 acq_fifo_wdata_o = {AcqNack, input_byte};
593 end
MISSING_ELSE
==>
594 end
595 // StretchAcqSetup: Drive the ACK and wait for tSetupData before
596 // releasing SCL
597 StretchAcqSetup : begin
598 target_idle_o = 1'b0;
==>
599 scl_d = 1'b0;
600 sda_d = 1'b0;
601 transmitting_o = 1'b1;
602 end
603 // default
604 default : begin
605 target_idle_o = 1'b1;
==>
Branches:
-1- | -2- | -3- | -4- | -5- | -6- | -7- | -8- | -9- | -10- | -11- | -12- | -13- | -14- | -15- | -16- | -17- | Status | Tests |
Idle |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T1,T2,T3 |
AcquireStart |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrRead |
1 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrRead |
1 |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T47,T66,T67 |
AddrRead |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrAckWait |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
AddrAckWait |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrAckSetup |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrAckPulse |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrAckHold |
- |
- |
- |
1 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
AddrAckHold |
- |
- |
- |
1 |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrAckHold |
- |
- |
- |
1 |
0 |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T52,T53,T54 |
AddrAckHold |
- |
- |
- |
1 |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrAckHold |
- |
- |
- |
1 |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrAckHold |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
TransmitWait |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
TransmitSetup |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
TransmitPulse |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
TransmitHold |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
TransmitAck |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
TransmitAckPulse |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
TransmitAckPulse |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
WaitForStop |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AcquireByte |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AcquireAckWait |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
AcquireAckWait |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AcquireAckSetup |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AcquireAckPulse |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AcquireAckHold |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AcquireAckHold |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
Not Covered |
|
StretchAddrAck |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
Covered |
T49,T50,T51 |
StretchAddrAck |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
Covered |
T49,T50,T51 |
StretchAddrAckSetup |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
StretchAddr |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
Covered |
T55,T56,T57 |
StretchAddr |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
1 |
1 |
- |
- |
Covered |
T54,T58,T59 |
StretchAddr |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
1 |
0 |
- |
- |
Covered |
T54,T58,T59 |
StretchAddr |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
0 |
- |
- |
- |
Covered |
T52,T53,T54 |
StretchTx |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
Covered |
T60,T61,T62 |
StretchTx |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
Covered |
T6,T9,T10 |
StretchTxSetup |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T9,T10 |
StretchAcqFull |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
Covered |
T63,T64,T65 |
StretchAcqFull |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
Covered |
T52,T46,T47 |
StretchAcqSetup |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T46,T47,T48 |
default |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
623 if (target_enable_i && (stop_detect_i || bus_timeout_i)) begin
-1-
624 event_cmd_complete_o = xfer_for_us_q;
625 event_tx_bus_timeout_o = bus_timeout_i && rw_bit_q;
626 // Note that we assume the ACQ FIFO can accept a new item and will
627 // receive the arbiter grant without delay. No other FIFOs should have
628 // activity during a Start or Stop symbol.
629 // TODO: Add an assertion.
630 acq_fifo_wvalid_o = xact_for_us_q;
631 if (nack_transaction_q || bus_timeout_i) begin
-2-
632 acq_fifo_wdata_o = {AcqNackStop, input_byte};
==>
633 end else begin
634 acq_fifo_wdata_o = {AcqStop, input_byte};
==>
635 end
636 end else if (target_enable_i && start_detect_i) begin
-3-
637 restart_det_d = !target_idle_o;
==>
638 event_cmd_complete_o = xfer_for_us_q;
639 end else if (arbitration_lost_i) begin
-4-
640 nack_transaction_d = 1'b1;
==>
641 event_cmd_complete_o = xfer_for_us_q;
642 event_tx_arbitration_lost_o = rw_bit_q;
643 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | -4- | Status | Tests |
1 |
1 |
- |
- |
Covered |
T63,T64,T65 |
1 |
0 |
- |
- |
Covered |
T6,T8,T9 |
0 |
- |
1 |
- |
Covered |
T6,T8,T9 |
0 |
- |
0 |
1 |
Not Covered |
|
0 |
- |
0 |
0 |
Covered |
T1,T2,T3 |
680 unique case (state_q)
-1-
681 // Idle: initial state, SDA and SCL are released (high)
682 Idle : begin
==>
683 // The bus is idle. Waiting for a Start.
684 end
685
686 /////////////////
687 // TARGET MODE //
688 /////////////////
689
690 // AcquireStart: hold for the end of the start condition
691 AcquireStart : begin
692 if (!scl_i) begin
-2-
693 state_d = AddrRead;
==>
694 input_byte_clr = 1'b1;
695 end
MISSING_ELSE
==>
696 end
697 // AddrRead: read and compare target address
698 AddrRead : begin
699 // bit_ack goes high the cycle after scl_i goes low, after the 8th bit
700 // was captured.
701 if (bit_ack) begin
-3-
702 if (address_match) begin
-4-
703 state_d = AddrAckWait;
==>
704 // Wait for hold time to avoid interfering with the controller.
705 load_tcount = 1'b1;
706 tcount_sel = tHoldData;
707 end else begin // !address_match
708 // This means this transfer is not meant for us.
709 state_d = WaitForStop;
==>
710 end
711 end
MISSING_ELSE
==>
712 end
713 // AddrAckWait: pause for hold time before acknowledging
714 AddrAckWait : begin
715 if (scl_i) begin
-5-
716 // The controller is going too fast. Abandon the transaction.
717 state_d = WaitForStop;
==>
718 end else if (tcount_q == 20'd1) begin
-6-
719 if (!nack_addr_after_timeout_i) begin
-7-
720 // Always ACK addresses in this mode.
721 state_d = AddrAckSetup;
==>
722 end else begin
723 if (nack_transaction_q) begin
-8-
724 // We must have stretched before, and software has been notified
725 // through an ACQ FIFO full event. For writes we should NACK all
726 // bytes in the transfer unconditionally. For reads, we NACK
727 // the address byte, then release SDA for the rest of the
728 // transfer.
729 // Essentially, we're waiting for the end of the transaction.
730 state_d = WaitForStop;
==>
731 end else if (stretch_addr) begin
-9-
732 // Not enough bytes to capture the Start/address byte, but might
733 // need to NACK.
734 state_d = StretchAddrAck;
==>
735 end else begin
736 // The transaction hasn't already been NACK'd, and there is
737 // room in the ACQ FIFO. Proceed.
738 state_d = AddrAckSetup;
==>
739 end
740 end
741 end
MISSING_ELSE
==>
742 end
743 // AddrAckSetup: target pulls SDA low while SCL is low
744 AddrAckSetup : begin
745 if (scl_i) state_d = AddrAckPulse;
-10-
==>
MISSING_ELSE
==>
746 end
747 // AddrAckPulse: target pulls SDA low while SCL is released
748 AddrAckPulse : begin
749 if (!scl_i) begin
-11-
750 state_d = AddrAckHold;
==>
751 load_tcount = 1'b1;
752 tcount_sel = tHoldData;
753 end
MISSING_ELSE
==>
754 end
755 // AddrAckHold: target pulls SDA low while SCL is pulled low
756 AddrAckHold : begin
757 if (tcount_q == 20'd1) begin
-12-
758 // Stretch when requested by software or when there is insufficient
759 // space to hold the start / address format byte.
760 // If there is sufficient space, the format byte is written into the acquisition fifo.
761 // Don't stretch when we are unconditionally nacking the next byte
762 // anyways.
763 if (nack_transaction_q) begin
-13-
764 // If the Target is set to NACK already, release SDA and wait
765 // for a Stop. This isn't an ideal response for SMBus reads, since
766 // 127 bytes of 0xff will just happen to have a correct PEC. It's
767 // best for software to ensure there is always space in the ACQ
768 // FIFO.
769 state_d = WaitForStop;
==>
770 end else if (stretch_addr) begin // !nack_transaction_q
-14-
771 // Stretching because there is insufficient space to hold the
772 // start / address format byte.
773 // We should only reach here with !nack_addr_after_timeout_i, since
774 // we had enough space for nack_addr_after_timeout_i already,
775 // before issuing the ACK.
776 state_d = StretchAddr;
==>
777 end else if (rw_bit_q) begin
-15-
778 // Not NACKing automatically, not stretching, and it's a read.
779 state_d = TransmitWait;
==>
780 end else begin
781 // Not NACKing automatically, not stretching, and it's a write.
782 state_d = AcquireByte;
==>
783 end
784 end
MISSING_ELSE
==>
785 end
786 // TransmitWait: Evaluate whether there are entries to send first
787 TransmitWait : begin
788 if (stretch_tx) begin
-16-
789 state_d = StretchTx;
==>
790 end else begin
791 state_d = TransmitSetup;
==>
792 end
793 end
794 // TransmitSetup: target shifts indexed bit onto SDA while SCL is low
795 TransmitSetup : begin
796 if (scl_i) state_d = TransmitPulse;
-17-
==>
MISSING_ELSE
==>
797 end
798 // TransmitPulse: target shifts indexed bit onto SDA while SCL is released
799 TransmitPulse : begin
800 if (!scl_i) begin
-18-
801 state_d = TransmitHold;
==>
802 load_tcount = 1'b1;
803 tcount_sel = tHoldData;
804 end
MISSING_ELSE
==>
805 end
806 // TransmitHold: target shifts indexed bit onto SDA while SCL is pulled low
807 TransmitHold : begin
808 if (tcount_q == 20'd1) begin
-19-
809 if (bit_ack) begin
-20-
810 state_d = TransmitAck;
==>
811 end else begin
812 load_tcount = 1'b1;
==>
813 tcount_sel = tHoldData;
814 state_d = TransmitSetup;
815 end
816 end
MISSING_ELSE
==>
817 end
818 // Wait for clock to become positive.
819 TransmitAck : begin
820 if (scl_i) begin
-21-
821 state_d = TransmitAckPulse;
==>
822 end
MISSING_ELSE
==>
823 end
824 // TransmitAckPulse: target waits for host to ACK transmission
825 // If a nak is received, that means a stop is incoming.
826 TransmitAckPulse : begin
827 if (!scl_i) begin
-22-
828 // If host acknowledged, that means we must continue
829 if (host_ack) begin
-23-
830 state_d = TransmitWait;
==>
831 end else begin
832 // If host nak'd then the transaction is about to terminate, go to a wait state
833 state_d = WaitForStop;
==>
834 end
835 end
MISSING_ELSE
==>
836 end
837 // An inert state just waiting for host to issue a stop
838 // Cannot cycle back to idle directly as other events depend on the system being
839 // non-idle.
840 WaitForStop : begin
841 state_d = WaitForStop;
==>
842 end
843 // AcquireByte: target acquires a byte
844 AcquireByte : begin
845 if (bit_ack) begin
-24-
846 state_d = AcquireAckWait;
==>
847 load_tcount = 1'b1;
848 tcount_sel = tHoldData;
849 end
MISSING_ELSE
==>
850 end
851 // AcquireAckWait: pause for hold time before acknowledging
852 AcquireAckWait : begin
853 if (scl_i) begin
-25-
854 // The controller is going too fast. Abandon the transaction.
855 state_d = WaitForStop;
==>
856 end else if (tcount_q == 20'd1) begin
-26-
857 if (nack_transaction_q) begin
-27-
858 state_d = WaitForStop;
==>
859 end else if (stretch_rx) begin
-28-
860 // If there is no space for the current entry, stretch clocks and
861 // wait for software to make space. Also stretch if ACK Control
862 // Mode is enabled and the auto_ack_cnt is exhausted.
863 state_d = StretchAcqFull;
==>
864 end else begin
865 state_d = AcquireAckSetup;
==>
866 end
867 end
MISSING_ELSE
==>
868 end
869 // AcquireAckSetup: target pulls SDA low while SCL is low
870 AcquireAckSetup : begin
871 if (scl_i) state_d = AcquireAckPulse;
-29-
==>
MISSING_ELSE
==>
872 end
873 // AcquireAckPulse: target pulls SDA low while SCL is released
874 AcquireAckPulse : begin
875 if (!scl_i) begin
-30-
876 state_d = AcquireAckHold;
==>
877 load_tcount = 1'b1;
878 tcount_sel = tHoldData;
879 end
MISSING_ELSE
==>
880 end
881 // AcquireAckHold: target pulls SDA low while SCL is pulled low
882 AcquireAckHold : begin
883 if (tcount_q == 20'd1) begin
-31-
884 state_d = AcquireByte;
==>
885 end
MISSING_ELSE
==>
886 end
887 // StretchAddrAck: The address phase can not yet be completed, stretch
888 // clock and wait.
889 StretchAddrAck : begin
890 // When there is space in the FIFO go to the next state.
891 // If we hit our nack timeout, we must nack the full transaction.
892 if (nack_timeout) begin
-32-
893 state_d = WaitForStop;
==>
894 end else if (!stretch_addr) begin
-33-
895 state_d = StretchAddrAckSetup;
==>
896 load_tcount = 1'b1;
897 tcount_sel = tSetupData;
898 end
MISSING_ELSE
==>
899 end
900 // StretchAddrAckSetup: target pulls SDA low while pulling SCL low for
901 // setup time. This is to prepare the setup time after a stretch.
902 StretchAddrAckSetup : begin
903 if (tcount_q == 20'd1) begin
-34-
904 state_d = AddrAckSetup;
==>
905 end
MISSING_ELSE
==>
906 end
907 // StretchAddr: The address phase can not yet be completed, stretch
908 // clock and wait.
909 StretchAddr : begin
910 // When there is space in the FIFO go to the next state.
911 // If we hit our nack timeout, we must nack the full transaction.
912 if (nack_timeout) begin
-35-
913 state_d = WaitForStop;
==>
914 end else if (!stretch_addr) begin
-36-
915 // When transmitting after an address stretch, we need to assume
916 // that it looks like a Tx stretch. This is because if we try
917 // to follow the normal path, the logic will release the clock
918 // too early relative to driving the data. This will cause a
919 // setup violation. This is the same case to needing StretchTxSetup.
920 state_d = rw_bit_q ? StretchTx : AcquireByte;
-37-
==>
==>
921 end
MISSING_ELSE
==>
922 end
923 // StretchTx: target stretches the clock when tx conditions are not satisfied.
924 StretchTx : begin
925 // When in stretch state, always notify software that help is required.
926 event_tx_stretch_o = 1'b1;
927 if (nack_timeout) begin
-38-
928 state_d = WaitForStop;
==>
929 end else if (!stretch_tx) begin
-39-
930 // When data becomes available, we must first drive it onto the line
931 // for at least the "setup" period. If we do not, once the clock is released, the
932 // pull-up in the system will likely immediately trigger a rising clock
933 // edge (since the stretch likely pushed us way beyond the original intended
934 // rise). If we do not artificially create the setup period here, it will
935 // likely create a timing violation.
936 state_d = StretchTxSetup;
==>
937 load_tcount = 1'b1;
938 tcount_sel = tSetupData;
939
940 // When leaving stretch state, de-assert software notification
941 event_tx_stretch_o = 1'b0;
942 end
MISSING_ELSE
==>
943 end
944 // StretchTxSetup: Wait for tSetupData before going to transmit
945 StretchTxSetup : begin
946 if (tcount_q == 20'd1) begin
-40-
947 state_d = TransmitSetup;
==>
948 end
MISSING_ELSE
==>
949 end
950 // StretchAcqFull: target stretches the clock when acq_fifo is full
951 // When space becomes available, move on to prepare to ACK. If we hit
952 // our NACK timeout we must continue and unconditionally NACK the next
953 // one.
954 // If ACK Control Mode is enabled, also stretch if the Auto ACK counter
955 // is exhausted. If the conditions for an ACK Control stretch are
956 // present, NACK the transaction if directed by SW.
957 StretchAcqFull : begin
958 if (nack_timeout || (sw_nack_i && !can_auto_ack)) begin
-41-
959 state_d = WaitForStop;
==>
960 end else if (~stretch_rx) begin
-42-
961 state_d = StretchAcqSetup;
==>
962 load_tcount = 1'b1;
963 tcount_sel = tSetupData;
964 end
MISSING_ELSE
==>
965 end
966 // StretchAcqSetup: Drive the ACK and wait for tSetupData before
967 // releasing SCL
968 StretchAcqSetup : begin
969 if (tcount_q == 20'd1) begin
-43-
970 state_d = AcquireAckSetup;
==>
971 end
MISSING_ELSE
==>
972 end
973 // default
974 default : begin
975 state_d = Idle;
==>
Branches:
-1- | -2- | -3- | -4- | -5- | -6- | -7- | -8- | -9- | -10- | -11- | -12- | -13- | -14- | -15- | -16- | -17- | -18- | -19- | -20- | -21- | -22- | -23- | -24- | -25- | -26- | -27- | -28- | -29- | -30- | -31- | -32- | -33- | -34- | -35- | -36- | -37- | -38- | -39- | -40- | -41- | -42- | -43- | Status | Tests |
Idle |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T1,T2,T3 |
AcquireStart |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AcquireStart |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrRead |
- |
1 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrRead |
- |
1 |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T47,T66,T67 |
AddrRead |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrAckWait |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
AddrAckWait |
- |
- |
- |
0 |
1 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrAckWait |
- |
- |
- |
0 |
1 |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
AddrAckWait |
- |
- |
- |
0 |
1 |
0 |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T49,T50,T51 |
AddrAckWait |
- |
- |
- |
0 |
1 |
0 |
0 |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T64,T65,T68 |
AddrAckWait |
- |
- |
- |
0 |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
AddrAckSetup |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrAckSetup |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrAckPulse |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrAckPulse |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrAckHold |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
AddrAckHold |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T52,T53,T54 |
AddrAckHold |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
0 |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrAckHold |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
0 |
0 |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AddrAckHold |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
TransmitWait |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T9,T10 |
TransmitWait |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
TransmitSetup |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
TransmitSetup |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
TransmitPulse |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
TransmitPulse |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
TransmitHold |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
TransmitHold |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
TransmitHold |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
TransmitAck |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
TransmitAck |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
TransmitAckPulse |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
TransmitAckPulse |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
TransmitAckPulse |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
WaitForStop |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AcquireByte |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AcquireByte |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AcquireAckWait |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
AcquireAckWait |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
1 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
AcquireAckWait |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
1 |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T52,T46,T47 |
AcquireAckWait |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
1 |
0 |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AcquireAckWait |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
AcquireAckSetup |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AcquireAckSetup |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AcquireAckPulse |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AcquireAckPulse |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AcquireAckHold |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T6,T8,T9 |
AcquireAckHold |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
StretchAddrAck |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T49,T50,T51 |
StretchAddrAck |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
StretchAddrAck |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T49,T50,T51 |
StretchAddrAckSetup |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
StretchAddrAckSetup |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
StretchAddr |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
- |
- |
- |
Covered |
T55,T56,T57 |
StretchAddr |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
1 |
1 |
- |
- |
- |
- |
- |
- |
Not Covered |
|
StretchAddr |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
1 |
0 |
- |
- |
- |
- |
- |
- |
Covered |
T54,T58,T59 |
StretchAddr |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
0 |
- |
- |
- |
- |
- |
- |
- |
Covered |
T52,T53,T54 |
StretchTx |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
- |
- |
Covered |
T60,T61,T62 |
StretchTx |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
1 |
- |
- |
- |
- |
Covered |
T6,T9,T10 |
StretchTx |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
0 |
- |
- |
- |
- |
Covered |
T6,T9,T10 |
StretchTxSetup |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
- |
Covered |
T6,T9,T10 |
StretchTxSetup |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
- |
- |
- |
Covered |
T6,T9,T10 |
StretchAcqFull |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
- |
- |
Covered |
T63,T64,T65 |
StretchAcqFull |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
1 |
- |
Covered |
T46,T47,T48 |
StretchAcqFull |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
0 |
- |
Covered |
T52,T46,T47 |
StretchAcqSetup |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
1 |
Covered |
T46,T47,T48 |
StretchAcqSetup |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
0 |
Covered |
T46,T47,T48 |
default |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
986 if (!target_idle && !target_enable_i) begin
-1-
987 // If the target function is currently not idle but target_enable is suddenly dropped,
988 // (maybe because the host locked up and we want to cycle back to an initial state),
989 // transition immediately.
990 // The same treatment is not given to the host mode because it already attempts to
991 // gracefully terminate. If the host cannot gracefully terminate for whatever reason,
992 // (the other side is holding SCL low), we may need to forcefully reset the module.
993 // ICEBOX(#18004): It may be worth having a force stop condition to force the host back to
994 // Idle in case graceful termination is not possible.
995 state_d = Idle;
==>
996 end else if (target_enable_i && start_detect_i) begin
-2-
997 state_d = AcquireStart;
==>
998 end else if (stop_detect_i || bus_timeout_i) begin
-3-
999 state_d = Idle;
==>
1000 end else if (arbitration_lost_i) begin
-4-
1001 state_d = WaitForStop;
==>
1002 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | -4- | Status | Tests |
1 |
- |
- |
- |
Not Covered |
|
0 |
1 |
- |
- |
Covered |
T6,T8,T9 |
0 |
0 |
1 |
- |
Covered |
T1,T3,T4 |
0 |
0 |
0 |
1 |
Not Covered |
|
0 |
0 |
0 |
0 |
Covered |
T1,T2,T3 |
1007 if (!rst_ni) begin
-1-
1008 state_q <= Idle;
==>
1009 end else begin
1010 state_q <= state_d;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
1016 if (!rst_ni) begin
-1-
1017 sda_q <= 1'b1;
==>
1018 end else begin
1019 sda_q <= sda_d;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
Assert Coverage for Module :
i2c_target_fsm
Assertion Details
AcqDepthRdCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
395654396 |
976811 |
0 |
0 |
T6 |
85755 |
487 |
0 |
0 |
T7 |
31367 |
0 |
0 |
0 |
T8 |
55475 |
1373 |
0 |
0 |
T9 |
17866 |
530 |
0 |
0 |
T10 |
69016 |
175 |
0 |
0 |
T14 |
67187 |
0 |
0 |
0 |
T44 |
18417 |
97 |
0 |
0 |
T45 |
32437 |
516 |
0 |
0 |
T52 |
0 |
664 |
0 |
0 |
T71 |
45072 |
916 |
0 |
0 |
T72 |
32345 |
321 |
0 |
0 |
T73 |
0 |
2954 |
0 |
0 |
AcqFifoDeepEnough_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
395654396 |
395475259 |
0 |
0 |
T1 |
1895 |
1832 |
0 |
0 |
T2 |
11328 |
11268 |
0 |
0 |
T3 |
17801 |
17750 |
0 |
0 |
T4 |
18863 |
18779 |
0 |
0 |
T5 |
36112 |
36014 |
0 |
0 |
T6 |
85755 |
85689 |
0 |
0 |
T7 |
31367 |
30520 |
0 |
0 |
T8 |
55475 |
55418 |
0 |
0 |
T9 |
17866 |
17775 |
0 |
0 |
T10 |
69016 |
68964 |
0 |
0 |
SclOutputGlitch_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
395654396 |
61395 |
0 |
0 |
T6 |
85755 |
3 |
0 |
0 |
T7 |
31367 |
0 |
0 |
0 |
T8 |
55475 |
0 |
0 |
0 |
T9 |
17866 |
7 |
0 |
0 |
T10 |
69016 |
8 |
0 |
0 |
T14 |
67187 |
0 |
0 |
0 |
T44 |
18417 |
1 |
0 |
0 |
T45 |
32437 |
10 |
0 |
0 |
T46 |
0 |
88 |
0 |
0 |
T52 |
0 |
8 |
0 |
0 |
T71 |
45072 |
19 |
0 |
0 |
T72 |
32345 |
62 |
0 |
0 |
T73 |
0 |
3 |
0 |
0 |