SystemVerilog 包括 DPI(直接编程接口),它可以让您的 SystemVerilog 调用 C 函数,甚至可以让您的 C 调用 SystemVerilog 任务/函数。查看 IEEE std 1800-2009 第 35 节和附录 H 和 I。数据类型存在限制,因此请查看基本 SV/C 类型映射的附录 H.7.4。
要在 SystemVerilog 中调用 C 函数,只需将其导入所需的范围(例如模块或包)
import "DPI-C" context function C_function_name(/* args */);
从 C 调用 SystemVerilog 需要一个额外的步骤。
在 SV 中:
export "DPI-C" function SV_function_name; /*no args */
在 C 中:
extern return_type SV_function_name( /* args */);
根据您的模拟器,您可能需要先编译 C 代码并引用目标文件,或者仅将源文件包含在文件列表中。您需要向模拟器添加选项,因此请查看手册。
以下是一些可以帮助您入门的资源:
修订:使用翻译包装器,因为 FILE 不会跨 DPI 进行翻译。Cconst char*
映射到 SystemVerilog 的string
.
C:
#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
}
/* ... */
SystemVerilog:
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