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: scoreboard
write関数の中で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_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