Verification Engineerの戯言 : SystemVerilogの世界へようこそ
オブザーバークラスが複数のAnalysis Exportをサポートするには、vmm_tlm_analysis_exportマクロを使う例は[ VMM : vmm_tlm_analysis_exportマクロ]に書きました。
クラスのインスタンスを持つことはできません。
実は、vmm_tlm_analysis_exportマクロを使わない方法もあります。
それは、オブザーバークラス内に定義するwrite関数の第1引数のidを使うというものです。
こうすることで、複数の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: scoreboardwrite関数の中でid'の値によって処理する内容を変えます。
こうすることで、複数のAnalysis Exportをサポートできます。
では、write関数のidの値はどのようにして割り当てるのでしょうか?
それは、次のようにAnalysis PortとAnalysis Exportをバインドするときに割り当てます。
mon[0]からのトランザクションは、id=0になり、
mon[1]からのトランザクションは、id=1になります。
それは、次のように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_envtlm_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