필드 프로그래머블 게이트 어레이(Field Programmable Gate Arrays), 즉 FPGA는 고속 실시간 디지털 시스템에서 널리 사용되고 있습니다. FPGA는 시간에 민감한 애플리케이션, 디지털 신호 처리 또는 심지어 암호화 채굴에 사용될 수 있습니다. 속도와 전력 효율성 덕분에 FPGA는 재사용 가능한 고속 애플리케이션에 적합합니다. FPGA의 작동 속도는 계속해서 놀라운 속도로 증가하고 있지만, 연속 통합(Continuous Integration, CI) 파이프라인으로의 채택은 그렇게 빠르지 않은 것 같습니다. 이 기사에서는 CI 파이프라인의 개념, FPGA에의 적용, 그리고 이를 설정하는 방법에 대한 예제를 살펴보겠습니다.
여러분이 눈치채지 못했다면, 저는 사실상 연속 통합을 먹고, 자고, 숨쉬고 있습니다. PCB 설계를 위한 CI나 임베디드 시스템을 위한 CI 등, 저는 항상 시스템의 모든 종류에 대해 빌드를 지속적으로 개선하고 자동화할 방법을 찾고 있습니다. 최근에 받은 피드백 중 하나는 FPGA와 CI 시스템 간의 진행이 그리 많지 않다는 것이었습니다. CI와 FPGA의 진정한 원리는 다른 모든 CI 시스템과 동일한 논리를 따릅니다: 우리를 위해 모든 중량 작업을 수행할 수 있는 반복 가능한 빌드 환경을 만드는 것입니다. FPGA 기반 CI 시스템에서는 일반적으로 다음 세 가지 단계를 볼 수 있습니다:
그림 1: FPGA CI 파이프라인의 단계
각 단계는 그 자체로 중요하며 각각의 설정이 필요합니다. 각 단계를 살펴보며 그들이 무엇을 의미하는지, 그리고 어떻게 구현하는지를 이해해 보겠습니다.
시뮬레이션은 FPGA 설계의 필수적인 부분입니다. 타겟에 로드할 FPGA 이미지를 구축하는 데 많은 시간이 걸릴 수 있습니다. 코드를 작성하고, 빌드하고, 하드웨어에서 테스트하는 대신, 시뮬레이션은 FPGA의 동작을 시뮬레이션하는 환경 내에서 우리의 코드 또는 레지스터 전송 수준(Register-Transfer Level, RTL)을 신속하게 테스트할 수 있는 능력을 제공합니다. 일반적으로 이는 사용자 수준에서 수행되지만, FPGA 시뮬레이션을 CI 파이프라인에 통합하는 것이 점점 더 인기를 끌고 있습니다. 이는 누군가가 자신의 코드를 리포지토리에 푸시하고, 클라우드의 어딘가에서 (자체 확인) 시뮬레이션을 실행하기 위한 파이프라인이 시작된다는 것을 의미합니다. "클라우드의 어딘가"에서 이를 실제로 수행하기 위해서는, 캡슐화되거나 컨테이너화될 수 있는 자급자족 환경을 만들어야 합니다. 우리는 Docker 컨테이너라고 하는 것을 사용하여 이를 수행합니다. 이러한 컨테이너는 거의 어디에서나 실행할 수 있는 가상 머신과 비슷합니다. 이 특정 Docker 컨테이너는 사용자가 Icarus Verilog를 모든 Linux 시스템 내에서 실행할 수 있는 컨테이너화된 환경을 생성합니다. 그런 다음 해당 컨테이너를 사용하여 우리의 FPGA 시뮬레이션 파이프라인을 생성합니다. 이 예제에서는 Icarus Verilog를 사용하여 클라우드에서 간단한 "Hello World" 파이프라인이 발생하는 것을 볼 수 있습니다. 이는 어떤 FPGA 시뮬레이션 도구로도 수행할 수 있다는 점에 유의해야 합니다.
그림 2: Gitlab CI를 사용한 FPGA 시뮬레이션의 파이프라인 실행
FPGA 파이프라인 내에서 두 번째로 매우 중요한 단계는 빌드 단계입니다. 우리는 FPGA 설계를 위해 합성하고, 배치 및 경로를 설정하며, 비트스트림을 생성할 수 있어야 합니다. 이는 일반적으로 공급업체(예: Xilinx, Intel, Microchip 등)에서 제공하는 도구 내에서 사용자가 수행합니다. 로컬에서 빌드하는 대신 다른 곳에서 빌드가 발생하기를 원합니다. 하지만 FPGA 도구는 보통 크기가 매우 크기 때문에 이 과정은 약간 까다로울 수 있습니다. 많은 사용자가 선택하는 한 가지 방법은 모든 빌드 파이프라인을 실행하는 전용 “빌드 머신”을 갖는 것입니다. 이 접근 방식은 나쁘지 않지만 확장성도 없고 단일 실패 지점이 될 수 있습니다. 다른 사람들은 FPGA 도구를 컨테이너화하려고 시도했지만 이러한 이미지의 크기가 100GB를 초과할 수 있어 본질적으로 클라우드 애플리케이션에 사용할 수 없게 됩니다. 제가 잘 작동한다고 생각하는 중간 방법은 네트워크 설치 방법입니다. 예를 들어, 저는 Vivado 2019.1을 실행하는 컨테이너를 만들었지만 도구 자체는 이미지에 설치되어 있지 않아서 (따라서 이미지 크기는 300MB 미만입니다) 이 방법을 사용했습니다. 저는 Vivado를 네트워크 드라이브에 설치했으며 (이 경우 AWS의 EFS) 그 후 Docker 컨테이너 내에 마운트했습니다. 제가 AWS에서 파이프라인을 실행하기 때문에 EFS와 EC2 인스턴스(쿠버네티스 노드) 간의 지연 시간은 미미합니다.
이 예제에서 저는 Digilent의 Arty A7 장치를 사용하여 디지털 필터를 생성하고 있습니다. 저장소에 푸시할 때마다 장치의 비트스트림 파일을 생성하기 위해 자동화된 빌드 스크립트를 사용하고 있습니다. 출력에서 볼 수 있듯이 Docker 컨테이너 내에 존재하지 않더라도 Vivado를 성공적으로 호출합니다 (즉, 외장 드라이브로 마운트됨).
그림 3: Gitlab CI를 사용한 FPGA 빌드 파이프라인 실행
테스트 단계는 개인과 프로젝트에 따라 달라질 것입니다. CI 파이프라인 내에서 테스트의 목적은 가능한 한 많은 것을 자동화하는 것입니다. 제가 Arduino용 DSP 예제를 자동화한 것처럼 여기에서도 동일하게 할 수 있습니다. FPGA에 대한 자동화된 테스트 솔루션을 다루는 것은 이 기사의 범위를 벗어납니다. 여기서의 주요 원칙은 테스트가 반복 가능하고 캡슐화된 또는 컨테이너화된 환경 내에서 실행될 수 있도록 하는 것입니다. 테스트는 CI 파이프라인의 중요한 부분이며 사용자가 처리할 수 있는 수준에서 구현해야 한다는 점을 기억하는 것이 중요합니다.
이 기사에서는 FPGA를 위한 CI 파이프라인의 개념을 다루었습니다. FPGA 파이프라인을 구성하는 세 가지 중요한 단계인 시뮬레이션, 빌드 및 테스트를 검토했습니다. 시뮬레이션 및 빌드 파이프라인의 예를 살펴보았고 테스트의 중요성에 대해 논의했습니다. 이 기사를 검토하고 예제를 본 후 사용자는 FPGA 기반 CI 파이프라인을 생성하는 데 필요한 기본 요소를 이해할 수 있을 것입니다.
내장 시스템을 지원하기 위해 사용자 맞춤형 FPGA 보드를 빌드할 준비가 되면 Altium Designer®의 완벽한 PCB 설계 및 레이아웃 기능 세트를 사용하십시오. PCB 작업을 완료하고 협력자 또는 제조업체와 설계를 공유할 준비가 되면 Altium 365™ 플랫폼을 통해 완료된 설계를 공유할 수 있습니다. 고급 전자 제품을 설계하고 제작하는 데 필요한 모든 것이 하나의 소프트웨어 패키지에 있습니다.
Altium Designer와 Altium 365로 할 수 있는 것의 표면만 긁어냈습니다. 지금 Altium Designer + Altium 365의 무료 체험을 시작하세요.