Vengineerの妄想(準備期間)

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

OVM 2.0 :Directed Test Style Interface(その2)

Verification Engineerの戯言

execute_itemタスクを使ったダイレクト・テストについては、OVM 2.0 :Directed Test Style Interface(その1)で説明しました。
今回は、`ovm_createマクロ`ovm_sendマクロを使ったダイレクト・テストについて、みていきます。

User GuideのPage.129のGenerating the Item or Sequence in Advanceに、`ovm_createマクロ`ovm_sendマクロ'''を
使った例が載っています。まずは、`ovm_createマクロです。
    User Guide P.130

    class my_seq extends ovm_sequence #(my_item);
      ... // Constructor and OVM automation macros go here.
      // See “Creating and Adding a New Sequence” on page 84.
      virtual task body();
        `ovm_create(req)
        req.addr.rand_mode(0);      // Disables randomization of addr
        req.dc1.constraint_mode(0); // Disables constraint dc1
        req.addr = 27;
        ...
      endtask : body
    endclass: my_seq
`ovm_createマクロは、OVM 2.0 :Virtual Sequences(その2)で実装コードをみました。
`ovm_createマクロは、引数の型のシーケンス・アイテムを生成するだけです。
だから、上記の例では、`ovm_createマクロの後に、reqに対して制約等を設定しています。

次に、`ovm_sendマクロです。reqの各メンバー(addrには2、dataには4)を設定し、
`ovm_sendマクロでシーケンス・アイテムをドライバに送信しています。
    User Guide P.130

    class my_seq2 extends ovm_sequence #(my_item);
      ... // Constructor and OVM automation macros go here.
      // See “Creating and Adding a New Sequence” on page 84.
      virtual task body();
        `ovm_create(req)
        req.addr = 27;
        req.data = 4;
        // No randomization. Use a purely pre-generated item.
        `ovm_send(req)
      endtask : body
    endclass: my_seq2
`ovm_sendマクロは、次のようにただ単にドライバに送信しているだけです。
    src/macros/ovm_sequence_defines.svh

    `define ovm_send(OVM_SEQUENCE_ITEM) \
      begin \
        start_item(OVM_SEQUENCE_ITEM); \
        finish_item(OVM_SEQUENCE_ITEM);\
      end\


`ovm_sendマクロの代わりに`ovm_rand_sendマクロ`ovm_rand_send_withマクロを使うことで、
アロケーション(シーケンス・アイテムの生成)無しに、ランダム生成後に、ドライバに送信します。
    src/macros/ovm_sequence_defines.svh

    `define ovm_rand_send(OVM_SEQUENCE_ITEM) \
      begin \
        start_item(OVM_SEQUENCE_ITEM); \
        assert(OVM_SEQUENCE_ITEM.randomize()) else begin \
          ovm_report_warning("RNDFLD", "Randomization failed in ovm_rand_send action"); \
        end \
        finish_item(OVM_SEQUENCE_ITEM);\
      end\


実は、`ovm_doマクロは、`ovm_createマクロ+`ovm_rand_sendマクロです。
    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

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