In reply to warnerrs:
That’s precisely opposite of what my last sentence says.
Sorry, I think I misread your post before.
While it’s a sidestep from the original question, I would like to ask about the sequence items, because I’m not sure I understand your rationale for using the high-level items.
The way we see it now (as new UVM users), is that having a high-level sequence item (where high-level is something that describes a full transaction, such as the uvm_reg_item) is not preferable, because it would mean that all logic to handle the bus transaction would need to be in the driver. I would say that the sequence item going into the driver should be as low-level as possible, for AXI it should maybe even be separate drivers (or even AXI-Stream agents?) per stream, where one item would be one transfer on a stream. All higher level logic would then be implemented by a layer of sequences, where a top-level sequence may be something like a burst_write. This burst_write would then be started by the RAL translation sequence which takes in uvm_reg_items. A uvm_reg_item may very well result in a burst if the register that is being accessed is wider than the bus width. The same burst_write sequence may also be started by some process that, for example, transfers a 4k image.
Because there are multiple layers of sequences that are being started, it is much easier to inject errors, for example, by re-implementing one of the intermediate sequences.
I would say that having high-level sequence items complicates things because the driver becomes much more complex. I also think it would be much harder to implement error injection and handling of out of order transactions.
Can you comment on this? We would gladly like to hear other viewpoints and considerations since we’re new to UVM as a company and still figuring out the best ways to go about things.
Thanks!