Vengineerの妄想(準備期間)

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

VMM : tlm_bind

Verification Engineerの戯言 : SystemVerilogの世界へようこそ

VMM : PortとExportでは、vmm_tlm_b_transport_portvmm_tlm_b_transport_export
tlm_bindで接続することを説明しました。

    virtual function void connect_ph;
        m_producer.m_port.tlm_bind( m_consumer.m_export );
    endfunction 

このtlm_bindの定義を見てみましょう。
    function void vmm_tlm_port_base::tlm_bind(
                  vmm_tlm_export_base#(DATA,PHASE) peer,
                  int id = -1, 
                  string fname = "", 
                  int lineno = 0);

第一引数のpeerは、vmm_tlm_export_base#(DATA,PHASE)型です。
先に説明したイニシエータのPortとターゲットのExportを接続するときのターゲットのExportになります。
第二引数のidは、ターゲットに接続するイニシエータを区別するための識別子(id)になります。
通常はデフォルト値(-1)が設定されているので、指定する必要はありません。
第三引数と第四引数はデバック用に使われるものです。

第二引数のidを使って、複数のイニシエータを1つのターゲットに接続し、ターゲット側では送られてくるトランザクションをこのidを使って区別します。

VMM 1.2 User GuideのPage.A-868の例題を見てみましょう。
    class producer extends vmm_xactor;
      vmm_tlm_b_transport_port#(producer) b_port = new(this,"producer port");
    endclass

    class consumer extends vmm_xactor;
      vmm_tlm_b_transport_export#(consumer) b_export = new(this,"consumer export");
    endclass

    class my_env extends vmm_group;
      producer p[4];
      consumer c;
      function void connect_ph();
        foreach(p[i]) begin
          p[i].b_port.tlm_bind(c.b_export, i);
        end
      endfunction
    endclass

my_envクラスのconnect_ph関数で4つのproducerのインスタンス(p[4])を
1つのconsumerのインスタンス(c)にtlm_bind関数を使ってバインドしています。
このとき、第二引数に各producerのidを割り当てています。

第二引数に割り当てられる値は正の整数です。負の整数を与えると、デフォルト値と同じ動きをします。

そして、このidは、VMM : b_transportで説明したターゲット側のb_transportの第一引数になるのです。

  task b_transport(int id = -1, my_tx trans, ref int delay); 

検証、Verification、SystemVerilog、VMM、Verification Methodology Manual