SystemVerilog

SystemVerilog DPI 사용법

guruzoa 2012. 8. 3. 11:27

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

이상 끝~~~