Verification Engineerの戯言
SynopsysのVMM
Mentor のAVM
Cadence のURM
各社のメソドロジーでは、SystemVerilogを使っている(他の言語も使えるものもあるが)
ということは、DPI-CのBFMが使えるはずだが、
各社のメソドロジーは、どれも検証コンポーネントをクラスで実装することになっている。
DPI-Cは残念ながらクラスでの使えない。ううううう。
では、どうすればDPI-Cを各社のメソドロジーに入れ込めるか?
考えられる作戦としては、program内でDPI-Cを使う方法。
VMMとURMはprogramをテストケース記述に使う(AVMは、programを使わない。なぜだ???)。
DPI-CのBFMをprogram内に記述すればいいか?
programにBFMを直接記述すると、すべてのテストケースでBFM記述を書く必要があるので、
この方法はダサイ。
BFM部分を別ファイルにし、include分でこのファイルを取り込む方法。
ふー。これはそれなりに使える。
"bfm_dpi_c.sv"ファイルは、こんな感じ!
//==================================================================
// start of bfm_dpi_c.sv
//==================================================================
import "DPI-C" task c_main();
export "DPI-C" task bus_nop;
export "DPI-C" task bus_read;
export "DPI-C" task bus_write;
task bus_nop( input int n );
for( int i=0 ; i<n ; i++ )
@(posedge `bus.CLK);
endtask : bus_nop
task bus_read( input int unsigned addr, output int unsigned data );
`bus.read( addr, data );
endtask : bus_read
task bus_write( input int unsigned addr, input int unsigned data );
`bus.write( addr, data );
endtask : bus_write
//==================================================================
// end of bfm_dpi_c.sv
//==================================================================
これをprogram内で使うときは、次のようになる。
`define bus Test.bus
program test_case;
`include "bfm_dpi_c.sv"
initial begin
fork
c_main(); // C言語部分をコール
// ここにメソドロジーの実行部
join none
end
endprogram : test_case
BFMのインターフェースを汎用的に使うために、
"bfm_dpi_c.sv"ファイルでは、busをマクロにし、
programファイル内でこのbusを環境に合わせて定義します。
`define bus Test.bus
この部分は、実際のテストベンチに合わせます。
fork/join none部分でC言語部とメソドロジーの実行部を並列動作させるのがポイント!
AVMではprogramを使うようにはなっていないが、この方法は使えるはずだ。。