I went ahead and tried the pipelined driver example here, but I ran into an issue where my driver's call printed a warning indicating that the calling sequence was no longer running. The issue is that I needed to force in blocking code that would wait for all sequence items to be completed on the driver. I did this by adding a counter into the response fork. Here's the warning that fired for me: seq/uvm_sequencer_param_base.svh:341: $sformatf("Dropping response for sequence %0d, sequence not found. Probable cause: sequence exited or has been killed", Then I added a blocking wait for all responses to be received before ending the sequence. For instance: task body; int num_completed = 0; int max_num_xactions = 4; repeat (max_num_xactions) begin advdrv_xaction rq = advdrv_xaction::type_id::create("req"); start_item(rq); if (!rq.randomize()) `uvm_fatal(get_full_name(), "failed to randomize transaction") finish_item(rq); fork begin int id = rq.get_transaction_id(); `uvm_info (get_full_name(), $sformatf("Sent sequence item [transaction id=%2d]", id), UVM_LOW) rq.print(); rsp = advdrv_xaction::type_id::create("rsp"); get_response(rsp, id); // Blocks num_completed++; `uvm_info(get_full_name(), "response data sent back to sequence", UVM_LOW) rsp.print(); end join_none end wait (num_completed == max_num_xactions); //
Absolutely superb.Thank You so much for sharing such wonderful lecture.
I went ahead and tried the pipelined driver example here, but I ran into an issue where my driver's call printed a warning indicating that the calling sequence was no longer running. The issue is that I needed to force in blocking code that would wait for all sequence items to be completed on the driver. I did this by adding a counter into the response fork.
Here's the warning that fired for me:
seq/uvm_sequencer_param_base.svh:341: $sformatf("Dropping response for sequence %0d, sequence not found. Probable cause: sequence exited or has been killed",
Then I added a blocking wait for all responses to be received before ending the sequence. For instance:
task body;
int num_completed = 0;
int max_num_xactions = 4;
repeat (max_num_xactions) begin
advdrv_xaction rq = advdrv_xaction::type_id::create("req");
start_item(rq);
if (!rq.randomize()) `uvm_fatal(get_full_name(), "failed to randomize transaction")
finish_item(rq);
fork begin
int id = rq.get_transaction_id();
`uvm_info (get_full_name(), $sformatf("Sent sequence item [transaction id=%2d]", id), UVM_LOW)
rq.print();
rsp = advdrv_xaction::type_id::create("rsp");
get_response(rsp, id); // Blocks
num_completed++;
`uvm_info(get_full_name(), "response data sent back to sequence", UVM_LOW)
rsp.print();
end join_none
end
wait (num_completed == max_num_xactions);
//
17:01 - m_sequencer
Thanks John - this is great.
Hi John, is it possible to get examples shown in the presentation?
Thanks, John! This video was amazing!
The URL to the example code seems to be broken, I get a 404.
wow!!! good information
It's pretty useful!
Very informative esp @1745