본문 바로가기

SystemVerilog

[SystemVerilog] DPI의 심화(2) - pure와 context의 의미

SystemVerilog DPI 심화 개념

Pure

Import한 function을 pure로 선언하면 여러모로 최적화된 사용이 가능하다.

시뮬레이션 성능이 개선될 수 있으나 몇몇 제한이 걸린다.

Function은 아래 조건을 충족할 때만 pure 선언이 가능하다.

 

1) 함수의 result가 오직 input에만 관계 있다.

2) 함수를 호출해도 side effect가 없다.

값을 직간접적으로 바꾸지 않는다.

다른 함수를 호출하지 않는다.

File operation을 하지 않는다. Read/Write 동작이 없다.

3) output이나 inout argument가 없다.

output이나 inout argument가 있을 경우, 이 함수는 output/inout argument를 바꿀 수 있으므로 side effect가 발생할 수 있다. 이는 return value와는 다르다.

4) 함수여야 한다.

task는 result나 return value를 가질 수 없으므로  pure가 될 수 없다. 

 

내 나름의 직관적인 해석을 붙여보자면

pure는 아주 보수적이고 순혈의 함수이다.

진짜 어떤 값을 구하기 위한 function일 뿐,

내부 데이터를 직간접적으로 수정하지 않으며

파일동작도 하지 않고

연산값을 내뱉는 용도로만 사용되는

보수적인 친구임

 

 시뮬레이터는 이런 pure 함수에 대해서 개선된 시뮬레이션 성능을 제공하나 봄. 

 

 

 

pure function 선언 방법

import "DPI" pure function real sin(real r);

 

 

 

Context 

imported function이 exported function을 호출하거나 SV data object에 access할 때, 그 imported function은 context로 선언되어야 한다!

그러니까 SystemVerilog에서 C함수를 import하는데, 그 함수도 알고보니 SV에 접근하고 있었던 애였다. ( 단방향이 아니라 양방향으로 access하는 친구였다.) 그럴 때에는 import하려는 C함수를 context로 선언해야 한다.

안그러면 unpredictable behavior, 시뮬레이션 충돌을 야기할 수 있다.

 

하지만 context function의 호출은 simulation performance를 저하한다.

모든 export function은 항상 context functins이다. 

 

다시 해석해보자면..

pure는 SV에서 호출하지만 SV내 데이터들을 건들지 않는 함수였다.

그런데 context는 다르다.  systemverilog data에 access가 가능한 imported function들은 context function이다.

 

 

이런 함수들을 import할 때에는 반드시 context로 identify해주어야 한다. 

 

 

context function 선언 방법

import"DPI" context function a_complicated_function (input bit bb, output string ss);