Vengineerの妄想(準備期間)

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

OVM 1.X : ovm_testクラスの例題

Verification Engineerの戯言

ovm_testクラスの例題として、examples/xbus/examples/test_lib.svがあります。
このファイルでは、ovm_testクラスを継承するxbus_demo_base_testクラスを定義しています。
    class xbus_demo_base_test extends ovm_test;

      `ovm_component_utils(xbus_demo_base_test)

      xbus_demo_sve xbus_demo_sve0;
      ovm_table_printer printer;

      function new(string name = "xbus_demo_base_test", 
        ovm_component parent=null);
        super.new(name,parent);
        printer = new();
      endfunction : new

      virtual function void build();
        super.build();
        $cast(xbus_demo_sve0, create_component("xbus_demo_sve", "xbus_demo_sve0"));
        xbus_demo_sve0.build();
        xbus_demo_sve0.xbus0.bus_monitor.set_report_verbosity_level(OVM_FULL);
      endfunction : build

      task run();
        printer.knobs.depth = 3;
        ovm_print_topology(printer);
        #2000;
        `message(OVM_LOW,("User activated end of simulation"))
        global_stop_request();
      endtask : run

    endclass : xbus_demo_base_test
build関数でテスト環境の設定をし、runタスクで#2000後、global_stop_requestを呼んでいます。
また、このxbus_demo_base_testクラスを継承した次の3つを実際のテストシナリオとしています。
    class test_read_modify_write extends xbus_demo_base_test;
    class test_r8_w8_r4_w4       extends xbus_demo_base_test;
    class test_2m_4s             extends xbus_demo_base_test;
テストシナリオとしてtest_read_modify_writeをシミュレーション時に指定するには、
    +OVM_TESTNAME=test_read_modify_write
を引数にとして指定します。test_read_modify_writeは、次のように定義しています。
    class test_read_modify_write extends xbus_demo_base_test;

      `ovm_component_utils(test_read_modify_write)

      function new(string name = "test_read_modify_write", ovm_component parent=null);
        super.new(name,parent);
      endfunction : new

      virtual function void build();
      // Set the default sequence for the master and slave
        set_config_string("xbus_demo_sve0.xbus0.masters[0].sequencer",
                          "default_sequence", "read_modify_write_seq");
        set_config_string("xbus_demo_sve0.xbus0.slaves[0].sequencer", 
                          "default_sequence", "slave_memory_seq");
      // Create the sve
        super.build();
      endfunction : build

  endclass : test_read_modify_write
build関数を定義しています。build関数では、xbus_demo_sve0.xbus.masters[0].sequencerとxbus_demo_sve0.xbus.slaves[0].sequencerのdefault_sequencer
変更し、親クラス(xbus_demo_base_testクラス)のbuild関数を呼んでいます。
こうすることで、テストベンチ側の変更をこのテストシナリオ側で行うことができるのです。便利ですね。

test_2m_4sでは、sequencerのdefault_sequenceだけでなく、各クラス内のパラメータの変更をしています。
    // Set up slave address map for xbus0
    xbus_demo_sve0.xbus0.set_slave_address_map("slaves[0]", 16'h0000, 16'h3fff);
    xbus_demo_sve0.xbus0.set_slave_address_map("slaves[1]", 16'h4000, 16'h7fff);
    xbus_demo_sve0.xbus0.set_slave_address_map("slaves[2]", 16'h8000, 16'hBfff);
    xbus_demo_sve0.xbus0.set_slave_address_map("slaves[3]", 16'hC000, 16'hFfff);

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