代码
假定存在:
- 两个文件,每个文件包含一个 C 语言函数
- 一个 SystemVerilog 文件,它使用下列函数:
- function1.c
- function2.c
- file.sv
function1.c
#include "svdpi.h"
DPI_DLLESPEC
int myFunction1()
{
return 5;
}
function2.c
#include <svdpi.h>
DPI_DLLESPEC
int myFunction2()
{
return 10;
}
file.sv
module m();
import "DPI-C" pure function int myFunction1 ();
import "DPI-C" pure function int myFunction2 ();
integer i, j;
initial
begin
#1;
i = myFunction1();
j = myFunction2();
$display(i, j);
if( i == 5 && j == 10)
$display("PASSED");
else
$display("FAILED");
end
endmodule
用法
将 C 语言文件编译和链接到 Vivado 仿真器内的方法如下所述。
单步骤流程(最简单的流程)
xsc function1.c function2.c
xelab -svlog file.sv -sv_lib dpi
流程描述:
xsc 编译器会编译并链接 C 语言代码以创建共享库 xsim.dir/xsc/dpi.so,xelab 则通过 -sv_lib
开关来引用此共享库。
双步骤流程
xsc -compile function1.c function2.c -work abc
xsc -shared/-shared_systemc abc/function1.lnx64.o abc/function2.lnx64.o -work abc
xelab -svlog file.sv -sv_root abc -sv_lib dpi -R
流程描述:
- 将两个 C 语言文件编译到工作目录 abc 中的对应对象代码内。
- 将这两个文件链接在一起,以创建共享库 dpi.so。
- 确保通过
-sv_root
开关从工作库 abc 中提取此库。提示:-sv_root
会指定查找通过-sv_lib
开关指定的共享库的位置。在 Linux 上,如果未指定-sv_root
并且 DPI 库名称带有前缀lib
和后缀 .so,那么请为共享库位置使用 LD_LIBRARY_PATH 环境变量。
双步骤流程(与上述流程相同但附加多个选项)
xsc -compile function1.c function2.c -work "abc" -v 1
xsc -shared/-shared_systemc "abc/function1.lnx64.o" "abc/function2.lnx64.o" -work "abc" -o final -v 1
xelab -svlog file.sv -sv_root "abc" -sv_lib final -R
流程描述:
如果您要自行进行编译和链接,可以使用 -verbose
开关来查看用于调用编译器的路径和选项。随后,您可根据自己的需求对此路径和选项进行调整。在以上示例中,创建了一个专用共享库 final
。此示例还演示了文件路径中空格的用法。