SystemVerilog には、SystemVerilog が C 関数を呼び出せるようにする DPI (Direct Programming Interface) が含まれており、C が SystemVerilog タスク/関数を呼び出せるようにすることもできます。IEEE std 1800-2009 Section 35 および Annex H & I を確認してください。データ型には制限があるため、基本的な SV/C タイプ マッピングについては Annex H.7.4 を確認してください。
SystemVerilog で C 関数を呼び出すには、目的のスコープ (モジュールやパッケージなど) にインポートするだけです。
import "DPI-C" context function C_function_name(/* args */);
C から SystemVerilog を呼び出すには、追加の手順が 1 つ必要です。
SVで:
export "DPI-C" function SV_function_name; /*no args */
C で:
extern return_type SV_function_name( /* args */);
シミュレータによっては、最初に C コードをコンパイルしてオブジェクト ファイルを参照するか、ファイル リストにソース ファイルを含める必要がある場合があります。シミュレータにオプションを追加する必要があるため、マニュアルを確認してください。
開始するのに役立つリソースを次に示します。
リビジョン: FILE は DPI 間で変換されないため、変換ラッパーを使用します。C のconst char*
マップは SystemVerilog のstring
.
子:
#include <stdlib.h>
#include <stdio.h>
// include for DPI
#include "svdpi.h"
// wrapper
int C2SV_readmem(int z, const char *filename1, const char *filename2) {
FILE *file1;
FILE *file2;
int rtn;
file1 = fopen(filename1, "r");
file2 = fopen(filename2, "w");
if (file1 == NULL) {
printf("failed to open '%s' for read\n", filename1);
return 1;
}
if (file2 == NULL) {
printf("failed to open '%s' for write\n", filename2);
return 1;
}
return readmem(z, file1, file2); // call original readmem function
}
/* ... */
システムベリログ:
module test;
import "DPI-C" context function int C2SV_readmem(input int z, input string filename1, input string filename2);
int value;
initial begin
value = C2SV_readmem( 25, "FileIn.txt", "FileOut.txt");
end
endmodule