Интеграция вызовов функции fftw C внутри системного кода verilog

Я успешно установил библиотеку fftw C в моей системе Linux. Вот больше информации о fftw c => http://www.fftw.org/ У меня есть пример кода C, который может успешно вызывать функции fftw C. Ниже приведен код C c и команда для запуска кода C: Код:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>
#include <fftw3.h> 

int main(void)
{
    double FFT_in[] = {0.1, 0.6, 0.1, 0.4, 0.5, 0, 0.8, 0.7, 0.8, 0.6, 0.1,0};
    double *IFFT_out;
    int i,size = 12;

    fftw_complex *middle;

    fftw_plan fft;
    fftw_plan ifft;
    middle = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*size);
    IFFT_out = (double *) malloc(size*sizeof(double));

    fft = fftw_plan_dft_r2c_1d(size, FFT_in, middle, FFTW_ESTIMATE);  //Setup fftw plan for fft (real 1D data)
    ifft = fftw_plan_dft_c2r_1d(size, middle, IFFT_out, FFTW_ESTIMATE);   //Setup fftw plan for ifft

    fftw_execute(fft);
    fftw_execute(ifft);

    printf("Input:    \tFFT_coefficient[i][0]      \tFFT_coefficient[i][1]   \tRecovered Output:\n");

    for(i=0;i<size;i++)
        printf("%f\t%f\t\t\t%f\t\t\t%f\n",(FFT_in[i]),middle[i][0],middle[i][1],IFFT_out[i]/size);

    fftw_destroy_plan(fft);
    fftw_destroy_plan(ifft);
    fftw_free(middle);
    free(IFFT_out);

    return 0;
}

Я могу успешно запустить этот код с помощью следующей команды gcc: gcc -g -Wall -I/home/usr/fftw/local/include -L/home/usr/fftw/local/lib fftw_test.c -lfftw3 -lm -o fftw_test

Теперь я хочу вызвать эту функцию внутри системного verilog, используя метод DPI. Прежде чем я покажу свою проблему, ниже приведен пример тестового примера DPI-C/systemverilog, который я мог успешно выполнить: C:code

#include <stdio.h>
#include <stdlib.h>
#include "svdpi.h"

int add(x,y)
{
    int z;
    z=x+y;
    printf("This is from C:%d+%d=%d\n",x,y,z);
    return z;
}

Вызов функции выше C из системного verilog с использованием DPI:

module top;
import "DPI-C" function int add(int a, int b);
int a,b,j;

initial begin
    $display("Entering in SystemVerilog Initial Block\n");
    #20
     a=20;b=10;
    j = add(a,b);
    $display("This is from System Verilog:Value of J=%d",j);
    $display("Exiting from SystemVerilog Initial Block");
    #5 $finish;

end

endmodule

и, наконец, я мог успешно выполнить это с помощью команды irun irun -f run.f, где run.f содержит следующие команды:

# Compile the SystemVerilog files
basicadd.sv 
-access +rwc
# Generate a header file called _sv_export.h
-dpiheader _sv_export.h
# Delay compilation of testexport.c until after elaboration
-cpost add.c -end
# Redirect output of ncsc_run to a log file called ncsc_run.log
-log_ncsc_run ncsc_run.log

Теперь моя настоящая проблема: когда я пытаюсь связать fftw C с системным verilog, я не могу его запустить. Ниже мой C-код, который очень похож на самый первый C-код, который я опубликовал: C-код:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>
#include <fftw3.h>
#include "svdpi.h" 

void fftw_test_DPI(double FFT_in[],int size)
{

    double *IFFT_out;
    int i;

    fftw_complex *middle;

    fftw_plan fft;
    fftw_plan ifft;
    middle = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*size);
    IFFT_out = (double *) malloc(size*sizeof(double));

    fft = fftw_plan_dft_r2c_1d(size, FFT_in, middle, FFTW_ESTIMATE);  //Setup fftw plan for fft (real 1D data)
    ifft = fftw_plan_dft_c2r_1d(size, middle, IFFT_out, FFTW_ESTIMATE);   //Setup fftw plan for ifft

    fftw_execute(fft);
    fftw_execute(ifft);

    printf("Input:    \tFFT_coefficient[i][0]      \tFFT_coefficient[i][1]   \tRecovered Output:\n");

    for(i=0;i<size;i++)
        printf("%f\t%f\t\t\t%f\t\t\t%f\n",FFT_in[i],middle[i][0],middle[i][1],IFFT_out[i]/size);

    fftw_destroy_plan(fft);
    fftw_destroy_plan(ifft);
    fftw_free(middle);
    free(IFFT_out);

    //return IFFT_out;
}

