Vengineerの妄想(準備期間)

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

DPI-CのBFMと各社メソドロジー

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を使うようにはなっていないが、この方法は使えるはずだ。。