Professional Documents
Culture Documents
Course Advanced Uvm Session5 The Proper Care and Feeding of Sequences Tfitzpatrick
Course Advanced Uvm Session5 The Proper Care and Feeding of Sequences Tfitzpatrick
Course Advanced Uvm Session5 The Proper Care and Feeding of Sequences Tfitzpatrick
Behavior
Structure
Testbench
VIP
DUT
Review: Sequences
Decouple stimulus specification from
structural hierarchy
Sequences define
transaction streams
u1
s1
s5
s3
s2
s4
Transaction type
Default name in
constructor
By default, RSP=REQ
endclass
class my_driver extends uvm_driver #(type REQ=req_t, RSP=rsp_t);
`uvm_component_utils(my_driver)
Parameterization must
match sequence
endclass
typedef uvm_sequencer #(type REQ=req_t, RSP=rsp_t) my_sequencer;
Dont need to declare a
new sequencer type
driver
get_next_item(req);
finish_item(req);
item_done();
task body();
task run_phase(uvm_phase phase);
req = req_t::type_id::create(req);
forever begin
for_int i = 0; i < num; i++) begin
seq_item_port.get_next_item(req);
start_item(req);
drive_item2bus(req);
if(!req.randomize()) begin
seq_item_port.item_done();
`uvm_error(body, rand failure)
end
end
endtask
finish_item(req);
`uvm_info(my_seq1,req.convert2string());
If driver updates req with
end
response information
endtask
2013 Mentor Graphics Corporation, all rights reserved.
driver
get_next_item(req);
finish_item(req);
item_done();
get_response(rsp);
task body();
req = req_t::type_id::create(req);
for_int i = 0; i < num; i++) begin
start_item(req);
if(!req.randomize()) begin
`uvm_error(body, rand failure)
end
finish_item(req);
get_response(rsp);
end
endtask
put_response(rsp);
task run_phase(uvm_phase phase);
forever begin
seq_item_port.get_next_item(req);
drive_item2bus(req,rsp);
seq_item_port.item_done();
rsp.set_id_info(req);
seq_item_port.put_response(rsp);
end
If driver provides separate
endtask
response object
2013 Mentor Graphics Corporation, all rights reserved.
finish_item(req)
get_response(rsp);
get_response(rsp,id);
endtask
s1
endclass
Both
sequences
now waiting
for responses
Sequence-specific
Sequencer
class req;
seq_id = 1;
2;
trans_id = 1;
arbitrate
requests
Driver
1,1
2,1
s2
Sequencer uses
sequence_id to route
response to
originating sequence
route
responses
rsp
rsp
1,1 = 1;
seq_id
trans_id = 1;
seq_idset_id_info()
= 1;
copies id
trans_idfields
= 1; from req to rsp
class driver;
task run();
rsp.set_id_info(req);
seq_item_port.put_response(rsp);
endtask
endclass
2013 Mentor Graphics Corporation, all rights reserved.
endfunction
endclass
SEQ_ARB_FIFO
SEQ_ARB_WEIGHTED
SEQ_ARB_RANDOM
SEQ_ARB_STRICT_FIFO
SEQ_ARB_STRICT_RANDOM
SEQ_ARB_USER
sequencer.set_arbitration(SEQ_ARB_USER);
class my_sequencer extends uvm_sequencer(REQ);
uvm_component_utils(my_sequencer)
virtual function integer user_priority_arbitration(integer avail_sequences[$]);
endfunction
endclass
Path to sequencer
Sequential Sequences
class my_test extends uvm_test;
init_seq iseq;
exec_seq eseq;
...
task run_phase(uvm_phase phase);
iseq = init_seq::type_id::create(iseq);
eseq = exec_seq::type_id::create(eseq);
phase.raise_objection(this);
iseq.start( my_env_h.my_agent_h.my_sequencer_h );
eseq.start( my_env_h.my_agent_h.my_sequencer_h );
phase.drop_objection(this);
endtask
endclass
init_seq
exec_seq
start() is blocking
Parallel Sequences
class my_test extends uvm_test;
init_seq iseq;
exec_seq
exec_seq eseq;
...
task run_phase(uvm_phase phase);
iseq = init_seq::type_id::create(iseq);
eseq = exec_seq::type_id::create(eseq);
phase.raise_objection(this);
fork
iseq.start( my_env_h.my_agent_h.my_sequencer_h );
eseq.start( my_env.h.my_agent_h.my_sequencer_h );
join
Dont use fork-join_none
phase.drop_objection(this);
endtask
endclass
init_seq
Parallel Sequences
class my_test extends uvm_test;
init_seq iseq;
exec_seq
exec_seq eseq;
...
task run_phase(uvm_phase phase);
iseq = init_seq::type_id::create(iseq);
eseq = exec_seq::type_id::create(eseq);
phase.raise_objection(this);
fork
iseq.start( my_agent_h.my_sequencer_h, this, HIGH );
eseq.start( my_agent_h.my_sequencer_h, this, LOW );
join
phase.drop_objection(this);
endtask
Optional
endclass
init_seq
priority
Hierarchical Sequences
test_seq
init_seq
exec_seq
Hierarchical Sequences
class test_seq extends uvm_sequence #(req,rsp);
`uvm_object_utils(test_seq)
init_seq iseq;
exec_seq eseq;
test_seq
init_seq
task body();
iseq = init_seq::type_id::create(iseq);
endtask
endclass
Hierarchical Sequences
class test_seq extends uvm_sequence #(req,rsp);
`uvm_object_utils(test_seq)
init_seq iseq;
exec_seq eseq;
test_seq
init_seq
task body();
iseq = init_seq::type_id::create(iseq);
iseq.start( m_sequencer, this );
endtask
endclass
Hierarchical Sequences
class test_seq extends uvm_sequence #(req,rsp);
`uvm_object_utils(test_seq)
init_seq iseq;
exec_seq eseq;
test_seq
init_seq
task body();
iseq = init_seq::type_id::create(iseq);
iseq.start( m_sequencer, this );
endtask
endclass
Run on test_seqs
sequencer
Hierarchical Sequences
class test_seq extends uvm_sequence #(req,rsp);
`uvm_object_utils(test_seq)
init_seq iseq;
exec_seq eseq;
test_seq
init_seq
task body();
iseq = init_seq::type_id::create(iseq);
iseq.start( m_sequencer, this );
endtask
endclass
Optional parent
sequence specifier
Hierarchical Sequences
class test_seq extends uvm_sequence #(req,rsp);
`uvm_object_utils(test_seq)
init_seq iseq;
exec_seq eseq;
task body();
iseq = init_seq::type_id::create(iseq);
eseq = exec_seq::type_id::create(eseq);
iseq.start( m_sequencer, this );
test_seq
init_seq
exec_seq
endtask
endclass
Hierarchical Sequences
class test_seq extends uvm_sequence #(req,rsp);
`uvm_object_utils(test_seq)
init_seq iseq;
exec_seq eseq;
test_seq
task body();
iseq = init_seq::type_id::create(iseq);
eseq = exec_seq::type_id::create(eseq);
iseq.start( m_sequencer, this );
eseq.start( m_sequencer, this );
endtask
endclass
init_seq
exec_seq
top.env.agent.sequencer.test_seq.eseq
Pipelined Driver
class mbus_pipelined_driver extends uvm_driver #(mbus_seq_item);
`uvm_component_utils(mbus_pipelined_driver)
virtual mbus_if MBUS;
function new(string name = "mbus_pipelined_driver", uvm_component parent = null);
super.new(name, parent);
endfunction
task run_phase(uvm_phase phase);
@(posedge MBUS.MRESETN);
@(posedge MBUS.MCLK);
fork
do_pipelined_transfer;
do_pipelined_transfer;
join
endtask
task do_pipelined_transfer;
endtask
endclass
2013 Mentor Graphics Corporation, all rights reserved.
Pipelined Driver
class mbus_pipelined_driver extends uvm_driver #(mbus_seq_item);
`uvm_component_utils(mbus_pipelined_driver)
virtual mbus_if MBUS;
task do_pipelined_transfer;
mbus_seq_item req,rsp;
forever begin
pipeline_lock.get();
seq_item_port.get(req);
do_command_phase(req);
pipeline_lock.put();
do_data_phase(req,rsp);
seq_item_port.put(rsp);
end
endtask
endclass
2013 Mentor Graphics Corporation, all rights reserved.
Advanced UVM