PCIe(Peripheral Component Interconnect Express, 컴퓨터와 확장 장치를 잇는 고속 직렬 인터페이스)는 영상 수집 보드(프레임 그래버), 신호 처리 보드처럼 많은 데이터를 컴퓨터로 보내야 하는 FPGA(Field Programmable Gate Array, 회로를 다시 구성할 수 있는 반도체) 장비에서 자주 쓰입니다. 그런데 보드를 꽂았는데 리눅스에서 장치가 보이지 않거나, 보이더라도 데이터 전송이 멈추는 문제가 개발 초기에 자주 생깁니다.
PCIe 문제는 보드 하드웨어, FPGA 설계, 호스트 컴퓨터 설정, 리눅스 드라이버가 함께 얽혀 있어 담당자 사이에서 원인을 서로 미루기 쉽습니다. 이 글에서는 PCIe FPGA 보드를 점검할 때 볼 6가지 지점을 증상, 원인, 해결 방향 순서로 정리했습니다.

먼저 확인할 것(개요): 문제가 "장치 목록에 아예 없다", "목록에는 있지만 드라이버가 붙지 않는다", "드라이버는 붙었지만 데이터가 오가지 않는다" 중 어디에 해당하는지 나눕니다. 단계가 정해지면 아래 6곳 중 어디를 먼저 볼지 좁혀집니다.
1. 호스트가 장치를 찾을 때 FPGA가 아직 준비되지 않았다
증상: 부팅 후 장치 목록에 보드가 없고, 컴퓨터를 다시 시작하거나 재검색하면 보일 때가 있습니다.
원인: FPGA는 전원이 들어온 뒤 설정 데이터를 읽어 회로를 구성하는 시간이 필요합니다. 호스트가 PCIe 장치를 찾는 시점까지 구성이 끝나지 않으면 장치가 없는 것으로 처리됩니다. PCIe 규격은 리셋 해제 후 장치가 응답해야 하는 시간 조건을 두고 있어, 설정 데이터가 크거나 읽는 속도가 느린 경우 이 조건을 넘기기 쉽습니다.
해결 방향: FPGA 구성 시간과 보드의 리셋 신호 순서를 확인하고, 구성 방식과 속도를 조정하거나 PCIe 부분을 먼저 구성하는 기능을 검토합니다. 필요하면 호스트 쪽 재검색 절차도 함께 설계합니다.
2. 링크가 연결되지 않거나 낮은 속도·폭으로 연결된다
증상: 장치가 보이지 않거나, 보이더라도 기대보다 낮은 세대(속도)나 레인 수로 연결됩니다.
원인: PCIe는 연결 시 양쪽이 협상해 속도와 레인(lane, 송수신 선로 쌍) 수를 정합니다. 기준 클럭 품질, 레인 배선, 커넥터·슬롯 상태, FPGA 송수신기 설정 중 하나라도 맞지 않으면 링크가 실패하거나 낮은 조건으로 내려갑니다.
해결 방향: 리눅스에서 링크 상태(협상된 속도와 폭)를 확인하고, FPGA 쪽 링크 상태 신호를 함께 봅니다. 낮은 속도로 먼저 안정화한 뒤 목표 조건으로 올리고, 필요하면 신호 품질을 측정합니다.
3. 장치 식별 정보와 설정 공간이 의도와 다르다
증상: 장치는 보이는데 이름이 이상하게 나오거나, 원하는 드라이버가 붙지 않습니다.
원인: 리눅스는 장치의 제조사·장치 번호와 분류 정보를 보고 드라이버를 연결합니다. FPGA의 PCIe IP(Intellectual Property, 재사용 가능한 설계 블록) 설정에서 이 값들이 드라이버가 기대하는 값과 다르면 장치는 보여도 드라이버가 연결되지 않습니다.
해결 방향: IP 설정의 식별 정보와 드라이버가 지원하는 장치 목록을 대조하고, 버전마다 설정이 바뀌지 않도록 설정값을 문서와 빌드에 고정합니다.
4. 주소 영역(BAR) 크기와 배치가 맞지 않는다
증상: 드라이버가 붙었는데 레지스터를 읽으면 엉뚱한 값이 나오거나, 주소 영역 할당 오류가 커널 로그에 남습니다.
원인: BAR(Base Address Register, 장치가 호스트 메모리 주소 공간에 노출할 영역을 정하는 설정)의 크기와 종류는 FPGA 설계에서 정합니다. 너무 크게 잡거나 호스트 플랫폼이 지원하지 않는 방식으로 설정하면 주소를 받지 못하고, FPGA 내부 주소 변환 설정이 틀리면 엉뚱한 레지스터에 접근하게 됩니다.
해결 방향: 필요한 크기만큼 BAR를 정리하고, 커널 로그에서 주소 할당 결과를 확인합니다. FPGA 내부 주소 변환과 레지스터 지도를 드라이버 문서와 한 표로 맞춰 둡니다.
5. 리눅스 드라이버 연결과 응용 프로그램 인터페이스가 맞지 않다
증상: 장치는 정상인데 응용 프로그램에서 장치에 접근할 수 없습니다.
원인: 리눅스에서 PCIe 장치를 쓰려면 드라이버가 장치를 활성화하고 주소 영역을 연결해야 합니다. 응용 프로그램이 장치를 쓰는 인터페이스는 드라이버에 따라 다릅니다. 커널 버전 차이로 드라이버가 빌드되지 않거나, 보안 설정 때문에 드라이버 로딩이 막히는 경우도 있습니다.
해결 방향: 커널 로그로 드라이버 연결 단계를 확인하고, 사용하는 커널 버전에 맞춘 드라이버 빌드·설치 절차를 정리합니다. 응용 프로그램 인터페이스는 드라이버에 따라 다르며, 별도 장치 파일을 제공하는 방식이면 파일 생성 여부와 접근 권한을 확인합니다.
6. DMA·인터럽트 설정이 맞지 않아 전송이 멈춘다
증상: 처음 몇 번은 데이터가 오다가 멈추거나, 데이터가 깨지거나, 처리 완료 알림이 오지 않습니다.
원인: 큰 데이터는 DMA(Direct Memory Access, 프로세서 개입을 최소화한 메모리 직접 전송)로 옮깁니다. 호스트 메모리 주소 변환(IOMMU, 장치의 메모리 접근을 관리하는 기능) 설정, DMA 주소 범위, 인터럽트(MSI/MSI-X, 메시지 방식 인터럽트) 설정이 서로 맞지 않으면 전송이 멈추거나 알림을 놓칩니다.
해결 방향: 드라이버의 DMA 주소 범위와 메모리 할당 방식을 확인하고, IOMMU 설정과 함께 시험합니다. 인터럽트 개수와 방식을 FPGA 설계와 맞추고, 장시간 전송 시험으로 누락 여부를 확인합니다.
정리: PCIe는 "어느 단계에서 멈췄는지"부터 나눠야 합니다
PCIe FPGA 보드가 인식되지 않거나 전송이 멈추는 원인은 구성 시간, 링크, 장치 식별 정보, 주소 영역, 드라이버, DMA·인터럽트 중 한 곳인 경우가 대부분입니다. 하드웨어, FPGA 설계, 리눅스 드라이버를 한 흐름으로 보면 원인을 서로 미루지 않고 빠르게 좁힐 수 있습니다.
더파인은 SoC·FPGA 개발과 임베디드 리눅스 개발을 용역으로 수행합니다.
"보드는 만들었는데 PCIe가 안정적으로 붙지 않는다"면 지금 문의해 주세요. 사용 중인 FPGA와 호스트 환경(프로세서·운영체제), 현재 증상을 알려 주시면 검토 후 연락드리겠습니다.
문의·견적 요청하기 | ☎ 031-498-3130