Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

OVM 2.0 :Virtual Sequences(その1)

Verification Engineerの戯言

User GuideのP.90にVirtual Sequencesの説明があります。
OVM 1.1では、ovm_virtual_sequencerクラスというものがありましたが、
OVM 2.0では、ovm_virtual_sequencerクラスが無くなり、ovm_sequencerクラスを使って、
Virtual sequencerを実現します。
    User Guide P.92

    class simple_virtual_sequencer extends ovm_sequencer;
      eth_sequencer eth_seqr;
      cpu_sequencer cpu_seqr;
      // Constructor
      function new(input string name="simple_virtual_sequencer",
                   input ovm_component parent=null);
        super.new(name, parent);
        // Automation macro for virtual sequencer (no data item)
        `ovm_update_sequence_lib
      endfunction
      // OVM automation macros for sequencers
      'ovm_sequencer_utils(simple_virtual_sequencer)
    endclass: simple_virtual_sequencer
ポイントは、new関数`ovm_update_sequence_libマクロを使っているところです。
通常のシーケンサのときは、ovm_update_sequence_lib_and_itemマクロを使います。
この`ovm_update_sequence_libマクロでは、3つのovm_random_sequence/vm_exhaustive_sequence/ovm_simple_sequenceのうち
ovm_simple_sequenceを登録しません。それは、Virtual Sequencerでは、シーケンスのみを扱い、シーケンス・アイテムは使わないからです。
実際のコードは、
    src/macros/ovm_sequence_defines.svh

    `define ovm_update_sequence_lib \
        m_add_builtin_seqs(0); \
      ovm_update_sequence_lib();
m_add_builtin_seqs関数は、ovm_sequencerクラスで次のように定義されています。
    src/methodology/sequences/ovm_sequencer.svh

    virtual function void m_add_builtin_seqs(bit add_simple = 1);

      if(!sequence_ids.exists("ovm_random_sequence"))
        add_sequence("ovm_random_sequence");
      if(!sequence_ids.exists("ovm_exhaustive_sequence"))
        add_sequence("ovm_exhaustive_sequence");
 
      if(add_simple == 1)
        if(!sequence_ids.exists("ovm_simple_sequence"))
          add_sequence("ovm_simple_sequence");
    endfunction
m_add_buildin_seqs関数の引数が1のときは、ovm_simple_sequenceを登録しません。

ついでに、ovm_update_sequence_lib_and_itemマクロは、
    src/macros/ovm_sequence_defines.svh

    `define ovm_update_sequence_lib_and_item(USER_ITEM) \
      ovm_factory::set_inst_override({get_full_name(), "*.item"}, \
                                      "ovm_sequence_item", `"USER_ITEM`"); \
      m_add_builtin_seqs(1); \
      ovm_update_sequence_lib();
ですので、3つすべてを登録しています。

検証、Verification、SystemVerilog、OVM、Open Verification Methodology