Vengineerの妄想(準備期間)

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

VMM : vmm_tlm_b_transport_exportマクロ

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

tlm_bindを使うことでExportに複数のPortを接続することができることは、VMM : tlm_bindで説明しました。

同じようなことは、vmm_tlm_b_transport_exportマクロでも可能です。

vmm_tlm_b_transport_exportマクロは、sv/std_lib/vmm_tlm_macros.svで次のように定義されています。
`define vmm_tlm_b_transport_export(SUFFIX) \
    class vmm_tlm_b_transport_export``SUFFIX #(type TARGET = vmm_xactor, type DATA = vmm_data) extends vmm_tlm_export_base#(DATA); \
      static local vmm_object _obj; \
      local TARGET m_parent; \
                             \
      function new(TARGET parent, string name, int max_binds = 1, int min_binds = 0); \
        super.new(($cast(_obj, parent)) ? _obj: null , name, max_binds, min_binds,((parent != null) && $cast(_obj,parent)) ? _obj.get_log() : null); \
        this.m_parent = parent; \
      endfunction: new \
      \
      virtual task b_transport(int id = -1, DATA trans, ref int delay); \
        if(this.child_export == null)  \
          this.m_parent.b_transport``SUFFIX(id, trans, delay); \
        else \
          this.child_export.b_transport(id,trans,delay); \
      endtask : b_transport \
      \
    endclass : vmm_tlm_b_transport_export``SUFFIX

vmm_tlm_b_transport_exportマクロでは、vmm_tlm_b_transport_exportSUFFIXという新しいクラスを定義しています。
つまり、各イニシエータ(Port)に対して接続するためのExportのクラスを定義する訳です。

    class consumer extends vmm_xactor;
      `vmm_tlm_b_transport_export(_1)
      `vmm_tlm_b_transport_export(_2)
      vmm_tlm_b_transport_export_1#(consumer) b_export1 = new(this, "export1");
      vmm_tlm_b_transport_export_2#(consumer) b_export2 = new(this,"export2");

      task b_transport_1(int id = -1, vmm_data trans, ref int delay );
        trans.display("From export1");
      endtask

      task b_transport_2(int id = -1, vmm_data trans, ref int delay);
        trans.display("From export2");
      endtask
    endclass

    class producer extends vmm_xactor;
      vmm_tlm_b_transport_port#(producer) b_port;
    endclass

    class my_env extends vmm_group;
      producer p1,p2;
      consumer c1;

      function void connect_ph();
        c1.b_export1.tlm_bind(p1.b_port);
        c1.b_export2.tlm_bind(p2.b_port);
      endfunction
    endclass

vmm_tlm_b_transport_exportマクロを使って、2つのExport(b_export1,b_export2)をそれぞれ
p1とp2にtlm_bindを使って接続しています。

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