Professional Documents
Culture Documents
Layered Sequences
Tom Fitzpatrick
Verification Evangelist
info@verificationacademy.com | www.verificationacademy.com
Sequences & Sequencers
• Most sequences run on sequencers
• One sequencer per agent
• Env may define default sequence
Test
• Can be overridden via factory
• Test defines other sequences
Env
• Sequences generate items
• Sequencer sends to driver Sequencer
Agent
Monitor Driver
DUT
Env
Sequencer Sequencer
Driver Driver
DUT
Useful typedef 2 1
tseq
B A
class myvseq_base extends uvm_virtual_sequence;
...
a_sequencer_t a_sequencer; Env
b_sequencer_t b_sequencer; Handles for target agent2 agent1
sequencers Sqr
task body(); Drvr Drvr
...
aseq.start( a_sequencer , this );
Start sequences on target
bseq.start( b_sequencer , this ); sequencers
endtask
endclass class my_test extends uvm_test;
…
my_seq vseq = my_seq::type_id::create("vseq");
Start vseq with null
sequencer vseq.a_sequencer = env.agent1.sequencer;
vseq.b_sequencer = env.agent2.sequencer;
Assign target sequencers
vseq.start( null );
endclass
© Mentor Graphics Corporation, all rights reserved.
Virtual Sequence Initialization
class test_base extends uvm_test;
`uvm_component_utils(test_top_base) 2 1
tseq
B A
env_top m_env;
endclass: test_base
© Mentor Graphics Corporation, all rights reserved.
Virtual Sequence in a Test
class init_vseq_test extends test_base;
`uvm_component_utils(init_vseq_test) 2 1
tseq
B A
function new(string name = "init_vseq_test",
uvm_component parent = null);
super.new(name, parent); Env
endfunction agent2 agent1
Sqr
task run_phase(uvm_phase phase); Drvr Drvr
vseq_A_B vseq = vseq_A_B::type_id::create("vseq");
phase.raise_objection(this);
init_vseq(vseq);
vseq.start(null);
phase.drop_objection(this);
endtask: run_phase
endclass: init_vseq_test
fork
a.start(a_sequencer);
b.start(b_sequencer);
join
endtask: body
endclass: vseq_A_B
low
low
• Many-to-one high
low
high
endclass Sequencer
Driver
DUT
uvm_analysis_port#(L1_item) ap;
L1_monitor mon;
uvm_sequencer#(L1_item) seqr;
myXL_seq xlseq;
dut_agent d_agent;
…
function void build_phase(uvm_phase phase);
seqr = uvm_sequencer#(L1_item)::type_id::create(“L1_seqr”, this);
mon = L1_monitor::type_id::create(“L1_mon”, this);
ap = new(“ap”, this);
... L2P Agent
endfunction L1_mon Monitor
L1_seqr Sequencer
Driver
DUT
endclass
© Mentor Graphics Corporation, all rights reserved.
The Layered Agent
class L2P_layer extends uvm_subscriber #(dut_txn);
`uvm_component_utils(L2P_layer)
…
L2P_layer layer_agent;
dut_agent d_agent;
…
B2L
B2P L2P Agent
L2_mon L1_mon Monitor
L2_seqr L1_seqr Sequencer
Sqr xl Sqr xl Driver
DUT
…
dut_agent d_agent;
…
function void build_phase(uvm_phase phase);
…
d_agent = dut_agent::type_id::create(“d_agent”, this);
...
endfunction
endclass
B2D
B2P Agent
L2_mon L1_mon Monitor
L2_seqr L1_seqr Sequencer
Sqr xl Sqr xl Driver
DUT
Tom Fitzpatrick
Verification Evangelist
info@verificationacademy.com | www.verificationacademy.com