Tuesday, December 17, 2013

how the sequence is run on sequencer

Nothing new in this post but just wanted to put together what i was going through yday about the sequences/sequencers and how they are started:

so we will have a sequence written something like

class random_seq extends uvm_sequence;
  `uvm_object_utils(random_seq)
::::
::::
endclass:random_seq

and in the test we will start the sequence by using uvm_config_db set method, something like:

configuration by type:
uvm_config_db#(uvm_object_wrapper)::set(this, "m_tb.m_agent.m_sequencer.main_phase", "default_sequence", random_seq::get_type());

or something like:

Configuration by instance:
random_seq m_rand_seq_inst;
m_rand_seq_inst = new("m_rand_seq_inst");
uvm_config_db#(uvm_sequence_base)::set(this, "m_tb.m_agent.m_sequencer.main_phase", "default_sequence", m_rand_seq_inst);

above setting will call the following task from the uvm_sequencer_base class and it is called in " protected virtual function void execute" function of uvm_task_phase class.

function void uvm_sequencer_base::start_phase_sequence(uvm_phase phase);
    uvm_object_wrapper wrapper;
  .......
   seq.start(this);
  ......
endfunction

protected virtual function void execute(uvm_component comp,
                                          uvm_phase phase);

...............
    if ($cast(seqr,comp))   // Only if the component is sequencer then the start_phase_sequence is called 
                                       // otherwise its ignored. 
          seqr.start_phase_sequence(phase);
...............
endfunction

the execute function is called inside
 function void m_traverse(uvm_component comp,
                           uvm_phase phase,
                           uvm_phase_state state);

 case (state)
 ....
   UVM_PHASE_EXECUTING: begin
....
   ph.execute(comp, phase);
....
 end
 ....
 endcase

endfunction

m_tranverse is called in traverse function of uvm_task_phase

  virtual function void traverse(uvm_component comp,
                                 uvm_phase phase,
                                 uvm_phase_state state);
    phase.m_num_procs_not_yet_returned = 0;
    m_traverse(comp, phase, state);
  endfunction


which is called in uvm_phase s task

task uvm_phase::execute_phase();
......
  m_state = UVM_PHASE_STARTED;
    m_imp.traverse(top,this,UVM_PHASE_STARTED);
    #0; // LET ANY WAITERS WAKE UP
.......
endtask

and the execute+phase is called as a part of m_run_phases task of uvm_phase

 task uvm_phase::m_run_phases();
  uvm_root top = uvm_root::get();
 .....
  fork
      begin
        phase.execute_phase();
      end
    join_none
.....
endtask

this m_run_phases task is called in run_test task of uvm_root from which all the tests are run and all the components are instantiated.

task uvm_root::run_test(string test_name="");
................
 // phase runner, isolated from calling process
  fork begin
    // spawn the phase runner task
    phase_runner_proc = process::self();
    uvm_phase::m_run_phases();
  end
  join_none
...............
endtask

and the run_test with which the testcase is run

the explanation for run_test:
  // Phases all components through all registered phases. If the optional
  // test_name argument is provided, or if a command-line plusarg,
  // +UVM_TESTNAME=TEST_NAME, is found, then the specified component is created
  // just prior to phasing. The test may contain new verification components or
  // the entire testbench, in which case the test and testbench can be chosen from
  // the command line without forcing recompilation. If the global (package)
  // variable, finish_on_completion, is set, then $finish is called after
  // phasing completes.

other notes:
uvm_object --> uvm_phase --> uvm_task_phase --> all the  uvm_runtime_phases (reset_phase,configure_phase ....)

uvm_phase has the prototype for all the tasks required while executing a phase and uvm_task_phase is derived from it which has some functionality required for executing the phases (things which are common across the phases) 



1 comment:

  1. Hello everyone, do you need to verify your Instagram account, I got a help from an Instagram hacker (Worldcyberhackers@gmail.com) who helped me get verified badge on my Instagram account. He was trust worthy and reliable. You can contact him through Mail or WhatsApp: +12678773020

    ReplyDelete