Verification Engineerの戯言
execute_itemタスクを使ったダイレクト・テストについては、OVM 2.0 :Directed Test Style Interface(その1)で説明しました。
今回は、`ovm_createマクロと`ovm_sendマクロを使ったダイレクト・テストについて、みていきます。
今回は、`ovm_createマクロと`ovm_sendマクロを使ったダイレクト・テストについて、みていきます。
User GuideのPage.129のGenerating the Item or Sequence in Advanceに、`ovm_createマクロと`ovm_sendマクロ'''を
使った例が載っています。まずは、`ovm_createマクロです。
`ovm_createマクロは、引数の型のシーケンス・アイテムを生成するだけです。
だから、上記の例では、`ovm_createマクロの後に、reqに対して制約等を設定しています。
使った例が載っています。まずは、`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マクロでシーケンス・アイテムをドライバに送信しています。
`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