Vengineerの妄想(準備期間)

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

UVM 1.0 : examples/simple/interfaces


UVM 1.0では、Virtual Interfaceの使い方を示してくれます。
すべてのコードは、interface.svファイルに記述されています。
    // 途中略

    package top_pkg;
      // Virtual Interfaceであるpin_ifをtypedefでpin_vifに!
      // SystemVerilogでは、Virtual Interfaceをtypedefできる!
      typedef virtual pin_if pin_vif;
    endpackage

    // 途中略

    class driver extends uvm_component;

      pin_vif pif; // Virtual Interface : pin_vif型のpif

      function new(string name, uvm_component parent = null);
        super.new(name, parent);
      endfunction

      function void connect_phase(uvm_phase phase);
        // connect_phaseにて、read_by_nameを使ってpifに接続する
        assert(uvm_resource_db#(pin_vif)::read_by_name(get_full_name(),
                                                       "pif", pif));
      endfunction

      task run_phase(uvm_phase phase);
        forever begin
          @(posedge pif.clk);
          `uvm_info("driver", "posedge clk", UVM_NONE);
          //...
        end
      endtask

    endclass

    // 途中略

    module top;

      import top_pkg::*;

      bit clk;
      clkgen ck(clk);
      pin_if pif(clk);

      env e;
      dut d(pif.slave_mp);

      initial begin
        e = new("env");
        // set関数を使って、'''env.driver'''の'''pif'''に、
        // 上記に宣言した(pin_if pif(clk))のpifを接続する
        uvm_resource_db#(pin_vif)::set("env.driver", "pif", pif);
        // set関数にて接続した情報を表示する。
        uvm_resource_db#(pin_vif)::dump();
        run_test();
        //$finish;
      end

    endmodule

UVM 1.0では、Virtual Interfaceへの接続には、
    ・uvm_resource_db#(pin_vif)::read_by_name(get_full_name(), "pif", pif));
    ・uvm_resource_db#(pin_vif)::set("env.driver", "pif", pif);
を使っています。

read_by_nameタスクの第1引数では固定値ではなく、
get_full_name関数にてパス名を獲得しています。
こうすることで、driverクラスインスタンス化されたときのパス名を
正しく獲得することができます。
Virtual Interfaceを設定する部分では、set関数にて設定しますが、
このときの第1引数はenv.driverのように固定値にしています。

検証、Verification、SystemVerilog、UVM、Unified Verification Methodology