2013-02-06 64 views
0

我正在嘗試將C函數導入System verilog測試工作臺。 C函數的代碼如下所示。我想傳遞文件作爲參數。該功能基本上從一個文件讀取並寫入另一個文件。使用文件類型參數導入System Verilog中的C函數

int readmem(int z, FILE *file1, FILE *file2) { 
     char data; 
     int x; 
     int i; 
     for(i = 0; i<z;i ++) { 
     data = fgetc(file1); 
     x = data; 
     fputc(x,file2); 
     } 
     return 0; 
    } 

請告訴我如何在System verilog測試平臺中調用此函數。

回答

1

您無法通過DPI在SystemVerilog和C之間傳遞文件描述符,所以我不認爲可以直接按原樣導入函數。

如果您真的需要做的是獲得SystemVerilog中的功能,將它移植到SystemVerilog會更容易,而不是試圖通過DPI導入它。

像這樣的東西應該工作(沒有測試!):

function int readmem(int z, int file1, int file2); 
    reg[8:0] data; 
    for (int i = 0; i < z; i++) begin 
    data = $fgetc(file1); // Really should break out of the loop if data == EOF ('h1FF) 
    $fwrite(file2, "%c", data[7:0]); 
    end 
    return 0; 
endfunction 

然後從別的地方:

int file1 = $fopen("input_file", "r"); 
int file2 = $fopen("output_file", "w"); 

readmem(10, file1, file2) 

原因data聲明爲9位是捕捉如果最終的EOF的文件已達到。由於您未檢查EOF,因此原始功能可能會在file1的末尾運行。

0

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 
+0

我想你告訴他,他已經知道的東西負載。問題是關於文件描述符,而不是如何使用DPI。 –

+0

你是對的保羅。我錯過了閱讀說明,並且對我的回答不夠明確。我用一個工作示例修改了我的答案。 – Greg

+0

不錯;這幾乎是我該怎麼做的。它確保每一邊都看着自己的文件描述符。很高興你沒有否認我的評論。 –