サンプルコード
sample_sequence_item.svh
Sequenceで使用するSequence_itemです。
class sample_sequence_item extends uvm_sequence_item;
`uvm_object_utils(sample_sequence_item)
rand bit [2:0] din1;
rand bit [2:0] din2;
function new(string name="sample_sequence_item");
super.new(name);
endfunction
endclass
sample_seq.svh
class sample_seq extends uvm_sequence #(sample_sequence_item);
`uvm_object_utils(sample_seq)
`uvm_declare_p_sequencer(sample_sequencer)
function new(string name="sample_seq");
super.new(name);
set_automatic_phase_objection(1); // おまじない
endfunction
virtual task body();
`uvm_create(req)
req.din1 <= 1;
req.din2 <= 2;
`uvm_send(req)
`uvm_create_on(req, p_sequencer)
req.din1 <= 2;
req.din2 <= 3;
`uvm_send(req)
`uvm_do(req)
`uvm_do_with(req, {
din1 == 3;
din2 == 4;
})
`uvm_do_on(req, p_sequencer)
`uvm_do_on_with(req, p_sequencer, {
din1 == 4;
din2 == 5;
})
#10;
endtask
endclass
解説
`uvm_create(<sequence_item>)
`uvm_send(<sequence_item>)
`uvm_createでSequenceを生成して`uvm_sendでSequenceを実行します。
`uvm_create(req)
req.din1 <= 1;
req.din2 <= 2;
`uvm_send(req)
`uvm_create_on(<sequence_item>, <Sequencer>)
`uvm_send(<sequence_item>)
`uvm_create_onでSequenceを生成して`uvm_sendでSequenceを実行します。
`uvm_create_on(req, p_sequencer)
req.din1 <= 2;
req.din2 <= 3;
`uvm_send(req)
`uvm_do(<sequence_item>)
引数にSequence_itemを与えることでSequenceを実行できます。
`uvm_do(req)
`uvm_do_with(<sequence_item>, <Constraint>)
引数にSequence_item, constraintを与えることでSequenceを実行できます。
`uvm_do_with(req, {
din1 == 3;
din2 == 4;
})
`uvm_do_on(<sequence_item>, <Sequencer>)
引数にSequence_item, Sequencerを与えることでSequenceを実行できます。
`uvm_do_on(req, p_sequencer)
`uvm_do_on_with(<sequence_item>, <Sequencer>, <Constraint>)
引数にSequence_item, Sequencer, constraintを与えることでSequenceを実行できます。
`uvm_do_on_with(req, p_sequencer, {
din1 == 4;
din2 == 5;
})
まとめ
Sequenceを実行する方法をまとめました。
コメント