Académique Documents
Professionnel Documents
Culture Documents
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