SystemVerilog DPI
SystemVerilog DPISystemVerilog DPI(Direct Programming Interface)는 SystemVerilog를 외국어와 인터페이스하기 위해 사용할 수 있는 인터페이스입니다.이러한 외국어는 C, C++, SystemC 및 기타 언어일 수 있습니다.DPI는 SystemVerilog 레이어와 외국어 레이어의 2개의 레이어로 구성됩니다.두 층 모두 서로 격리되어 있습니다.어떤 프로그래밍 언어가 실제로 외국어로 사용되는지는 투과적이며 이 인터페이스의 System-Verilog 측과 관련이 없습니다.SystemVerilog 컴파일러도 외국어 컴파일러도 다른 언어의 소스 코드를 분석할 필요가 없습니다.동일한 온전한 SystemVerilog 계층에서 서로 다른 프로그래밍 언어를 사용하고 지원할 수 있습니다.그러나 현재 SystemVerilog는 C 프로그래밍 언어에 대해서만 외국어 계층을 정의합니다.
이 인터페이스의 동기는 두 가지입니다.방법론적인 요건은 인터페이스가 SystemVerilog(이하 외국어) 이외의 언어(또는 그 이상의 언어)로 작성할 수 있는 이종 시스템(설계 또는 테스트벤치)을 구축할 수 있도록 해야 한다는 것입니다.한편, PLI 또는 VPI의 지식이나 오버헤드를 사용하지 않고, 통상 C 또는 C++로 기술된 기존 코드를 쉽고 효율적으로 연결할 수 있는 방법도 필요합니다.DPI는 블랙박스의 원리를 따릅니다.즉, 컴포넌트의 사양과 실장은 명확하게 분리되어 있으며, 실제 실장은 시스템의 나머지 부분에 대해 투명합니다.따라서, 구현의 실제 프로그래밍 언어 또한 투명하지만, 이 표준은 C 링크 의미론만을 정의한다.SystemVerilog 코드와 외국어의 구분은 SystemVerilog의 자연 캡슐화 유닛으로서 함수를 사용하는 것에 근거하고 있습니다.대체로 어떤 함수도 블랙박스로 취급할 수 있으며 콜을 변경하지 않고 SystemVerilog 또는 외국어로 투과적으로 구현할 수 있습니다.
설명.
Direct Programming Interface(DPI; 다이렉트프로그래밍 인터페이스)를 사용하면 SystemVerilog와 Foreign Language 간의 직접 언어 간 함수 호출이 가능합니다.외국어로 구현된 함수는 SystemVerilog에서 호출할 수 있으며 이러한 함수를 Import 함수라고 합니다.마찬가지로 SystemVerilog에서 구현된 함수는 Foreign Language(C/C++ 또는 System C)에서 호출할 수 있습니다.이러한 함수는 Export 함수라고 불립니다.DPI를 사용하면 함수 인수를 통해 두 도메인 간에 데이터를 전송하고 반환할 수 있습니다.
함수 Import 및 내보내기
1) 함수 Import:- 외국어로 구현된 기능을 SystemVerilog에서 Import하여 사용할 수 있습니다.SystemVerilog에서 사용되는 외국어 함수를 Import 함수라고 합니다.
가져온 기능 및 태스크 속성
- Import 함수는 즉시 실행을 완료하고 시뮬레이션 시간을 0으로 해야 합니다.가져온 작업은 시간이 걸릴 수 있습니다.
- Import된 함수에는 input 인수, output 인수 및 inout 인수를 사용할 수 있습니다.
- 형식 입력 인수는 수정할 수 없습니다.그러한 인수가 함수 내에서 변경되는 경우, 변경은 함수 외부에서 보이지 않아야 한다.
- Import된 함수는 형식 출력 인수의 초기 값을 가정하지 않아야 합니다.출력 인수의 초기값은 결정되지 않았으며 구현에 따라 달라집니다.
- Import된 함수는 정식 inout 인수의 초기값에 액세스할 수 있습니다.Import 함수가 정식 inout 인수에 가한 변경은 함수 외부에서 확인할 수 있어야 합니다.
- Import 함수는 SystemVerilog 코드에 의해 할당된 메모리를 해방하거나 SystemVerilog 코드가 Foreign 코드 또는 (Foreign Compiler)에 의해 할당된 메모리를 해방할 것으로 예상해서는 안 됩니다.
- Import된 태스크에 호출하면 현재 실행 중인 스레드가 일시 중단될 수 있습니다.이 문제는 Import된 태스크가 내보내기된 태스크를 호출하고 내보내기된 태스크가 지연 제어, 이벤트 제어 또는 대기 문을 실행할 때 발생합니다.따라서 Import된 태스크는 여러 실행 스레드에서 동시에 활성화될 수 있습니다.
- Import된 함수 또는 태스크에는 pure 또는 context라는 특수 속성을 사용할 수 있습니다.
순수하고 컨텍스트적인 태스크와 기능
순수 함수
결과가 부작용 없이 입력 인수의 값에만 의존하는 함수를 순수 함수라고 합니다.
순수함수의 특성
- 출력 또는 입력이 없는 비포이드 함수만 Pure 함수로 호출할 수 있습니다.
- Pure로 지정된 함수는 부작용이 없어야 하며, 그 결과는 입력 인수의 값에만 의존해야 합니다.
- Pure 함수 호출은 결과가 필요하지 않거나 같은 값의 입력 인수에 대한 결과를 재계산하지 않고 재사용할 수 있는 경우 안전하게 제거할 수 있습니다.
- 순수 함수는 직접 또는 간접적으로 다음을 수행하지 않는 것으로 가정합니다.
- 임의의 파일 조작을 실행합니다.
- 환경변수, 공유 메모리, 소켓 등의 읽기 또는 쓰기
- Global 또는 Static 변수와 같은 영구 데이터에 액세스합니다.
- 가져온 태스크는 순수 태스크로 선언할 수 없습니다.
컨텍스트 태스크 및 기능
"내보낸" 태스크 또는 함수를 호출하거나 실제 인수 이외의 SystemVerilog 데이터 개체에 액세스하는 Import된 태스크 또는 함수를 컨텍스트 태스크 또는 함수라고 합니다.
컨텍스트 태스크 및 기능의 속성
1) 컨텍스트 Import 태스크 또는 함수는 호출(PLI/VPI) 또는 내보내기 태스크 또는 함수를 호출하여 SystemVerilog 데이터 개체에 액세스(읽기 또는 쓰기)할 수 있습니다.따라서 컨텍스트 태스크 또는 함수에 대한 호출은 SystemVerilog 컴파일러 최적화의 장벽이 됩니다.
수입신고
수입품 "DPI-C" 함수 int calc_discl (입력 int a);
수출신고
수출. 'DPI-C' my_cfunction(기능) = 기능. 기능;
Unix 함수 호출
SystemVerilog 코드는 UNIX 함수를 래퍼 없이 Import하여 직접 호출할 수 있습니다.
DPI의 예
SystemVerilog에서 'C' 함수를 호출합니다.
C - 코드 파일
#실패하다 <stdio.h> #실패하다 <stdlib.h> 외부 인트 더하다() { 인트 a = 10, b = 20; a = a + b; 인쇄물("추가 성공 및 결과 = %d\n", a); 돌아가다 a; }
SystemVerilog 코드 파일
모듈 tb_dpi; 수입품 "DPI-C" 함수 int add(); 수입품 "DPI-C" 함수 int sleep (입력 int secs); 인트 j; 초기의 시작한다. $표시("SystemVerilog 초기 블록에 들어가는 중"); #20 j = 더하다(); $표시("J 값 = %d", j); $표시("유닉스 기능으로 3초간 절전"); 수면.(3); $표시("SystemVerilog 초기 블록에서 종료 중"); #5 $끝내라.; 끝. 엔드 모듈
레퍼런스
- Gopi Krishna (2005-11-09). "SystemVerilog DPI Tutorial".
- 프로젝트 VeriPage의 SystemVerilog DPI 튜토리얼