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などで実行します。