Linux システムに fftw C ライブラリを正常にインストールしました。fftw c の詳細はこちら => http://www.fftw.org/ 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
ここで、DPI メソッドを使用してシステム Verilog 内でこの関数を呼び出したいと思います。私の問題を示す前に、正常に実行できた DPI-C/systemverilog テストケースのサンプルを以下に示します。
#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;
}
DPI を使用してシステム Verilog から上記の C 関数を呼び出す:
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;
}
上記の C 関数を呼び出す私のシステム Verilog は次のとおりです。
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
しかし、これにより以下のエラーが発生します: building library run.sold: /home/usr/fftw/local/lib/libfftw3.a(mapflags.o): relocation R_X86_64_32 against `.rodata' can not be used when make a shared object ; -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
これにより、以下のエラーが発生します: Loading snapshot worklib.top:sv ................... Done ncsim> run Entering in SystemVerilog Initial Block
ncsim: シンボル検索エラー: ./libdpi.so: 未定義のシンボル: fftw_malloc
私の投稿をフォローするのはちょっと難しいことは承知していますが、助けていただければ幸いです。