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;
    }

System verilog テスト ベンチでこの関数を呼び出す方法を教えてください。

4

2 に答える 2

1

DPI を介して SystemVerilog と C の間でファイル記述子を渡すことはできないため、関数をそのまま直接インポートすることはできないと思います。

SystemVerilog で機能を取得するだけで十分な場合は、DPI 経由でインポートするよりも、SystemVerilog に移植する方が簡単です。

このようなものは動作するはずです (テストされていません!):

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は、ファイルの終わりに達した場合に EOF をキャプチャするために 9 ビットとして宣言されているためです。file1EOF をチェックしていないため、元の関数は の終わりを過ぎて実行される可能性があります。

于 2013-02-07T02:25:36.977 に答える
0

SystemVerilog には、SystemVerilog が C 関数を呼び出せるようにする DPI (Direct Programming Interface) が含まれており、C が SystemVerilog タスク/関数を呼び出せるようにすることもできます。IEEE std 1800-2009 Section 35 および Annex H & I を確認してください。データ型には制限があるため、基本的な SV/C タイプ マッピングについては Annex H.7.4 を確認してください。

SystemVerilog で C 関数を呼び出すには、目的のスコープ (モジュールやパッケージなど) にインポートするだけです。

import "DPI-C" context function C_function_name(/* args */);

C から SystemVerilog を呼び出すには、追加の手順が 1 つ必要です。

SVで:

export "DPI-C" function SV_function_name; /*no args */

C で:

extern return_type SV_function_name( /* args */);

シミュレータによっては、最初に C コードをコンパイルしてオブジェクト ファイルを参照するか、ファイル リストにソース ファイルを含める必要がある場合があります。シミュレータにオプションを追加する必要があるため、マニュアルを確認してください。

開始するのに役立つリソースを次に示します。


リビジョン: FILE は DPI 間で変換されないため、変換ラッパーを使用します。C のconst char*マップは SystemVerilog のstring.

子:

#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
}
/* ... */

システムベリログ:

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 に答える