Вот мой системный verilog, где я вызываю вышеуказанную функцию C:

module top;
import "DPI-C" function void fftw_test_DPI(real FFT_in[0:11], int size);
real j [0:11];
integer i,size;
real FFT_in [0:11]; 

initial begin
    size = 12;
    FFT_in[0] = 0.1;
     FFT_in[1] = 0.6;
     FFT_in[2] = 0.1;
     FFT_in[3] = 0.4;
     FFT_in[4] = 0.5;
     FFT_in[5] = 0.0;
     FFT_in[6] = 0.8;
     FFT_in[7] = 0.7;
     FFT_in[8] = 0.8;
     FFT_in[9] = 0.6;
     FFT_in[10] = 0.1;
     FFT_in[11] = 0.0;

    $display("Entering in SystemVerilog Initial Block\n");
    #20
     fftw_test_DPI(FFT_in,size);

    $display("Printing recovered output from system verilog\n"); 
    //for(i=0;i<size;i++)
        //$display("%f\t\n",(j[i])/size);

    $display("Exiting from SystemVerilog Initial Block");
    #5 $finish;

end

endmodule

И, наконец, я попробовал запустить его несколькими способами, я упомянул пару способов, которые я попробовал:

irun -f run_fftw.f where run_fftw.f contains:
# Compile the SystemVerilog files
fftw_test.sv 
-access +rwc
# Generate a header file called _sv_export.h
-dpiheader _sv_export.h
# Delay compilation of fftw_test.c until after elaboration
-cpost fftw_test_DPI.c -end
-I/home/usr/fftw/local/include -L/home/usr/fftw/local/lib fftw_test_DPI.c -lfftw3 -lm 
# Redirect output of ncsc_run to a log file called ncsc_run.log
-log_ncsc_run ncsc_run.log

но это приводит к ошибке ниже: сборка библиотеки run.so ld: /home/usr/fftw/local/lib/libfftw3.a(mapflags.o): перемещение R_X86_64_32 против `.rodata'не может использоваться при создании общего объекта; перекомпилировать с -fPIC /home/usr/fftw/local/lib/libfftw3.a: не удалось прочитать символы: неверное значение collect2: ld вернул 1 состояние выхода make: * [/home/usr/DPI/./INCA_libs/irun. lnx8664.12.20.nc/librun.so] Ошибка 1 ncsc_run: *E,TBBLDF: Не удалось создать тестовую библиотеку /home/usr/DPI/./INCA_libs/irun.lnx8664.12.20.nc/librun.so

2-й метод: 1.gcc -fPIC -O2 -c -g -I / home / ss69 / fftw / local / include -I. -L / home / usr / fftw / local / lib -L. -o fftw_test_DPI.o fftw_test_DPI.c -lfftw3 -lm

2.gcc -shared -o libdpi.so fftw_test_DPI.o

3.irun -64bit -sv_lib libdpi.so fftw_test.sv

Это приводит к ошибке ниже: Загрузка снимка worklib.top:sv .................... Готово ncsim> run Ввод в SystemVerilog Начальный блок

ncsim: ошибка поиска символа:./libdpi.so: неопределенный символ: fftw_malloc

Я знаю, что за моим постом довольно сложно следить, но я был бы очень признателен за любую помощь.

2 ответа

Вам может понадобиться export или же setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:/home/usr/fftw/local/lib:., Если только ваш libdpi.so связан со статической библиотекой FFTW, в противном случае ваш код должен будет загрузить динамическую версию библиотеки FFTW (libfftw.so?), поскольку вы используете fftw_* API-интерфейсы.

Это хорошее описание и краткое изложение проблемы, которую мы обсуждали ранее. Я обычно не работаю в системе * nix, поэтому не могу предложить какие-либо конкретные детали. Я укажу, что подход к проблеме, подобной этой, - это хороший метод.

Ваш первый шаг - вызов кода FFT непосредственно из main() это хорошо. Тем не менее, я не видел шаг, где (НЕ ИСПОЛЬЗУЯ SystemVerilog или ncsim) вы скомпилировали код fft в библиотеку, а затем вызвали этот код из main(),

Казалось бы, чтобы получить код, который будет храниться в отдельной библиотеке и вызываться из main() это необходимый шаг. После того, как у вас это получится, вы сможете включить библиотеку fft в материал SystemVerilog без необходимости одновременно компилировать процедуру fft?

Другие вопросы по тегам