UVM Driver Communication: get_next_item()/item_done() vs get()/put() — Which is Preferred in Industry?

In UVM, which driver communication style is more commonly used in industry and why?

  1. get_next_item() + item_done()

  2. get() + put()

I created simple examples of both methods and the behavior looks almost the same from the sequence side (start_item()/finish_item() flow).

The main difference I observed is:

  • With get_next_item()/item_done(), the sequence can use wait_for_item_done().

  • With get()/put(), there seems to be no need for wait_for_item_done() because the response comes through put()get_response().

Am I understanding this correctly?

What are the practical advantages, use cases, and industry reasons for choosing one method over the other?

get_next_item()/item_done() can be only used for on-piplined protocols.

get()/put() can be used for pipelined and non-pipelined protocols.

I think you meant “non-pipelined protocols”.
Basically it means only one transfer is active at a time between the sequence ↔ driver.

Michael, of cause.

I had a great teacher :wink:

I have a doubt about the initial driver-sequence communication. Does the driver send a request to the sequencer for a sequence item, or does the driver simply wait until a sequence item becomes available in the sequencer’s request FIFO?