SystemVerilog DPI는 생각보다 쓰기 간편하다.
Cadence 의 IUS82에서 irun으로 쓰면 간단하게 command 몇개만 추가하면 바로 사용할 수 있다. 물론, DPI 관련 study는 해야겠지만 ㅋㅋㅋ
업무에 활용할 수 있도록 많은 걸 써봐야겠음
Cadence IUS82 사용시
irun +access+rw -sv -f run.f
Synopsys VCS 사용시
vcs -R -full64 -debug_all +notimingcheck +v2k -sverilog -f run.f
간단하게 systemverilog syntax 사용한다고 추가하면 바로 사용가능함
Verilog Side
import "DPI" function int tu_calc(input real pclk, input real lclk, input int lane_count, input int color_depth);
initial begin
iTU_VD = tu_calc(`PCLK, `LCLK*2, LaneCount, COLOR_DEPTH);
end
C Side
#include <stdio.h>
/* nbcode "passadd" start */
int tu_calc(double pclk, double lclk, int lane_count, int color_depth)
{
double pclk_freq;
double lclk_freq;
double vd_symbol;
double avg_vd_symbol;
pclk_freq = (1 / pclk) * 1000;
printf("%f\n", pclk_freq);
lclk_freq = (1 / lclk) * 1000;
printf("%f\n", lclk_freq);
vd_symbol = (color_depth * pclk_freq / lane_count) / 8;
printf("vd symbol = %f\n", vd_symbol);
avg_vd_symbol = (vd_symbol / lclk_freq * 64) + 0.5; // Upper
if (avg_vd_symbol > 64.0) {
printf("Overflow TU Size\n");
avg_vd_symbol = 0;
}
printf("avg vd symbol = %f\n", avg_vd_symbol);
printf("int avg vd symbol = %d\n", (int)avg_vd_symbol);
return (int)avg_vd_symbol;
}
이상 끝~~~