Layered Sequence
まだ理解していません。引用元:uvm_users_guide_1.1.pdf P.158
// Upper-layer classes
class upper_item extends uvm_sequence_item;
...
endclass : upper_item
class upper_sequencer extends uvm_sequencer #(upper_item);
...
endclass : upper_sequencer
// Lower-layer classes
class lower_item extends uvm_sequence_item;
...
endclass : lower_item
class lower_sequencer extends uvm_sequencer #(lower_item);
uvm_seq_item_pull_port #(upper_item) upper_seq_item_port;
...
function new (string name, uvm_component parent);
super.new(name, parent);
upper_seq_item_port = new(“upper_seq_item_port”,this);
endfunction : new
...
endclass : lower_sequencer
class lower_driver extends uvm_driver #(lower_item);
...
endclass : lower_driver
class higher_to_lower_seq extends uvm_sequence #(lower_item);
... // Constructor and UVM automation macros go here.
// See Section 4.8.2
upper_item u_item;
lower_item l_item;
virtual task body();
forever begin
`uvm_do_with(l_item,
{ ... }) // Constraints based on u_item
end
endtask : body
// In the pre_do task, pull an upper item from upper sequencer.
virtual task pre_do(bit is_item);
p_sequencer.upper_seq_item_port.get_next_item(u_item);
endtask : pre_do
// In the post_do task, signal the upper sequencer we are done.
// And, if desired, update the upper-item properties for the
// upper-sequencer to use.
virtual function void post_do(uvm_sequence_item this_item);
p_sequencer.upper_seq_item_port.item_done(this_item);
endfunction : post_do
endclass : higher_to_lower_seq