Verification Engineerの戯言
シーケンスでは、bodyタスクで`ovm_doマクロあるいは`ovm_do_withマクロを使って、
シーケンスやシーケンス・アイテムを実行します。
OVM 2.0におけるバーチャル・シーケンスでは、各シーケンサへのシーケンスの実行には、
`ovm_do_onマクロ、あるいは`ovm_do_on_withマクロを使います。
eth_seqrシーケンサに対しては、frame_seqシーケンスを実行します。
その後に、rand_virt_seqシーケンスを実行します。
シーケンスやシーケンス・アイテムを実行します。
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_seqcpu_seqrシーケンサに対しては、conf_seqシーケンスを
eth_seqrシーケンサに対しては、frame_seqシーケンスを実行します。
その後に、rand_virt_seqシーケンスを実行します。
`ovm_do_onマクロおよび`ovm_do_on_withマクロは、次のように定義されています。
`ovm_createマクロと`ovm_create_onマクロの定義は、次のとおりです。
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さんからも回答もらっています。必要無いようです)
「OVM_SEQUENCE_ITEM = new(....);」の部分は、必要ないのでは?
なぜなら、create_item関数で生成したシーケンス・アイテムをOVM_SEQUENCE_ITEMにキャストしているので!!!)
(MentorのAndyさんからも回答もらっています。必要無いようです)
検証、Verification、SystemVerilog、OVM、Open Verification Methodology