Verification Engineerの戯言
OVMでは、Sequence/Sequencerというものがあります。AVMには無いので、URMからきているのでしょう。
クラス・リファレンス、ソースコード、例題のコードを見て、いろいろ調べたのですが、
どこから始めるのが一番良いかを何日か考えました。
現状提供されているドキュメントとソースコードでは、例題(examples/sequence)をスタートポイントとするのがいいのではないでしょうか?
クラス・リファレンス、ソースコード、例題のコードを見て、いろいろ調べたのですが、
どこから始めるのが一番良いかを何日か考えました。
現状提供されているドキュメントとソースコードでは、例題(examples/sequence)をスタートポイントとするのがいいのではないでしょうか?
ということで、例題のトップ記述を見ていきましょう。
examples/sequence/test.sv
OVM : URM(BFM, Driver, Monitor Class)との対応に書いたようにsimple_sequencerクラスはovm_sequencerクラスを継承しているのでURMのDriverに対応し、
simple_driverクラスはovm_driverクラスを継承しているのでURMのBFMに対応します。
sequencerが生成したものをdriverが使うことになります。そのために
examples/sequence/test.sv
module test; `include "ovm.svh" `include "simple_item.sv" `include "simple_sequencer.sv" `include "simple_driver.sv" `include "simple_seq_lib.sv" simple_sequencer sequencer; simple_driver driver; initial begin set_config_string("sequencer", "default_sequence", "simple_seq_sub_seqs"); sequencer = new("sequencer", null); sequencer.build(); driver = new("driver", null); driver.build(); driver.seq_item_prod_if.connect_if(sequencer.seq_item_cons_if); run_test(); end initial begin sequencer.print(); driver.print(); #2000; end endmoduletestモジュールの中に2つのクラス(simple_sequencer,simple_driver)のインスタンス(sequencerとdriver)があります。
OVM : URM(BFM, Driver, Monitor Class)との対応に書いたようにsimple_sequencerクラスはovm_sequencerクラスを継承しているのでURMのDriverに対応し、
simple_driverクラスはovm_driverクラスを継承しているのでURMのBFMに対応します。
sequencerが生成したものをdriverが使うことになります。そのために
driver.seq_item_prod_if.connect_if(sequencer.seq_item_cons_if);のところで、その設定を行った後、run_test関数でテストを開始しています。
simple_driverクラス(simple_driver.sv)は次のようになっています。
run関数を定義することになります。run関数では、seq_item_prod_if.get_next_item(item)でSequencerからovm_sequence_itemのインスタンスを獲得し、
その情報をitem.print()で表示します。実際のテストでは、この部分にBFMのプロトコルを実装することになります。その後に、seq_item_prod_if.item_done()
でitemに対する処理が終了したことをSequencerに伝えます。
つまり、DriverはSequencerからitem(ovm_sequence_itemを継承するクラスのインスタンス)を獲得し、そのitemに対して何らかの処理をした後に、処理が終了したことをSequencerに伝えるというパターンです。
class simple_driver extends ovm_driver; ovm_sequence_item item; // Provide implementations of virtual methods such as get_type_name and create `ovm_component_utils(simple_driver) // Constructor function new (string name, ovm_component parent); super.new(name, parent); endfunction : new task run (); while(1) begin #10; seq_item_prod_if.get_next_item(item); ovm_report_info("Driver", "Printing received item :"); item.print(); seq_item_prod_if.item_done(); end endtask: run endclass : simple_driversimple_driverクラスの親クラスであるovm_driverクラスは、ovm_threaded_componentクラスを継承しているので、
run関数を定義することになります。run関数では、seq_item_prod_if.get_next_item(item)でSequencerからovm_sequence_itemのインスタンスを獲得し、
その情報をitem.print()で表示します。実際のテストでは、この部分にBFMのプロトコルを実装することになります。その後に、seq_item_prod_if.item_done()
でitemに対する処理が終了したことをSequencerに伝えます。
つまり、DriverはSequencerからitem(ovm_sequence_itemを継承するクラスのインスタンス)を獲得し、そのitemに対して何らかの処理をした後に、処理が終了したことをSequencerに伝えるというパターンです。
次回は、ovm_driverクラスのseq_item_prod_if.get_next_itemとseq_item_prod_if.item_doneを見ていきます。
検証、Verification、SystemVerilog、OVM、Open Verification Methodology