0

我正在尝试将 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;
    }

请告诉我如何在系统 verilog 测试台中调用此函数。

4

2 回答 2

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)

声明为 9 位的原因data是为了在到达文件末尾时捕获 EOF。file1由于您没有检查 EOF,因此您的原始函数可能会运行结束。

于 2013-02-07T02:25:36.977 回答
0

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
于 2013-02-08T18:48:18.910 回答