Hi,
My agent has a sequencer connected to a driver of some HW interface (CIO), this protocol defines several layers of which I can run.
- single transaction, read/write transactions.
- burst of single transaction, burst is marked with start/end signals.
so our sequences are built in layers.
- A sequence that run single transaction
- A sequence that run a list of single transactions, wrapped with grab/ungrab of the sequencer.
my intention is to create a bunch of read bursts, in one sequence (using virtual seqr)
and another bunch of write bursts (again, using virtual seqr) and to fork them in parallel so I’ll be able to get on the bus a mix interleaved bursts of read and writes.
What I actually get is the writes and after that the reads, no interleaved bursts.
no wait for a response from driver in any of the sequences.
// sequence #1 body, single item handling, I've omitted sequence fields
task cio_txn_seq::body();
`ovm_do(req);
endtask : body
// sequence #2 body, I've omitted sequence fields
task cio_seq::body();
cio_txn_seq txn;
cio_txn_t cio_txn_q[$];
p_sequencer.grab(this);
foreach( cio_txn_q[i] ) begin
`ovm_do_with(txn);
end
p_sequencer.ungrab(this);
endtask : body
// read bursts (virtual sequencer) body
task body();
cio_seq cio_seq;
super.body();
for (int i=0;i<m_length;i++) begin //{
`ovm_do_on_with(cio_seq, p_sequencer.pick_sequencer(m_agent_name), {
m_opcode == READ;
});
// #1ps;// I've even added a artificial delay to move to next tick
end//}
endtask : body
endclass: btrs_cio_rand_seq
// write bursts (virtual sequencer) body
task body();
cio_pkg::cio_seq cio_seq;
super.body();
for (int i=0;i<m_length;i++) begin //{
`ovm_do_on_with(cio_seq, p_sequencer.pick_sequencer(m_agent_name), {
m_opcode == WRITE;
});
// #1ps;// I've even added a artificial delay to move to next tick
end//}
endtask : body
endclass: btrs_cio_rand_seq
these 2 are forked as I mentioned.
Help is very appreciated.
Thanks,
Uriel