Verification Engineerの戯言 : SystemVerilogの世界へようこそ
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)が設定されているので、指定する必要はありません。
第三引数と第四引数はデバック用に使われるものです。
先に説明したイニシエータの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を割り当てています。
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