0
votes

I have developed an uvm driver implementing AXI protocol and it has two queues for collecting write and read transactions. As soon as the driver receives transactions from sequencer, transactions are pushed to the read queue or write queue and read and write channels drive respective transaction on each AXI channel. The driver does not wait for the write response before it issues next read or write as AXI specifies. Now, I want to change the behavior so that it waits for the write transaction to complete (write response come back) and then issue the next transaction. What would be the best place in my testbench to implement this feature -- driver, sequencer, sequence, or sequence_item?

Ideally, I wish I could do it in my sequence, because this approach won't need testbench change. Then, the question is how a sequence knows when the write response arrived? The idea of transaction level modeling (TLM) means that the sequence items are in transaction level and no need to worry about details on the handshaking.

If modifying sequence is difficult, another idea is to (reluctantly) change the driver to have a single queue with depth one for both read and write. Then, the first read or write transaction should be removed from the queue before the second one can be accepted by the driver. When is it? It is when the response from the first write arrives, then the transaction is removed from the q and next transaction can be accepted from the sequencer.

1

1 Answers

0
votes

A quick google search shows how to do response based sequences and drivers here and here. The basic gist is that you want to use the driver's get() and put() methods instead of just get_next_item() and item_done().