Welcome ! This website will help YOU (recent graduates/professionals) learn verification languages like SystemVerilog and UVM. Register for free and access more content !

In simple terms it's a UVM sequencer that contain handles to other sequencers. Why do we need this ? Because we plan to use virtual sequences and want to have control over all sequencers from a central place. A request type is not required here because this sequencer is generic and not limited to handle only one particular data type.

Click to refresh the concept of a virtual sequence.

virtual sequencer

The environment shown above has an APB agent, Wishbone agent, PCIE environment and a register layer environment. Each of these components have their own sequences and the respective sequencers on which they are launched. A virtual sequencer called m_virt_seqr is instantiated to hold references to each individual sequencer. Hence a virtual sequence executing on this virtual sequencer will have access to all the sequencers in the testbench.

Example

 
  class my_virtual_sequencer extends uvm_sequencer;
    `uvm_component_utils (my_virtual_sequencer)
 
    function new (string name = "my_virtual_sequencer", uvm_component parent);
      super.new (name, parent);
    endfunction
 
    // Declare handles to other sequencers here
    apb_sequencer       m_apb_seqr;
    reg_sequencer       m_reg_seqr;
    wb_sequencer        m_wb_seqr;
    pcie_sequencer      m_pcie_seqr;
  endclass
 

In our top environment, we'll create an instance of the virtual sequencer and connect real sequencers with their respective handles in the virtual sequencer.

 
  class top_env extends uvm_env;
    ...
 
    my_virtual_sequencer   m_virt_seqr;
 
    virtual function void build_phase (uvm_phase phase);
      ...
      m_virt_seqr = my_virtual_sequencer::type_id::create ("m_virt_seqr", this);
      ...
    endfunction
 
    // Connect virtual sequencer handles to actual sequencers
    virtual function void connect_phase (uvm_phase phase);
      ...
      m_virt_seqr.m_apb_seqr   = m_apb_agent.m_apb_seqr;
      m_virt_seqr.m_reg_seqr   = m_reg_env.m_reg_seqr;
      m_virt_seqr.m_pcie_seqr  = m_pcie_env.m_pcie_agent.m_pcie_seqr;
      ...
    endfunction
  endclass
 

A virtual sequencer operates best when used with a virtual sequence. Read more on Virtual Sequence.

Go to the Downloads page for example code under tag "virtual-sequencer".

Simulation Log
----------------------------------------------------------------
CDNS-UVM-1.1d 
(C) 2007-2013 Mentor Graphics Corporation
(C) 2007-2013 Cadence Design Systems, Inc.
(C) 2006-2013 Synopsys, Inc.
(C) 2011-2013 Cypress Semiconductor Corp.
----------------------------------------------------------------
UVM_INFO @ 0: reporter [RNTST] Running test base_test...
UVM_INFO @ 0: reporter [UVMTOP] UVM testbench topology:
--------------------------------------------------------------
Name                       Type                    Size  Value
--------------------------------------------------------------
uvm_test_top               base_test               -     @2667
  m_top_env                top_env                 -     @2733
    m_apb_agent            apb_agent               -     @2780
      m_apb_drv            apb_driver              -     @4089
        rsp_port           uvm_analysis_port       -     @4237
        seq_item_port      uvm_seq_item_pull_port  -     @4188
      m_apb_mon            apb_monitor             -     @4217
      m_apb_seqr           uvm_sequencer           -     @3512
        rsp_export         uvm_analysis_export     -     @3569
        seq_item_export    uvm_seq_item_pull_imp   -     @4109
        arbitration_queue  array                   0     -    
        lock_queue         array                   0     -    
        num_last_reqs      integral                32    'd1  
        num_last_rsps      integral                32    'd1  
    m_spi_agent            spi_agent               -     @2840
      m_spi_drv            spi_driver              -     @4897
        rsp_port           uvm_analysis_port       -     @5043
        seq_item_port      uvm_seq_item_pull_port  -     @4995
      m_spi_mon            spi_monitor             -     @5024
      m_spi_seqr           uvm_sequencer           -     @4321
        rsp_export         uvm_analysis_export     -     @4377
        seq_item_export    uvm_seq_item_pull_imp   -     @4917
        arbitration_queue  array                   0     -    
        lock_queue         array                   0     -    
        num_last_reqs      integral                32    'd1  
        num_last_rsps      integral                32    'd1  
    m_virt_seq             virtual_sequencer       -     @2870
      rsp_export           uvm_analysis_export     -     @2928
      seq_item_export      uvm_seq_item_pull_imp   -     @3478
      arbitration_queue    array                   0     -    
      lock_queue           array                   0     -    
      num_last_reqs        integral                32    'd1  
      num_last_rsps        integral                32    'd1  
    m_wb_agent             wb_agent                -     @2810
      m_wb_drv             wb_driver               -     @5712
        rsp_port           uvm_analysis_port       -     @5858
        seq_item_port      uvm_seq_item_pull_port  -     @5810
      m_wb_mon             wb_monitor              -     @5839
      m_wb_seqr            uvm_sequencer           -     @5136
        rsp_export         uvm_analysis_export     -     @5192
        seq_item_export    uvm_seq_item_pull_imp   -     @5732
        arbitration_queue  array                   0     -    
        lock_queue         array                   0     -    
        num_last_reqs      integral                32    'd1  
        num_last_rsps      integral                32    'd1  
--------------------------------------------------------------

UVM_INFO ./tb/my_pkg.sv(68) @ 0: uvm_test_top.m_top_env.m_virt_seq@@m_virt_seq [VSEQ] Start of virtual sequence
UVM_INFO ./tb/wb_agent.sv(63) @ 0: uvm_test_top.m_top_env.m_wb_agent.m_wb_seqr@@m_wb_reset_seq [RESET_SEQ] Starting wb_reset_seq
UVM_INFO ./tb/apb_agent.sv(52) @ 20000: uvm_test_top.m_top_env.m_apb_agent.m_apb_seqr@@m_apb_rw_seq [RW_SEQ] Starting apb_rw_seq
UVM_INFO ./tb/spi_agent.sv(74) @ 30000: uvm_test_top.m_top_env.m_spi_agent.m_spi_seqr@@m_spi_tx_seq [tx_SEQ] Starting spi_tx_seq
UVM_INFO ./tb/my_pkg.sv(75) @ 30000: uvm_test_top.m_top_env.m_virt_seq@@m_virt_seq [VSEQ] End of virtual sequence
UVM_INFO ./tb/my_pkg.sv(108) @ 30000: uvm_test_top [SHUT] Shutting down test ...

--- UVM Report catcher Summary ---


Number of demoted UVM_FATAL reports  :    0
Number of demoted UVM_ERROR reports  :    0
Number of demoted UVM_WARNING reports:    0
Number of caught UVM_FATAL reports   :    0
Number of caught UVM_ERROR reports   :    0
Number of caught UVM_WARNING reports :    0

--- UVM Report Summary ---

** Report counts by severity
UVM_INFO :    8
UVM_WARNING :    0
UVM_ERROR :    0
UVM_FATAL :    0
** Report counts by id
[RESET_SEQ]     1
[RNTST]     1
[RW_SEQ]     1
[SHUT]     1
[UVMTOP]     1
[VSEQ]     2
[tx_SEQ]     1

Was this article helpful ?

We use cookies to personalize content and ads, to provide social media features and to analyze our traffic. You consent to our cookies if you continue to use our website. To find out more about the cookies we use and how to delete them, see our privacy policy.

  I accept cookies from this site.
Agree
EU Cookie Directive plugin by www.channeldigital.co.uk