サンプルコード
sample_seq.svh(Sequence)
今回使用するSequenceです。
クラス変数として、din1とdin2を持ちます。
class sample_seq extends uvm_sequence #(sample_sequence_item);
`uvm_object_utils(sample_seq)
rand bit [2:0] din1;
rand bit [2:0] din2;
function new(string name="sample_seq");
super.new(name);
set_automatic_phase_objection(1); // おまじない
endfunction
virtual task body();
`uvm_create(req)
req.din1 <= din1;
req.din2 <= din2;
`uvm_send(req)
endtask
endclass
sample_vseq.svh(Virtual Sequence)
Virtual Sequenceです。4種類の方法でSequenceを実行しています。
class sample_vseq extends uvm_sequence;
`uvm_object_utils(sample_vseq)
`uvm_declare_p_sequencer(sample_vsequencer)
sample_seq seq;
function new(string name="sample_vseq");
super.new(name);
set_automatic_phase_objection(1);
endfunction
virtual task body();
seq = sample_seq::type_id::create("seq");
seq.din1 = 1;
seq.din2 = 2;
seq.start(p_sequencer.seqr);
`uvm_do_on(seq, p_sequencer.seqr)
`uvm_create_on(seq, p_sequencer.seqr)
seq.din1 = 3;
seq.din2 = 4;
`uvm_send(seq)
`uvm_do_on_with(seq, p_sequencer.seqr, {
din1 == 4;
din2 == 5;
})
#10;
endtask
endclass
解説
<Sequence>.start(<Sequencer>)
uvm_sequneceを継承したSequenceはbuilt-inでstartメソッドを持ちます。
引数にSequencerを与えることでSequenceを実行できます。
seq.din1 = 1;
seq.din2 = 2;
seq.start(p_sequencer.seqr);
`uvm_do_on(<Sequence>, <Sequencer>)
引数にSequenceとSequencerを与えることで実行できます。
`uvm_do_on(seq, p_sequencer.seqr)
`uvm_create_on(<Sequence>, <Sequencer>)
`uvm_send(<Sequence>)
`uvm_create_onでSequenceを生成して`uvm_sendでSequenceを実行します。
`uvm_create_on(seq, p_sequencer.seqr)
seq.din1 = 3;
seq.din2 = 4;
`uvm_send(seq)
`uvm_do_on_with(<Sequence>, <Sequencer>, <constraint>)
引数にSequence, Sequencer, constraintを与えることでSequenceを実行できます。
`uvm_do_on_with(seq, p_sequencer.seqr, {
din1 == 4;
din2 == 5;
})
まとめ
Virtual SequenceでSequenceを実行する方法をまとめました。
コメント