05. virtual sequencer
※このエントリーは、頭で考えながら書いただけなので、ミスがあるかもしれません
virtual sequencerは、一般的には複数のagentを動かす仕組みです。定義はいたって簡単。ふつうのsequencerの定義と同じです。
class virtual_sequencer extends uvm_sequencer;
...(sequencerと同じ)
endclass
異なるのは、このvirtual sequencerからコントロールしたい、各種agentにぶら下がるsequencerをインスタンスすることです。インスタンスはしますが、createはしません。
class virtual_sequencer extends uvm_sequencer;
axi_master_sequencer axi_seqr;
usb3_dev_sequencer usb_dev_seqr;
ether_sequencer ether_seqr;
:
`uvm_component_utils(virtual_sequencer)
function new (string name, uvm_component parent);
super.new(name,parent);
endfunction
endclass
virtual sequencerは、テストベンチ側のuvm_envにインスタンスします。
class tb_env extends uvm_env;
virtual_sequencer v_seqr;
各種 env
スコアボード
function void build_phase(uvm_phase phase);
v_seqr = virtual_sequencer....create("v_seqr", this);
:
endfunction
function void connect_phase(uvm_phase phase);
ここで、virtual_sequencer内にインスタンスした各種sequencerと、実体のsequencerをつなぐ
v_seqr.axi_seqr = axi_env.master.sequencer;
:
endfunction
endclass
まあこんな感じです。あとは、uvm_testの中のbuild_phaseで、virtual sequencerのdefault_sequenceに、virtual sequenceを指定すればOK。
virtual sequenceは、その中で実行したい各種agentのsequenceをインスタンスしておいて、`uvm_do_onなどで実行します。