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