如何通过具有DPI导入功能的开放阵列双向地在SV和C++之间传递数据

gno*_*ejh 5 c++ system-verilog visual-c++ system-verilog-dpi

我的目标是用C++填充一个开放的数组.阶段如下.1. SV:定义一个大小的解压缩数组,并通过导入函数中的开放数组发送它.2. C++:填充打开的数组.3. SV:使用阵列.

对于大小的解压缩阵列,没有问题.但在实际情况下,数组大小经常更改,并且每次都必须重新编译已编译的C++函数.为了避免这种情况,我需要使用一个开放数组,以便C函数检查大小并相应地填充数据.

在下文中,简化了源,仅显示了基本部分.导入函数svcpp在SV调用并在C++中执行.参数是open数组i [],其句柄是C++方面的h.当我编译C++源代码时,会发生错误,"错误LNK1120:未解析的外部".

问题是什么?

SV方面:

module
    import "DPI-C" context function void svcpp (inout byte unsigned i[]);
    byte myarray[2];

    initial
        svcpp(myarray);
endmodule
Run Code Online (Sandbox Code Playgroud)

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.
}
Run Code Online (Sandbox Code Playgroud)

jcl*_*lin 1

您可以尝试这样做以避免 C++ 编译器损坏您的函数名称。

extern "C" void svcpp(const svOpenArrayHandle h) {
 ...
}
Run Code Online (Sandbox Code Playgroud)