Импорт функций 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.

2 ответа

Вы не можете передавать файловые дескрипторы между SystemVerilog и C через DPI, поэтому я не думаю, что можно импортировать функцию напрямую как есть.

Если все, что вам действительно нужно, это получить функциональность в 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, если достигнут конец файла. Ваша оригинальная функция может работать после конца file1 так как вы не проверяете EOF.

SystemVerilog включает DPI (интерфейс прямого программирования), который позволяет вашему SystemVerilog вызывать функции C и даже позволяет вашему C вызывать задачи / функции SystemVerilog. Ознакомьтесь с разделом 35 IEEE 1800-2009 и Приложением H & I. Существуют ограничения для типов данных, поэтому ознакомьтесь с Приложением H.7.4, в котором приведено базовое отображение типов SV / C.

Чтобы вызвать функции C в SystemVerilog, просто импортируйте его в желаемую область (например, модуль или пакет)

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

Для вызова SystemVerilog из C требуется один дополнительный шаг.

В СВ:

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

В С:

extern return_type SV_function_name( /* args */);

В зависимости от вашего симулятора вам может понадобиться сначала скомпилировать код C и ссылаться на объектный файл или просто включить исходный файл в список файлов. Вам необходимо добавить опции для вашего симулятора, поэтому проверьте руководство.

Вот некоторые ресурсы, которые могут помочь вам начать:


Редакция: используйте оболочку для перевода, так как FILE не транслируется через DPI. C о const char* сопоставляет с SystemVerilog's 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
Другие вопросы по тегам