Vengineerの妄想(準備期間)

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

OVM 2.0 :Virtual Sequences(その2)

Verification Engineerの戯言

シーケンスでは、bodyタスク`ovm_doマクロあるいは`ovm_do_withマクロを使って、
シーケンスやシーケンス・アイテムを実行します。
OVM 2.0におけるバーチャル・シーケンスでは、各シーケンサへのシーケンスの実行には、
`ovm_do_onマクロ、あるいは`ovm_do_on_withマクロを使います。
    User Guide P.93より

    class simple_virt_seq extends ovm_sequence;
      cpu_config_seq conf_seq;
      eth_large_payload_seq frame_seq;
      random_traffic_virt_seq rand_virt_seq;

      virtual task body();
        // Invoke a sequence in the cpu subsequencer.
        'ovm_do_on(conf_seq, p_sequencer.cpu_seqr)
        // Invoke a sequence in the ethernet subsequencer.
        'ovm_do_on(frame_seq, p_sequencer.eth_seqr)
        // Invoke another virtual sequence in this sequencer.
        'ovm_do(rand_virt_seq)
      endtask : body
    endclass : simple_virt_seq
cpu_seqrシーケンサに対しては、conf_seqシーケンス
eth_seqrシーケンサに対しては、frame_seqシーケンスを実行します。
その後に、rand_virt_seqシーケンスを実行します。

`ovm_do_onマクロおよび`ovm_do_on_withマクロは、次のように定義されています。
    src/macros/ovm_sequence_defines.svh
    
`define ovm_do_on(OVM_SEQUENCE_ITEM, SEQUENCER_REF) \
  begin \
    `ovm_create_on(OVM_SEQUENCE_ITEM, SEQUENCER_REF) \
    start_item(OVM_SEQUENCE_ITEM); \
    assert(OVM_SEQUENCE_ITEM.randomize()) else begin \
      ovm_report_warning("RNDFLD", "Randomization failed in ovm_do action"); \
    end \
    finish_item(OVM_SEQUENCE_ITEM); \
  end

`define ovm_do_on_with(OVM_SEQUENCE_ITEM, SEQUENCER_REF, CONSTRAINTS) \
  begin \
    `ovm_create_on(OVM_SEQUENCE_ITEM, SEQUENCER_REF) \
    start_item(OVM_SEQUENCE_ITEM);\
    assert(OVM_SEQUENCE_ITEM.randomize() with CONSTRAINTS ) else begin \
      ovm_report_warning("RNDFLD", "Randomization failed in ovm_do_with action"); \
    end\
    finish_item(OVM_SEQUENCE_ITEM);\
  end
一方、`ovm_doマクロおよび`ovm_do_withマクロは、次のように定義されています。
    src/macros/ovm_sequence_defines.svh
    
`define ovm_do(OVM_SEQUENCE_ITEM) \
  begin \
    OVM_SEQUENCE_ITEM = new(""); \
    `ovm_create(OVM_SEQUENCE_ITEM) \
    start_item(OVM_SEQUENCE_ITEM); \
    assert(OVM_SEQUENCE_ITEM.randomize()) else begin \
      ovm_report_warning("RNDFLD", "Randomization failed in ovm_do action"); \
    end \
    finish_item(OVM_SEQUENCE_ITEM); \
  end

`define ovm_do_with(OVM_SEQUENCE_ITEM, CONSTRAINTS) \
  begin \
    OVM_SEQUENCE_ITEM = new(""); \
    `ovm_create(OVM_SEQUENCE_ITEM) \
    start_item(OVM_SEQUENCE_ITEM);\
    assert(OVM_SEQUENCE_ITEM.randomize() with CONSTRAINTS ) else begin \
      ovm_report_warning("RNDFLD", "Randomization failed in ovm_do_with action"); \
    end\
    finish_item(OVM_SEQUENCE_ITEM);\
  end
違いは、`ovm_createマクロ`ovm_create_onマクロです。
`ovm_createマクロ`ovm_create_onマクロの定義は、次のとおりです。
    src/macros/ovm_sequence_defines.svh

`define ovm_create(OVM_SEQUENCE_ITEM) \
  begin \
    ovm_factory f_ = ovm_factory::get(); \
    ovm_object_wrapper w_;\
    w_ = OVM_SEQUENCE_ITEM.get_type(); \
    $cast(OVM_SEQUENCE_ITEM , create_item(w_, m_sequencer, `"OVM_SEQUENCE_ITEM`"));\
  end
    
`define ovm_create_on(OVM_SEQUENCE_ITEM, SEQUENCER_REF) \
  begin \
    ovm_factory f_ = ovm_factory::get(); \
    ovm_object_wrapper w_; \
    w_ = OVM_SEQUENCE_ITEM.get_type(); \
    $cast(OVM_SEQUENCE_ITEM , create_item(w_, SEQUENCER_REF, `"OVM_SEQUENCE_ITEM`"));\
  end
結果としては、create_item関数の第2引数が指定したシーケンサか自分が接続するシーケンサの違いだけですね!

(`ovm_doマクロおよび`ovm_do_withマクロでの
「OVM_SEQUENCE_ITEM = new(....);」の部分は、必要ないのでは?
なぜなら、create_item関数で生成したシーケンス・アイテムをOVM_SEQUENCE_ITEMにキャストしているので!!!)
(MentorのAndyさんからも回答もらっています。必要無いようです)

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