Virtual Sequence and Virtual Sequencer
Virtual Sequence and Virtual Sequencer
Ram_test ENV
Read_agent
M
S D
DUT
Write_agent
M
Example
class ram_test extends uvm_test;
`uvm_component_utils(ram_test) //factory registration
read_sequence read_seqh;
write_sequence write_seqh;
function new(string name=”ram_test”,uvm_component
parent)
super.new(name,parent);
endfunction
virtual task run_phase(uvm_phase phase);
phase.raise_objection(this);
read_seqh.start(ram_envh.write_agnth.seqrh);
write_seqh.start(ram_envh.write_agnth.seqh);
phase.drop_objection(this);
endtask
Test It is developed by testcase
writer
----------------------------------------------------
Env
Agent It is developed by
Testbench Developer
Sequencer
read_seqh.start(ram_envh.write_agnth.seqrh);
write_seqh.start(ram_envh.write_agnth.seqh);
here testcase writer doesn’t know the
path of sequencer because it is developed by the testbench
developer. To avoid a path dependency we go to virtual
sequencer and virtual sequence.
Virtual Sequencer
To generate a test cases independent of testbench env.
Virtual sequencer is extended from a uvm_sequencer.
It is parametrized with uvm_sequence_item.
Virtual sequencer contain all the physical sequencers
handle.
Tb contain Virtual sequencer and Virtual Sequence
Test
Virtual Sequence Environment
Write Read
seqr seqr
virtual Sequencer
write read
seqr seqr Write agent Read agent
write read
seqr seqr
write Read
seqr seqr
write write read read
driver mon mon driver
Write Read
seq seq
DUT
Virtual Sequence
To improve Reusability.
Virtual sequence is extended from a uvm_sequence.
It is parametrized with uvm_sequence_item.
Virtual sequence contain
Sequence handle
Sequencer handle
M-sequencer
Virtual sequencer handle
Example
Virtual Sequencer
Class ram_virtual_sequencer extends uvm_sequencer
#(uvm_sequence_item);
`uvm_component_utils(ram_virtual_sequencer)
ram_wr_sequencer ram_wr_seqr_h;
ram_rd_sequencer ram_rd_seqr_h;
function new(string name="ram_virtual_sequencer",
uvm_component parent=null);
super.new(name,parent);
endfunction
endclass
virtual_sequence
random_write_seq random_wseqh;
random_read_seq random_rseqh;
task body;
super.body;
rand_wseqh=random_write_seq::type_id::create
("rand_wsegh");
rand_rseqh=random_read_seq::type_id::create
("rand_rseqh");
repeat (20)
begin
random_wseqh.start(ram_wr_sqrh);
random_rsegh.start(ram_rd_sqrh);
ram_write_agent write_agenth;
ram_read_agent read_agenth;
ram_virtual_sequencer ram_v_seqrh;
ram_v_seqrh.wr_seqrh=write_agenth.seqrh;
ram_v_seqrh.rd_seqrh= read_agenth.seqrh;
endfunction
endclass
TEST Case
`uvm_component_utils(test_ram_virtual_seq)
//UVM automation and constructor
Function new(string name=“test_ram_virtual_seq”,
uvm_component parent);
super.new(name ,parent);
endfunction
//virtual sequence handle
random_virtual_seq virtual_test_seqh;
//environment handle
ram_env envh;
function void build_phase(uvm_phase phase);
super.build_phase(phase);
virtual_test_seqh=random_virtual_seq::type_id::
create("test_seqh");
envh=ram_env::type_id::create(“envh”,this);
endfunction
task run_phase (uvm_phase phase);
phase.raise_objection(phase, "start virtual
sequence");
//here virtual_test_seqh is driven by virtual
sequencer v_seqrh
virtual_test_segh.start(envh.v_seqrh);
here using the virtual sequence and virtual sequencer the path
dependency can be avoided .