Vengineerの妄想(準備期間)

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

VMM : vmm_tlm_analysis_exportクラスとPeer IDs

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

オブザーバークラスが複数のAnalysis Exportをサポートするには、vmm_tlm_analysis_exportマクロを使う例は[ VMM : vmm_tlm_analysis_exportマクロ]に書きました。
クラスのインスタンスを持つことはできません。
実は、vmm_tlm_analysis_exportマクロを使わない方法もあります。
それは、オブザーバークラス内に定義するwrite関数の第1引数のidを使うというものです。
    class tlm_scoreboard_x extends vmm_object;

      vmm_tlm_analysis_export#( tlm_scoreboard_2, my_trans ) scb_analysis 
                         = new(this,”scoreboard_analysis”, 2, 0);

      virtual function write(int id= -1, my_trans trans);
        case(id)
              0: do_compare_from_port0(trans);
              1: do_compare_from_port1(trans);
        endcase
      endfunction
    endclass: scoreboard
write関数の中でid'の値によって処理する内容を変えます。
こうすることで、複数のAnalysis Exportをサポートできます。

では、write関数のidの値はどのようにして割り当てるのでしょうか?
それは、次のようにAnalysis PortとAnalysis Exportをバインドするときに割り当てます。
    class my_env extends vmm_group;
    
      tlm_monitor mon[2]; 
      tlm_scoreboard scb;

      virtual function void connect_ph();
        mon[0].analysis_port.tlm_bind(scb.scb_analysis, 0);
        mon[1].analysis_port.tlm_bind(scb.scb_analysis, 1);
      endfunction : build
    
    endclass: my_env
tlm_bind関数の第2引数への値がwrite関数の第1引数のidに渡されます。
mon[0]からのトランザクションは、id=0になり、
mon[1]からのトランザクションは、id=1になります。

このidは、VMM : b_transportで説明したb_transportタスクの第1引数(id)と同じ働きをすることになります。

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