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* |
출처)
'공부 기록 > 회로설계' 카테고리의 다른 글
[Verilog] 베릴로그 function vs task (0) | 2024.08.05 |
---|---|
반도체 회로설계 헷갈리지만 중요한 개념, jitter, skew, slack, slew 란? (0) | 2024.07.31 |
하드웨어 검증 언어, System Verilog 란? - Testbench, DUT (0) | 2022.12.16 |
[Verilog] reg vs wire - reg와 wire의 차이점 (0) | 2022.05.05 |
[Verilog] Blocking Assignment vs Non-Blocking Assignment - 베릴로그 절차형 할당문의 종류 (0) | 2022.04.21 |