私の目標は、開いている配列を C++ で埋めることです。ステージは以下の通り。1. SV: サイズのアンパックされた配列を定義し、インポート関数でオープン配列を介して送信します。2. C++: 開いている配列を埋めます。3. SV: アレイを使用します。
サイズのアンパックされた配列の場合、問題はありません。しかし実際の状況では、配列のサイズは頻繁に変更され、コンパイルされた C++ 関数は毎回再コンパイルする必要があります。この状況を回避するには、オープン配列を使用して、C 関数がサイズをチェックし、それに応じてデータを埋める必要があります。
以下では、ソースを簡略化し、重要な部分のみを示します。インポート関数 svcpp は SV で呼び出され、C++ で実行されます。引数はオープン配列 i[] で、そのハンドルは C++ 側では h です。C++ ソースをコンパイルすると、"error LNK1120: unresolved externals" というエラーが発生します。
何が問題ですか?
SV側:
module
import "DPI-C" context function void svcpp (inout byte unsigned i[]);
byte myarray[2];
initial
svcpp(myarray);
endmodule
C++ 側:
#include "svdpi.h"
#include "dpiheader.h"// This includes the data structure for the open array
void svcpp(const svOpenArrayHandle h){
//*(uchar *) x = *(uchar *) svGetArrElemPtr(h,0);
*(uchar *) svGetArrElemPtr(h,1) = 10; //I really want this operation.
}