이 페이지는 MGT(Multi-Gigabit Transceiver)를 소개하는 페이지 시리즈 중 첫 번째로, 이번 시리즈에서 다룰 내용에 대한 개요를 제공합니다.
소개
MGT는 컴퓨터나 전자 시스템 내부에서 서로 다른 부분 간의 통신에 중요한 역할을 합니다. 컴퓨터 내부에서 잘 알려진 여러 인터페이스(PCIe, SATA 등)가 MGT를 기반으로 합니다. 컴퓨터와 주변기기 사이의 통신에 쓰이는 잘 알려진 인터페이스, 예를 들어 Gigabit Ethernet, SuperSpeed USB, Thunderbolt, DisplayPort도 마찬가지입니다.
MGT는 전자 부품들 사이를 연결하는 데에도 사용됩니다. 예를 들어 두 FPGA 사이를 연결하는 경우가 그러합니다. 이런 경우 통신은 잘 알려지지 않은 프로토콜이나 비표준 프로토콜을 기반으로 하는 경우가 많습니다. 하지만 MGT를 사용해 FPGA와 다른 종류의 부품을 연결하거나, 다른 부품들끼리 서로 연결하는 것도 가능합니다. 예를 들어 Xillyp2p가 그러한 용도로 쓰입니다.
예를 들어 광섬유 트랜시버는 표준 모듈(특히 SFP+ 폼 팩터) 형태로 제공되며 MGT와 직접 인터페이스하는 경우가 많습니다. 이 내용은 예제 설계에서 확인할 수 있습니다. 일부 고속 ADC/DAC도 샘플 데이터를 전송하기 위해 MGT를 사용합니다(보통 JESD204 프로토콜을 기반으로 합니다). 비디오 데이터 전송을 위한 프로토콜도 있습니다(예: MIPI의 물리 계층용 프로토콜 중 일부).
MGT는 양방향 프로토콜에 자주 사용되지만, 실제로 각 MGT는 송신기(transmitter)와 수신기(receiver)라는 두 개의 독립된 부분으로 구성됩니다. 따라서 두 부분 중 하나를 꺼 버리면 MGT를 단방향 전송에 사용할 수 있습니다. 대부분의 FPGA MGT에서는 송신기와 수신기의 매개변수를 각각 독립적으로 설정할 수도 있습니다.
요약하면, MGT는 다양한 응용 분야에서 사용됩니다. 인터페이스 이름만으로는 MGT가 사용된다는 사실을 알 수 없는 경우가 많지만(예: Gigabit Ethernet, SATA, DisplayPort), 실제 물리 계층은 MGT로 구성되어 있습니다.
참고로 Xilinx(이후 AMD)는 자사의 MGT를 각기 다른 이름으로 부릅니다. RocketIO, GTX, GTH, GTY, GTP, GTM 등이 그것입니다. 각 이름은 트랜시버의 특정 하드웨어 구현을 나타내므로, 그 이름을 보면 해당 트랜시버가 지원하는 데이터 속도와 기타 성능 특성을 어느 정도 알 수 있습니다.
이 시리즈에서는 MGT의 기본 개념과 MGT와 관련해 흔히 쓰이는 몇 가지 기술 용어를 설명합니다. 그 목적은 기술 문서를 더 쉽게 읽을 수 있도록 하는 것이며, 특히 어떤 매개변수가 자신의 프로젝트와 관련이 있고 어떤 것이 관련이 없는지 판단할 수 있게 하는 것입니다.
MGT란 무엇인가?
MGT의 복잡한 기능 이면에는 사실 단순한 SERDES 하나가 있다는 점을 이해하는 것이 중요합니다. MGT는 데이터를 수신하고 송신하는 전자식 구성 요소입니다. MGT와 물리 세계 사이의 전기적 인터페이스는 차동 쌍(differential pair)을 구성하는 두 개의 전선으로 이루어져 있습니다. 첫 번째 전선(“플러스” 또는 “포지티브” 전선)의 전압이 다른 전선(“마이너스” 또는 “네거티브” 전선)보다 높으면 물리적 상태가 ‘1’이 되고, 그렇지 않으면 ‘0’이 됩니다. 이는 LVDS와 같은 차동 인터페이스(differential interface)와 동일한 원리입니다.
SERDES와 또 다른 유사점은, MGT가 애플리케이션 로직과 병렬 워드(parallel word)로 인터페이스한다는 점입니다. 애플리케이션 로직의 클록 주기마다 여러 비트가 애플리케이션 로직과 MGT 사이에서 전송됩니다. 데이터 속도가 FPGA에서 구현 가능한 최대 클록 주파수보다 훨씬 높기 때문에 이렇게 구성하는 것이 필요합니다.
하지만 일반적인 SERDES와 MGT 사이에는 몇 가지 중요한 차이점이 있습니다. 가장 중요한 차이점을 몇 가지만 들면 다음과 같습니다.
- MGT는 일반 SERDES보다 훨씬 높은 데이터 속도를 지원할 수 있습니다.
- 일반 SERDES의 수신기는 데이터 스트림과 함께 송신기의 클록까지 전달받아야 합니다. 반면 MGT 수신기는 데이터 스트림의 신호만으로 동작할 수 있습니다. MGT가 데이터 스트림의 신호에 맞는 클록을 스스로 만들어 그 클록을 사용하기 때문입니다. 이 기능을 가리켜 클록 데이터 복원(Clock Data Recovery, CDR)이라고 합니다. MGT 수신기가 송신기의 클록에 접근할 수 있더라도, 그 클록은 기준 클록(reference clock)으로만 사용될 뿐 데이터 클록 자체로는 사용되지 않습니다.
- MGT를 사용하는 데이터 링크에서는 비트 오류가 허용되며, 정상적인 현상으로 간주됩니다. BER(bit error rate, 비트 오류율)은 대개 10-12 또는 10-15 미만이어야 합니다. 일반 SERDES에서 비트 오류가 발생하면 오작동으로 취급되지만, MGT에서는 그렇지 않습니다.
- MGT를 사용할 때는 두 전선으로 전송되는 데이터 스트림의 내용에 제약이 따릅니다. 데이터 스트림은 항상 DC 밸런스(DC balance)를 유지해야 합니다. 다시 말해, 데이터 스트림에서 ‘0’과 ‘1’의 개수는 평균적으로 같아야 합니다. 또한 전송되는 비트들이 서로 통계적으로 독립적이어야 하는 경우도 많습니다. 이에 대해서는 아래에서 더 자세히 설명합니다.
- MGT는 대역 외 신호(OOB, Out-of-Band)를 생성하고 감지할 수 있습니다. 이 신호들은 에너지 절약을 위해 정상적인 데이터 흐름이 중단되었을 때 전송됩니다. 이 신호의 주요 목적은 상대편 수신기를 깨워 데이터 비트 전송을 재개하도록 하는 것입니다.
그렇다면 MGT는 왜 이렇게 복잡할까?
FPGA 프로젝트에서 MGT 블록을 설정해 본 사람이라면, 매개변수와 선택 옵션이 정말 많다는 것을 알고 있을 것입니다. 왜 이렇게 해야 하는 것일까요?
사실, 반드시 복잡해야 하는 것은 아닙니다. 이 예제 설계에서 보여 주듯이, MGT를 단순한 SERDES로만 사용한다면 복잡한 부분이 대부분 사라집니다.
그럼에도 MGT 사용이 대체로 복잡한 데에는 크게 세 가지 이유가 있습니다. 첫째, MGT 블록에는 로직 패브릭(fabric)에서도 구현할 수 있는 많은 구성 블록(building block)들이 효율성을 이유로 MGT 내부에 구현되어 있기 때문입니다. 예를 들어 모든 MGT에는 8b/10b를 인코딩하고 디코딩하는 기능이 있습니다. 이 작업은 애플리케이션 로직이 수행할 수도 있지만, 이 인코딩 방식이 매우 널리 사용되므로 MGT가 대신 처리하도록 한 것입니다.
둘째는 클로킹(clocking)과 관련이 있습니다. MGT가 제대로 동작하려면 여러 클록이 필요합니다. 더욱 복잡한 것은, FPGA 로직 패브릭에 사용되는 클록과 비교할 때 MGT 클록의 품질 요구 사항(특히 지터(jitter))이 훨씬 엄격하다는 점입니다. 게다가 때로는 SSC(Spread Spectrum Clocking)도 사용되므로 상황이 더 복잡해집니다.
그래서 클로킹을 올바르게 구성하는 것은 때로 MGT 전반의 매개변수를 정확히 고르는 일 못지않게 어렵습니다.
셋째, MGT는 여러 표준 통신 프로토콜을 지원하도록 설계되어 있기 때문입니다. 그 결과 특정 프로토콜에 필요한 기능들의 이름은 해당 프로토콜 규격에서 가져온 경우가 많습니다. 이런 전문 용어는 관련 프로토콜을 모르는 사람에게는 아무 의미도 없습니다. 따라서 FPGA용 MGT 블록을 설정할 때 어떤 기능을 켜야 할지 결정하기가 어려워집니다.
이 모든 주제는 이번 페이지 시리즈의 나머지 글들에서 더 자세히 다룹니다.
유의해야 할 사항
대부분의 사용 사례에서 MGT는 특히 PCIe처럼 이미 잘 확립된 프로토콜의 물리 계층으로 사용됩니다. 이런 상황에서는 FPGA 툴이 세부 사항을 처리해 주므로, 낮은 수준에서 어떤 일이 일어나는지 자세히 알 필요가 없습니다.
하지만 애플리케이션 로직을 MGT에 직접 연결하려면 그 로직이 해결해야 할 몇 가지 문제점들을 알고 있어야 합니다. 이러한 문제 중 일부는 FPGA 사이에서 사용하도록 설계된 프로토콜이 처리해 줍니다.
아래는 염두에 두어야 할 주제를 간단히 정리한 목록입니다. 각 주제에 대한 자세한 설명은 이번 시리즈의 나머지 글에서 다룹니다.
- 워드 정렬(Word alignment): MGT는 다른 SERDES와 마찬가지로, 바이트나 더 큰 워드가 어느 위치에서 시작하는지에 대한 사전 정보가 없습니다. SERDES에서는 보통 수신된 데이터 스트림이 제대로 해석될 때까지 병렬 워드를 한 번에 한 비트씩 이동해 보는 방식(비트 슬리핑, bit slipping)으로 이 문제를 해결합니다. MGT를 기반으로 하는 프로토콜은 대개 동기화 워드(synchronization word)를 사용하여 이 문제를 해결합니다.
- 실제 전선 위의 비트는 DC 밸런스(DC balance)를 유지해야 합니다. 가장 간단한 해결책은 8b/10b 인코딩을 사용하는 것이지만, 다른 선택지(때로는 더 적합한 선택지)도 있습니다.
- 스크램블링(Scrambling): 수신 측 MGT에 이퀄라이저(equalizer)를 사용하는 것은 거의 항상 좋은 방법입니다. 이퀄라이저는 물리적 전송 매체의 불완전성을 보상하여 BER을 낮춰 줍니다. 이는 특히 데이터 속도가 높거나, 저렴한 케이블을 사용하거나, 물리적 거리가 먼 경우에 더욱 그렇습니다. 그런데 일부 유형의 이퀄라이저는 전송 데이터가 통계적으로 무작위적일 것을 요구합니다. 즉, 전송되는 데이터 스트림에서 어떤 비트와 다른 비트 사이에 상관관계가 있어서는 안 됩니다. 일반적인 해결책은 페이로드 데이터와 의사 난수 비트 시퀀스 사이에서 XOR을 수행하는 스크램블러(scrambler)를 사용하는 것입니다. 수신 측은 동일한 의사 난수 시퀀스로 XOR을 수행하여 원래의 데이터 스트림을 얻습니다.
- 비트 오류(Bit errors): 수신 측 MGT에는 오류를 포함한 데이터가 도착할 수 있습니다. 이 데이터를 사용하는 로직은 그러한 오류를 처리할 수 있도록 설계되어야 합니다. 일부 애플리케이션에서는 오류가 무시할 수 있을 만큼 드물다고 간주합니다(예: 원시 비디오 데이터를 전송하는 경우이며 BER이 10-15 미만). 다른 애플리케이션에서는 데이터 링크의 신뢰성을 보장하기 위해 오류 검출 및/또는 재전송 메커니즘이 필요합니다.
- 클록 주파수 차이(Clock frequency difference): MGT가 데이터 스트림을 수신할 때, 그 신호는 상대편의 클록, 즉 송신기의 클록을 기준으로 합니다. 이 클록은 수신 측에서 사용할 수 있는 클록과 주파수가 약간 다를 수 있습니다. 그런데 MGT와 애플리케이션 로직 사이의 인터페이스는 대부분 로컬 클록(local clock)을 기준으로 동작합니다. 따라서 송신기의 클록이 수신기의 클록보다 빠르면, MGT는 데이터를 애플리케이션 로직으로 전달할 수 있는 속도보다 빠른 속도로 데이터를 수신하게 됩니다. 그 결과 초과된 데이터가 MGT 블록 내부에 쌓이게 되고, 결국 어떤 형태로든 오버플로(overflow)가 발생합니다. 반대로 도착하는 데이터 속도가 로컬 클록보다 낮으면 MGT는 매 클록 주기마다 데이터를 전달하지 못합니다. 이런 문제는 기준 클록(reference clock)이 데이터 스트림과 함께 송신기에서 수신기로 전달되더라도 발생합니다. 클록 주파수의 아주 약간의 변동만으로도 이런 문제가 생길 수 있기 때문입니다. 프로토콜은 보통 유휴 워드(idle words)를 사용하여 이 문제를 해결합니다.
- 에너지 소비(Energy consumption): MGT는 전력을 많이 소비하는 경향이 있습니다. 부분적으로는 높은 데이터 속도 때문이며, 고품질 PLL이 에너지를 상당히 낭비하기 때문이기도 합니다. 따라서 MGT를 사용하지 않을 때는 아주 짧은 시간이라도 전원을 꺼 두는 것이 좋은 경우가 많습니다. 예를 들어 SuperSpeed USB 링크는 50μs라는 짧은 시간 동안 데이터가 전송되지 않으면 데이터 스트림을 끄는 경우가 많습니다. 그 후 필요할 때 OOB 핸드셰이크를 통해 동작을 재개합니다.
PMA, PCS 및 클로킹
이 블록 다이어그램은 MGT의 구성 요소들과 애플리케이션 로직과의 상호 작용을 보여 줍니다.
MGT의 기능은 보통 세 부분으로 나눌 수 있습니다.
- 클로킹: 앞서 언급했듯이 MGT가 동작하려면 여러 클록이 필요합니다. FPGA 툴이 이 클록들의 매개변수를 자동으로 설정해 주기는 하지만, 이 클록들이 어떻게 생성되는지에 대해서도 알고 있어야 합니다.
- PMA(Physical Medium Attachment, 물리 매체 접속): 이 부분에는 MGT의 SERDES와 아날로그 신호 하위 시스템(OOB 신호, 수신기 검출, 이퀄라이저(equalizer), 프리엠퍼시스(pre-emphasis) 등)이 포함됩니다. 이 부분은 CDR도 구현합니다.
- PCS(Physical Coding Sublayer, 물리 코딩 하위 계층): 이 부분에는 통신 프로토콜을 구현하는 데 도움이 되는 로직, 즉 인코더와 디코더, 워드 정렬(word alignment), 기어박스(gearbox), FIFO 등이 포함됩니다. PCS의 대부분 기능은 로직 패브릭으로 구현할 수도 있지만, 단순성과 효율성을 위해 MGT 내부에 구현되어 있습니다.
이 주제들에 대한 더 자세한 내용은 이 페이지 시리즈에서 다룹니다.
PIPE 인터페이스
PIPE 표준도 언급할 가치가 있습니다. 이 표준은 MGT와 PCIe, SuperSpeed USB 또는 SATA를 구현하는 로직 사이의 연결을 정의합니다. 여기에는 데이터, 제어 신호, 상태 신호의 통신에 사용되는 포트들이 포함됩니다.
이 표준에서 MGT는 PHY 계층, 프로토콜은 MAC 계층이라고 부릅니다. 이 용어는 Ethernet, USB 1.x, USB 2.0을 규정하는 표준에서도 사용됩니다. 이 표준들은 보통 두 개의 분리된 칩으로 구현됩니다. 예를 들어 프로세서 칩에 Ethernet을 구현하는 경우, MAC 계층은 그 칩 안에 구현되고 PHY 계층은 별도의 칩에 구현됩니다. PIPE 표준도 같은 취지로 작성되었습니다. 다만 PCIe, SuperSpeed USB, SATA는 사실상 거의 항상 동일한 칩 안에 완전히 구현됩니다. PIPE 표준이 정의하는 MAC 계층과 PHY 계층 사이의 연결은 칩 내부에서 이루어지며, 외부로 드러나는 경우는 거의 없습니다.
PIPE 표준이 중요한 이유 중 하나는, 제대로 된 FPGA MGT라면 PCIe에서 요구하는 PIPE 인터페이스를 항상 구현한다는 점입니다. SATA용 PIPE 인터페이스도 자주 지원됩니다. 이는 두 프로토콜을 구현할 때 당연히 유용하지만, 여기서 한 가지 더 중요한 이점이 있습니다. 바로 서로 다른 FPGA들이 MGT와 유사한 인터페이스를 갖는다는 점입니다. 특히 사실상 모든 MGT에는 공통적으로 들어 있는 기능 요소들이 있습니다.
결론
이 페이지에서는 MGT와 그 복잡성에 대한 개요를 살펴보았습니다. 이번 시리즈의 나머지 글에서는 위에서 언급한 여러 개념들을 설명합니다. 하지만 그 전에, 두 FPGA의 MGT를 연결할 때 흔히 사용되는 프로토콜들에 대한 간단한 개요부터 시작하겠습니다.
