For a while I have been annoyed that UVM is inconsistent in the way responses are passed back through the sequencer, but maybe I am missing something obvious?
Let me try to explain my problem
I have highly pipelined agent - where the driver must drive transactions back to back - without waiting for response data.
but when that data comes it must be passed back to the sequence that initiated the transaction.
un fortunately the responses come out of order!
A way of doing this, is by using the get_response()
in the sequence.
unfortunately the monitor does not have access to the response FIFO in the sequencer, so the put()
must be called from the driver.
and this is where I find that UVM is inconsistent at best.
The UVM methodology has a clear boundary between driver and monitor tasks.
the driver drives transactions on the pins,
the monitor convert from pin wiggles into transactions.
the monitor also passes the transactions on to a scoreboard and any other subscriber that needs the info - except the sequence!
that has to come from the driver.
so now I am forced to make the driver a subscriber of my monitor to be able to pass it to the correct sequence.
I want to note here that I have N sequences that starts items on my sequencer in parallel!
is there a better way of doing this?
if UVM where to be consistent - there should be a build in tlm port in the driver - where the monitor could get the items and then the monitor would do the response matching and the put to the sequence response fifo!