SystemVerilog包括DPI(直接編程接口),可讓您的SystemVerilog調用C函數,甚至可以讓您的C調用SystemVerilog任務/函數。查看IEEE標準1800-2009第35節和附錄H & I.數據類型存在限制,因此請查看附錄H.7.4中的基本SV/C類型映射。
要調用C函數SystemVerilog中,簡單地將其導入到所期望的範圍(例如,模塊或封裝)
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代碼和參考的對象文件,或者只包含源文件你的文件列表。你需要添加選項到你的模擬器,所以檢查手冊。
這裏有一些資源,可以幫助您開始:
修訂: 使用翻譯包裝,因爲文件不確實沒有翻譯整個新聞部。 C的const 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
我想你告訴他,他已經知道的東西負載。問題是關於文件描述符,而不是如何使用DPI。 –
你是對的保羅。我錯過了閱讀說明,並且對我的回答不夠明確。我用一個工作示例修改了我的答案。 – Greg
不錯;這幾乎是我該怎麼做的。它確保每一邊都看着自己的文件描述符。很高興你沒有否認我的評論。 –