Vengineerの妄想(準備期間)

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

OVM : Sequenceの例題

Verification Engineerの戯言

OVMでは、Sequence/Sequencerというものがあります。AVMには無いので、URMからきているのでしょう。
クラス・リファレンス、ソースコード、例題のコードを見て、いろいろ調べたのですが、
どこから始めるのが一番良いかを何日か考えました。
現状提供されているドキュメントとソースコードでは、例題(examples/sequence)をスタートポイントとするのがいいのではないでしょうか?

ということで、例題のトップ記述を見ていきましょう。
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

  endmodule
testモジュールの中に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)は次のようになっています。
    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_driver
simple_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_itemseq_item_prod_if.item_doneを見ていきます。

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