
openPCIE는 Artix-7 FPGA를 PCI Express(PCIe) 루트 컴플렉스(RC)로 사용하는 오픈소스 하드웨어·소프트웨어 프로젝트다. 전용 PCIe 호스트가 없는 FPGA 종단 장치(EP)를 자체 RISC-V 소프트코어로 제어하고, 시뮬레이션부터 실제 보드 검증까지 이어지는 개발 환경을 제공한다.
프로젝트는 Xilinx Series 7의 PCIe 하드 매크로와 GTP IP, 저지터 PLL을 사용하며 주변 로직과 RTL, 드라이버, 데모 앱, 하드웨어·소프트웨어 공동 시뮬레이션(co-simulation)을 오픈소스로 공개한다. 따라서 Xilinx 하드 매크로까지 제거한 완전한 오픈소스 PCIe 스택은 아니다. 장기 목표는 혼합신호 SerDes와 PLL 등을 포함해 하드 매크로 의존성을 단계적으로 줄이는 것이다. 오픈소스 PCIe EP 코어가 필요한 경우에는 openCologne-PCIE 저장소를 참고할 수 있다.
현재 구현의 목표는 제작자가 FPGA 안의 RISC-V 시스템온칩(SoC)에서 PCIe 주변장치를 직접 제어하도록 하는 것이다. 기존 FPGA PCIe EP 장치는 대개 라즈베리파이 ASIC이나 x86 PC 같은 메인보드의 독점 RC에 의존한다. openPCIE는 오픈백플레인과 FPGA 보드로 자체 RC를 구성해 이 구조를 바꾸려 한다. 프로젝트는 NGI0 Core Fund의 지원을 받았다.
하드웨어와 RTL 구성
하드웨어 플랫폼은 SQRL Acorn CLE-215+ FPGA 모듈과 프로젝트가 설계한 openPCIE 백플레인, PCIe 어댑터로 이뤄진다. CLE-215+에는 Xilinx Artix-7 XC7A200T FPGA가 탑재된다. M.2 M-key 규격의 FPGA 모듈은 Acorn Baseboard Mini를 거쳐 PCIe x4 에지 커넥터에 연결된다. 백플레인은 RC, EP, 스위치용 슬롯을 제공한다. CLE-215+는 NiteFury와 기능상 동일하며, 메모리는 각각 1GB와 512MB DDR3다. 하드웨어 참고 자료로 NiteFury 회로도를 제공한다.
XC7A200T의 주요 자원은 LUT6 134,600개, 플립플롭 269,200개, 블록 RAM 13Mbit, DSP 슬라이스 740개, GTP 트랜시버 4개(최대 6.6Gbit/s)다. 보드에는 16비트 1GB DDR3 SDRAM과 32MB QSPI 플래시, 사용자 LED 4개, 범용 입출력 4개, LVDS 쌍 4개가 있다. 자료에 적힌 215,360개 로직 셀은 물리적인 6입력 LUT 수를 단순한 4입력 LUT 기준으로 환산한 Xilinx 지표이며, 실제 칩 자원 수와는 구분된다.
RTL은 SystemVerilog 인터페이스로 연결된 모듈 구조다. RISC-V SoC가 AXI-Stream으로 TLP를 PCIe 스택에 넘기고, 스택은 데이터를 PCIE_2_1 하드 블록에 맞춰 변환한 뒤 PIPE를 통해 GTP 트랜시버를 구동한다. 설계별 자료는 공통 RTL, EP, 직접 연결 RC, 스위치 연결 RC 문서에 있다. Vivado IP를 쓰는 참고 설계도 별도 디렉터리에 공개돼 있다.
드라이버와 공동 시뮬레이션
소프트웨어는 FPGA 안의 소프트 RISC-V SoC에서 베어메탈로 실행된다. 일반 PC 운영체제가 자동으로 처리하는 PCIe 장치 탐색과 초기화를 이 프로젝트의 오픈소스 드라이버가 직접 수행한다. 드라이버는 장치를 찾고 BAR 크기를 읽어 확인한 뒤 정렬된 메모리 주소를 할당하며, 각 요청의 완료 상태를 확인하고 Command Register를 설정한다. 하드웨어 추상화 계층(HAL)은 지정된 메모리 주소를 읽고 쓰는 기능을 제공한다. 데모 앱은 EP로 메모리 쓰기를 수행하고, 다시 읽어 데이터 경로를 확인한다. 상세 내용은 소프트웨어 문서에 있다.
테스트벤치는 같은 환경에서 CPU 구현을 바꿔 사용할 수 있다. 비트스트림에 들어가는 RTL CPU는 기본적으로 eduBOS5이며 PicoRV32도 선택할 수 있다. VProc 가상 프로세서를 쓰는 공동 시뮬레이션 방식과 RISC-V 명령어 세트 시뮬레이터(ISS) 모델도 제공한다. CPU 선택은 make CPU=rtl|vproc|iss로 지정한다. 각 방식은 같은 PCIe 링크를 통해 같은 결과에 도달했다고 프로젝트는 설명한다. PCIe 링크 구동에는 pcieVHost, 메모리 모델에는 C 기반 희소 메모리 모델을 사용한다.
제어·상태 레지스터(CSR)의 RTL과 HAL은 하나의 SystemRDL 명세인 4.build/csr_build/csr.rdl에서 생성한다. peakrdl과 systemrdl-compiler를 사용해 하드웨어 레지스터 블록과 소프트웨어 헤더를 만들며, 공동 시뮬레이션용 헤더도 생성해 애플리케이션이 RISC-V와 VProc 환경에서 공통 API를 사용하도록 한다. 생성 절차는 빌드 문서에 정리돼 있다.
파형은 WaveCrux와 오픈소스 PCIe TLP 디코더 플러그인으로 살펴볼 수 있다. 프로젝트가 제공하는 세션은 펌웨어가 BAR0 크기를 읽어 확인하고 0x80000000에 배치하는 과정을 보여준다. Ferrite의 PIPE 및 데이터 링크 계층 디코더를 사용하면 링크 트레이닝, 흐름 제어 크레딧, TLP 시퀀스 번호와 ACK도 확인할 수 있다. 프로젝트 문서에 따르면 TLP가 하드 매크로 내부에 머무는 시간은 편도 약 0.4µs다.
빌드와 실제 보드 검증
필요한 도구는 AMD Vivado 또는 오픈소스 openXC7 FPGA 툴체인, 베어메탈 RISC-V 크로스 컴파일러, Python과 각 디렉터리에 명시된 의존성이다. 프로젝트는 먼저 공동 시뮬레이션으로 장치 초기화, 레지스터 접근, 링크 동작, RC와 EP 간 데이터 교환을 시험한 뒤 소프트웨어를 빌드하고 FPGA 비트스트림을 생성하도록 안내한다. RC와 EP에 맞는 보드 제약과 빌드 설정을 선택해야 한다. Vivado와 openXC7 빌드 절차는 각각의 프로젝트 디렉터리에 있다.
실제 검증에는 Artix-7 FPGA가 탑재된 SQRL Acorn CLE-215+ 두 장과 RC·EP·스위치 슬롯이 있는 openPCIE 백플레인, Xilinx Platform Cable USB 두 대를 사용했다. 보드의 JTAG 커넥터는 표준 14핀 Xilinx 케이블과 호환되지 않는 Molex Pico-Lock 1.50mm 규격이므로 맞는 커넥터가 달린 맞춤형 케이블이 필요하다. 자료는 Molex 0369200603 케이블을 반으로 잘라 프로그래머 선에 연결하는 방식을 제안한다. 보드는 PCIe 또는 M.2 슬롯 전원만으로 동작하지 않으며, ATX 전원공급장치의 표준 6핀 PCIe 커넥터를 통한 외부 12V 전원이 필요하다.
검증 환경에서는 PC 한 대가 RC 보드의 JTAG를, 다른 PC가 EP 보드의 JTAG를 맡았다. 두 보드에 비트스트림을 올리고 백플레인 리셋을 해제하면 RC가 장치 탐색을 시작한다. 이후 리셋 버튼을 누르면 FPGA를 다시 프로그래밍하지 않고도 PCIe 연결을 재초기화할 수 있다. 시험은 RC가 메모리 쓰기로 데이터를 EP에 보내고, EP가 이를 블록 RAM에 기록한 다음 RC가 다시 읽는 방식이다. LED와 Vivado 통합 로직 분석기(ILA)로 링크 상태와 양쪽 내부 신호를 확인했다.
프로젝트의 실제 하드웨어 검증에서는 RC 보드의 LED A3가 켜져 링크가 수립된 것을 확인했고, RC가 보낸 십진수 6(이진수 0110)과 같은 패턴이 EP 보드 LED에 표시됐다. 제작진은 이를 PCIe 링크 초기화와 RC에서 EP로의 데이터 전송이 실제 보드에서 동작한 결과로 제시한다.
구현 상태와 다음 단계
프로젝트는 오픈백플레인 회로·PCB 설계와 시제품 제작, Artix-7 RC RTL 및 베어메탈 RISC-V 드라이버 구현, EP 모델을 포함한 공동 시뮬레이션, 통합 시험을 완료했다고 표시한다. Vivado 외에 openXC7 빌드도 수행했다. 초기 nextpnr-xilinx 경로에서는 RTL 수정 한 건과 openXC7 결함에 대한 우회책 다섯 건을 적용한 뒤, Vivado와 마찬가지로 Gen2 속도로 링크를 올렸다고 설명한다. 관련 수정과 openXC7에 보고한 이슈는 빌드 문서에 공개돼 있다. 이후 openXC7 1.0.0에서도 시험했으며, Yosys 0.69와 통합 Slang, nextpnr-himbaechel, fpga-as를 사용하면서 별도 SV2V 변환 단계가 불필요해졌다고 프로젝트는 밝혔다. SV2V 선택지는 도구 간 교차 검사 목적으로 남겨뒀다.
다음 단계로는 PCIe Gen3 24레인과 OCuLink를 사용하는 openPCIE3를 계획하고 있다. Diodes PI7C9X3G1224GP 스위치(PCIe 3.1, 24레인, 12포트)를 중심으로 한 설계로, PC 한두 대를 각각 x4 OCuLink 케이블로 연결하고 x4 EP 커넥터 네 곳(슬롯 두 개, M.2 두 개)을 제공한다. PC 입출력 확장기로 컴퓨팅·저장장치·입출력 카드를 연결하는 용도를 제시하며, 오픈소스 AI 서버도 예로 들었다. PC가 케이블을 통해 REFCLK와 리셋을 보내므로 보드 자체의 클록·리셋 생성기는 필요하지 않다는 설명이다. 설계 의견은 이슈 #9와 이슈 #13에서 받고 있다.
프로젝트 저장소는 chili-chips-ba/openPCIE다. 제작진은 저장소 일부 작업에 생성형 AI 도구가 엄격한 지침과 개발자의 감독 아래 제안 용도로 쓰였을 수 있으며, 결과물의 책임은 사람 개발자에게 있다고 밝혔다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요