공부 기록/회로설계

Direct Programming Interface (DPI) 개념 및 사용법

tomatt0 2023. 6. 1. 15:15
반응형

0. Direct Programming Interface (DPI) 란?

Direct Programming Interface (DPI)란 system verilog와 C (혹은 C++)간의 인터페이스로, 상호 간 task 혹은 function을 export/import 하여 사용할 수 있도록 하는 인터페이스이다.

 

하드웨어 설계 후 검증을 위해 system verilog를 가장 많이 사용할 것이다. C 언어만을 사용하여 하드웨어를 제어하는 데에는 보통 아래와 같은 어려움이 있다.

 

  • 하드웨어 접근 (access) 자체가 어렵다.
  • Delay를 모델링할 수 없다.

이러한 C언어의 제약사항을 DPI를 사용하여 극복할 수 있다. C 코드에서 verilog로 작성된 task를 호출하여 사용하고, 혹은 그 반대, 즉 system verilog 코드에서 C로 작성된 함수를 호출하여 사용할 수 있다.

 

이를 적절히 활용하여, C로 작성된 알고리즘을 system verilog 환경에서 검증할 수 있다.


 

1. 사용법

1. 헤더파일 

C 코드 상단에 아래와 같이 DPI 헤더를 선언합니다.

#include "svdpi.h"

 

2. Import 

SV (System Verilog) 코드에서 C언어로 작성된 함수를 호출하여 사용하고자 할 때, 아래와 같이 SV side에서  import 한다.

 

  • 해당 함수가 input으로 전달한 argument 외에 SV의 data를 사용하는 경우 context property를 사용한다.
  • 함수의 input/output argument를 명시한다.
import "DPI-C" [context] function int FUNCTION_NAME (input int a);

 

3. Export 

반대로 C 코드에서 SV task (혹은 function)을 호출하여 사용하고자 할 때, 아래와 같이 SV side에서 export 한다.

export "DPI-C" task TASK_NAME;

 

위와 같이 export statement를 통해 SV side에서 export된 task를 C에서 호출하여 사용하기 위해서는,  C side에도 아래와 같이 extern 선언을 해주어야 한다.

extern void TASK_NAME(int, int);

2. 자료형 매칭 (Data Type)

DPI를 사용할 때, data type을 매칭시켜주는 것이 중요하다. 매칭이 되는 경우도 있지만 그렇지 않은 경우도 있기 때문에 사용자가 이를 매칭하여 선언해주어야 한다.

 

SV C (input) C (out/inout)
byte char char*
shortint short int short int*
int int int*
longint long int long int*
shortreal float float*
real double double*
string const char* char**
string[n] const char** char**
bit svBit svBit*
logic, reg svLogic svLogic*
bit[N:0] const svBitVecVal* svBitVecVal*
reg[N:0], logic[N:0] const svLogicVecVal* svLogicVecVal*
array[size] type[] type[]
array[M][N] type[][] type[][]
array[] (import only) const svOpenArrayHandle svOpenArrayHandle
chandle const void* void*

 

 

출처)

https://wikidocs.net/170339

 

반응형