이 페이지는 Multi-Gigabit Transceiver (MGT)를 소개하는 일련의 페이지 중 세 번째입니다.
소개
application logic의 데이터 스트림은 거의 물리적 채널에서 그대로 전송되지 않습니다. 그렇게 하면 이전에 표시된 이유로 MGT가 오작동할 가능성이 큽니다. 거의 모든 애플리케이션에서 MGT 또는 application logic은 물리적 채널이 제대로 작동할 수 있도록 데이터 스트림에 인코딩을 적용합니다. 이 인코딩은 또한 송신기와 수신기 간의 동기화를 지원합니다.
이 페이지는 가장 일반적으로 사용되는 인코딩 기술의 기본 사항을 살펴봅니다. 이전 페이지의 protocols목록은 이러한 인코딩과 FPGAs사이에 사용되는 protocols를 연결합니다.
8b/10b 인코딩
8b/10b 인코딩은 여러 protocols에서 사용됩니다. 예를 들어, 일부 버전의 PCIe, Gigabit Ethernet, SATA, Displayport 및 SuperSpeed USB가 있습니다. 모든 FPGA MGTs 에는 8b/10b 인코더와 디코더가 내장되어 있지만, 이 인코더는 logic fabric 에서도 구현할 수 있습니다.
이 인코딩은 각 byte (8 bits)를 10 bits로 구성된 단어로 변환합니다. 이 변환의 주요 목적은 평균적으로 같은 수의 '0'와 '1'를 갖는 bits 시퀀스를 만드는 것입니다. 즉, 인코딩된 데이터 스트림의 bits는 DC-밸런스됩니다. 또 다른 장점은 인코딩이 데이터 스트림에서 '0'와 '1' 사이에 충분한 전환이 있도록 보장하여 CDR (Clock Data Recovery) 메커니즘이 제대로 작동할 수 있다는 것입니다.
하지만 8b/10b 인코딩은 데이터 스트림을 무작위화하지 않는다는 점에 유의하세요. 특히, equalizer를 사용하는 경우 8b/10b 인코딩만으로는 충분하지 않으며, 이 equalizer는 데이터 스트림이 통계적으로 무작위여야 합니다.
DC-밸런스 목표를 달성하기 위해 8비트 단어 중 일부를 두 가지 가능한 후보로 인코딩할 수 있습니다. 예를 들어, 8비트 단어 0x20 (00100000, D0.1로 표시)는 1001111001 또는 0110001001로 인코딩할 수 있습니다. 두 대안 모두 0x20로 다시 디코딩됩니다. 첫 번째 대안에는 '0' bits가 4개, '1' bits가 6개 있다는 점에 유의하세요. 두 번째 대안에는 '0' bits가 6개, '1' bits가 4개 있습니다. 이것이 8b/10b 인코딩의 전체 아이디어입니다. 인코더에는 두 가지 대안이 있습니다. 하나는 '1'보다 '0'이 더 많은 대안이고, 다른 하나는 두 번째 대안입니다.
인코더는 이 기능을 사용하여 장기적으로 '0' 와 '1' 간의 균형을 보장합니다. 지금까지 데이터 스트림에 '0'이 너무 많았는지, '1'이 너무 많았는지 기억합니다. 이 불균형을 Running Disparity라고 합니다. 인코더는 이 불균형을 줄이는 데 도움이 되는 10비트 단어를 선택합니다.
모든 8비트 단어가 두 개의 10비트 후보를 갖는 것은 아닙니다. 예를 들어, 8비트 단어 0x23 (00100011, D3.1로 표시)는 항상 1100011001로 인코딩됩니다. 이 인코딩된 단어는 '0' 와 '1'의 수가 같으므로 Running Disparity에 영향을 미치지 않습니다.
이 인코딩은 1983년에 처음 공개되었으며, 대략 2010년까지 도입된 protocols 에서 매우 인기가 있었습니다. 최근에 공개된 protocols에서는 덜 인기가 있습니다. 주된 이유는 scrambler가 종종 protocol 의 일부이기도 하기 때문입니다. 따라서 데이터 스트림의 DC 균형은 scrambler를 사용하여 보장되므로 이 목적에 8b/10b 인코딩이 필요하지 않습니다. scrambler는 또한 '0' 와 '1' 간의 전환이 충분히 자주 발생하도록 보장합니다. 반면에 8b/10b 인코딩은 물리적 채널로 전송하기 위해 25% 더 많은 bits를 추가합니다. 이러한 추가 bits는 유용한 데이터를 전송하는 데 사용될 수 있었습니다.
즉, scrambler를 사용하는 성공적인 protocols 중 일부는 8b/10b도 사용합니다. 예를 들어, 모든 버전의 PCIe는 scrambler를 사용해야 하지만 8b/10b 인코딩은 3.0아래의 PCIe 버전에서도 사용됩니다. 따라서 8b/10b 인코딩에는 분명히 다른 이점이 있습니다. 그리고 이것은 우리를 다음 주제로 이끕니다. K-symbols.
K-symbols
8b/10b 인코더가 인코딩하는 각 8 bits 에서 10 bits를 생성한다는 사실은 인코딩된 단어가 256가지의 가능한 조합을 갖는 원래 단어와 비교했을 때 1024가지의 가능한 조합을 갖는다는 것을 의미합니다. 각 원래 단어에 두 개의 가능한 인코딩된 단어가 있다고 가정하더라도 이는 512가지의 가능성을 포함합니다. 앞서 언급했듯이 일부 8비트 단어는 번역을 위한 10비트 단어 후보가 하나뿐이므로 10비트 단어의 가능성은 512가지 미만입니다. 따라서 10비트 단어의 최소 512가지 가능성에는 해당하는 8비트 단어가 없다는 결론이 도출됩니다.
따라서 8b/10b 인코딩은 불법적인 10비트 단어를 감지함으로써 물리적 링크에서 비트 오류를 감지할 수 있습니다. FPGA MGTs 에는 불법적인 10비트 단어가 감지될 때 application logic 에 알리는 데 사용되는 output ports가 있습니다. 그러나 이 오류 감지 메커니즘은 모든 오류를 감지하지 못하기 때문에 그다지 가치가 없습니다.
8b/10b 인코딩의 정말 귀중한 기능은 K-symbols입니다. K-symbol은 8비트 단어 대신 인코딩되어 전송됩니다. 디코더는 일반 데이터 단어와 K-symbol을 구별할 수 있으며, K-symbol이 도착하면 application logic 에 알리는 방법이 항상 있습니다.
따라서 8b/10b 인코딩은 송신기가 일반 데이터와 혼동되지 않는 방식으로 데이터 채널에 추가 정보를 보낼 수 있도록 합니다. 이 기능은 수신기가 송신기의 데이터 스트림과 동기화되도록 돕기 위해 protocols 에서 자주 사용됩니다.
K-symbols 의 의미는 protocol에 따라 다릅니다. 그러나 많은 protocols 에서 같은 의미로 사용되는 두 가지 K-symbols가 있습니다.
- K28.5는 종종 Comma (COM)라고 불리며 데이터 스트림을 동기화하는 데 사용됩니다.
- K28.0은 종종 skip symbol (SKP)라고 불립니다.
두 가지 모두 아래에서 더 자세히 설명합니다.
FPGA MGTs에서 8b/10b가 활성화되면 application logic 와의 인터페이스에는 각 byte 데이터에 대해 별도의 wire가 있습니다. 이 wire는 데이터가 일반 데이터 byte 인지 또는 K-symbol인지를 나타냅니다. 즉, 데이터를 전송하기 위한 인터페이스는 전송되는 각 단어가 일반 데이터인지 또는 K-symbol인지 선택할 수 있도록 합니다. 즉, 데이터 단어가 K-symbol로 표시되면 8비트 데이터 단어는 다음 옵션으로만 제한됩니다.
Byte 값(hex) | K-Symbol |
---|---|
1C | K28.0 |
3C | K28.1 |
5C | K28.2 |
7C | K28.3 |
9C | K28.4 |
BC | K28.5 |
DC | K28.6 |
FC | K28.7 |
F7 | K23.7 |
FB | K27.7 |
FD | K29.7 |
FE | K30.7 |
마찬가지로 MGT 수신기의 경우 application logic와의 인터페이스에서 수신된 각 바이트에 대해 별도의 wire가 있습니다. 이러한 각 wire의 값은 관련 byte를 일반 데이터로 해석해야 하는지 아니면 K-symbol로 해석해야 하는지를 나타냅니다. 수신기에는 K28.5 (Comma Symbol, COM)와 K28.0 (Skip symbol, SKP)를 특별한 방식으로 처리하기 위한 특수 기능도 있습니다. 이 두 가지 K-symbols 에 대해 다음에서 설명합니다.
Comma symbol (K28.5)
K28.5 의 10비트 표현은 0011111010 또는 1100000101입니다. 이 단어는 특히 유용한데, 이 bits 시퀀스는 K28.5를 전송한 결과로만 물리적 채널에 나타날 수 있기 때문입니다. 수신기는 K28.5를 감지하기 위해 송신기와 동기화될 필요가 없습니다. 마지막으로 수신된 10 bits가 이 두 단어 중 하나와 일치하면 됩니다.
이는 K28.5를 수신기 동기화를 위한 훌륭한 도구로 만듭니다. 이 K-symbol이 감지되면 다른 10비트 단어의 경계가 알려집니다.
FPGA MGTs는 K28.5 symbol의 도착에 응답하여 도착하는 데이터 스트림을 자동으로 정렬하는 기능이 있습니다. 일반적으로 더 큰 경계에 대해 정렬을 요청하는 것도 가능합니다. 예를 들어, MGT는 도착하는 K28.5를 32비트 단어의 시작 부분에 정렬하도록 구성할 수 있습니다.
수신기를 정렬하는 것 외에도 K28.5 symbol은 동기화가 필요한 다른 기능 장치를 정렬하는 데에도 사용할 수 있습니다. 예를 들어, protocol은 이 K-symbol의 도착에 대응하여 scrambler를 재설정하도록 요청할 수 있습니다.
이러한 가능성 때문에 protocols는 종종 수신기를 동기화하기 위해 K28.5가 주기적으로 전송되어야 합니다. 핸드셰이크로 연결을 설정하는 Protocols는 종종 링크 설정의 일부로 K28.5를 사용합니다. 어느 쪽이든 K28.5 심볼은 종종 물리적 채널에서 전송되는 25%의 추가 bits를 정당화하는 정도로 protocol 의 설계를 단순화합니다.
Skip symbol (K28.0)
대부분의 실제 상황에서 송신기의 clock frequencies 와 수신기 사이에 차이가 있습니다. 이는 문제를 일으킬 수 있습니다. 종종 MGT 와 application logic 사이의 인터페이스는 수신기 자체의 로컬 clock와 동기화됩니다. 따라서 데이터는 송신기의 clock에 따라 도착하지만 수신기의 clock에 따라 application logic 에 전달됩니다.
즉, MGT가 수신하는 데이터는 반대편에서 지시하는 속도로 도착합니다. 하지만 로컬 clock은 데이터가 얼마나 빨리 소비되는지 지시합니다.
송신기의 clock frequency가 더 높으면 결과적으로 application logic이 MGT 에서 데이터를 너무 느리게 가져옵니다. 잉여 데이터는 결국 누적되고 MGT내부 어딘가에서 overflow가 발생합니다. 반면 송신기의 clock frequency가 더 낮으면 application logic은 도착하는 것보다 더 빨리 데이터를 가져오려고 합니다. 이것도 문제입니다.
이 문제에 대한 간단한 해결책은 "skip symbols"를 추가하는 것입니다. 예를 들어, SuperSpeed USB protocol은 "SKP Ordered Set"를 두 개의 연속된 K28.0 symbols로 정의합니다. protocol은 이 두 개의 K28.0이 354개의 일반 데이터 단어마다 한 번씩 전송되어야 합니다. 수신기 MGT는 application logic에 이러한 K28.0 심볼을 제시하는 대신 버릴 수 있습니다. 이렇게 하면 송신기의 clock이 수신기의 clock보다 빠를 때 과잉 데이터 문제가 해결됩니다. 수신기 MGT가 clock frequency 차이로 인해 데이터를 축적하기 시작하면 도착하는 K28.0 심볼을 건너뜁니다.
이 메커니즘을 사용하면 송신기는 수신기의 application logic이 354개 단어만 가져오는 것과 동일한 시간 주기에 356개 단어를 전송할 수 있습니다. 356 / 354 ≈ 1.00565를 계산하면 이 메커니즘은 두 clocks사이의 최대 ~0.565% 의 frequency 차이를 커버할 수 있습니다. 물론 이것은 protocol의 사양이 허용하는 것보다 더 많습니다.
수신기의 MGT는 기존 "SKP Ordered Set"에 K28.0 symbols를 추가할 수도 있습니다. 이는 송신기의 clock이 느릴 때 도움이 될 수 있습니다. 즉, 수신 측의 application logic은 도착하는 것보다 더 빠르게 데이터를 가져오려고 시도합니다. 따라서 MGT는 누락된 데이터 슬롯을 K28.0 symbols로 채울 수 있습니다. application logic은 어차피 모든 K28.0 symbols를 무시할 것으로 예상됩니다.
PCIe protocol은 Skip Symbol 와 비슷한 방식을 사용합니다. PCIe의 SKP Ordered Set 형식은 다르며, 4개의 K-symbols로 구성됩니다. 먼저 K28.5 (Comma), 그리고 세 개의 K28.0 symbols. 그럼에도 불구하고 skip symbol을 사용하는 원리는 동일합니다.
64b/66b 인코딩
이미 언급했듯이, 8b/10b 인코딩은 물리적 채널을 비효율적으로 사용하며, 이 인코딩의 주요 목적(DC 밸런싱 및 '0' 와 '1'간의 전환 보장)은 scrambler를 사용할 때는 필요하지 않습니다. 이것이 최신 protocol이 64b/66b 인코딩 및 유사한 방법에 의존하는 이유입니다. 그러나 64b/66b는 실제로 인코딩 방법이 아니라는 점에 유의하는 것이 중요합니다. 오히려 데이터 스트림과 제어어를 구성하는 방법입니다. 데이터는 다른 표현으로 인코딩되지 않습니다. 일어나는 일은 데이터가 세그먼트로 구성되고, 동기화를 허용하고 채널을 통해 제어 정보를 전송하기 위해 추가 bits가 삽입된다는 것입니다.
K-symbols는 8b/10b 인코딩의 일부일 뿐이며 다른 코딩 포맷에서는 사용할 수 없습니다.
64b/66b 인코딩은 여러 protocols, 예를 들어 10G/100G Ethernet에서 사용됩니다. PCIe 및 USB 의 고급 버전은 아래에서 설명하는 것처럼 다른 방법을 기반으로 한다는 점은 주목할 가치가 있습니다.
64b/66b 인코딩은 데이터 스트림을 64비트 세그먼트로 나누고, 각 세그먼트의 시작 부분에 두 개의 bits를 추가합니다. 따라서 각 세그먼트는 물리적 채널에서 66 bits 길이입니다. 이 두 개의 bits 추가는 두 가지 가능한 값 중 하나를 갖습니다. "01" 또는 "10". 이 두 bits가 "01"이면, 그 뒤에 오는 64비트 단어에는 8개의 bytes 데이터가 들어 있습니다. 이 bits가 "10"이면, 다음 byte 에는 나머지 56 bits 에 무엇이 들어 있는지 정의하는 코드가 들어 있습니다. 데이터 단어와 제어 단어는 몇 개입니까?
제어 단어는 특히 프레임(패킷)의 시작과 끝을 나타내는 데 사용되지만 clock frequency 차이를 보상하기 위해 유휴 단어를 삽입하는 데도 사용됩니다( 8b/10b의 skip symbols와 유사). protocol 에 특정한 제어 단어도 정의할 수 있습니다.
이미 언급했듯이, 처음 두 개의 bits가 "10"인 경우 나머지 64 bits는 두 부분으로 나뉩니다. 8비트 코드 워드와 데이터와 제어 워드의 조합으로 구성된 56 bits . 56비트 세그먼트 내부의 데이터와 제어 워드의 구성은 매우 복잡합니다. 주로 각 제어 워드가 7비트 길이이기 때문입니다. 이 특이성은 나머지 56비트에 8개의 제어 워드를 삽입하는 데 필요합니다.
또한 이 인코딩을 사용하는 protocols는 DC 균형과 데이터의 무작위성을 보장하기 위해 데이터에 scrambler를 사용합니다. 이 무작위성은 equalizer를 위해서만 필요한 것이 아닙니다. 수신기는 도착하는 데이터 스트림에서 66비트 세그먼트의 시작을 찾기 위해 이것이 필요합니다. 이는 66 bits의 각 세그먼트에서 처음 두 개의 bits를 검사하여 수행됩니다. 이 두 개의 bits 쌍이 "01" 또는 "10" 값만 반복적으로 갖는 경우 수신기는 동기화됩니다. 그렇지 않으면 다른 위치를 시도해야 합니다. scrambler는 다른 bits가 무작위인지 확인하므로 수신기가 정렬되지 않은 경우 합법적인 조합 대신 "00" 또는 "11"가 곧 나타납니다.
따라서 전반적으로 64b/66b는 기본 물리 채널을 더 잘 활용하지만 이 방법을 사용하는 protocol은 구현하기가 더 어렵습니다. 특히, 각 세그먼트를 다르게 처리해야 하는 필요성(처음 두 개의 bits 와 그 뒤에 오는 여덟 개의 bits 에 따라 다름)으로 인해 구현이 더 복잡해집니다. 다른 FPGA MGTs는 이 문제에 대해 서로 다른 수준의 지원을 제공합니다. 특히, 일부 MGTs 에는 수신자를 도착 데이터의 66비트 세그먼트와 자동으로 정렬하는 기본 제공 메커니즘이 있습니다. 그럼에도 불구하고 application logic은 데이터와 제어 단어의 조합을 포함하는 66비트 세그먼트를 압축 해제하는 더 어려운 작업을 담당합니다.
FPGA MGT는 66비트 세그먼트 스트림에서 64비트 단어를 추출하기 위한 내장형 gearbox를 가질 가능성이 높습니다. Gearboxes는 이 시리즈의 다음 페이지 에서 더 자세히 설명합니다.
64b/67b, 128b/130b 및 128b/132b
64b/66b가 물리적 채널을 더 잘 활용하더라도 이 방법은 구현하기 복잡합니다. 이것이 아마도 PCIe 와 SuperSpeed USB 모두에 대한 protocols가 8b/10b에서 벗어나면서 다른 경로를 택한 이유일 것입니다.
이 두 protocols는 모두 데이터 스트림이 세그먼트로 나뉜다는 생각을 고수했습니다. 64비트 세그먼트 대신, 이 프로토콜은 128 bits를 기반으로 합니다.
PCIe 3.0 이상은 128b/130b를 기반으로 합니다. 64b/66b 인코딩과 유사하게, 이 protocol 의 각 128비트 세그먼트는 데이터 코드와 제어 코드를 구별하기 위해 "01" 또는 "10"로 시작합니다. SuperSpeed USB Gen 2는 128b/132b를 기반으로 합니다. 각 128비트 세그먼트는 같은 목적으로 "0011" 또는 "1100"로 시작합니다. 유일한 차이점은 USB protocol이 비트 오류에 대한 더 나은 보호를 위해 두 개가 아닌 네 개의 bits를 할당한다는 것입니다.
64b/66b 인코딩과 마찬가지로, 각 세그먼트의 128비트 부분에서 scrambler를 사용하여 데이터 스트림의 DC 밸런싱과 무작위화를 보장합니다. 하지만 64b/66b 와의 유사점은 여기서 끝납니다. 두 protocols 모두 protocol의 자체 구조에 따라 128비트 부분의 내용의 의미를 정의합니다. 따라서 128b/130b 와 128b/132b는 데이터 스트림을 세그먼트로 나누고, 데이터가 들어 있는 부분에 bits를 몇 개나 추가하는지를 나타낼 뿐입니다. 나머지는 각 protocol에 따라 다릅니다.
64b/67b 인코딩은 비슷한 방식으로 작동합니다. 차이점은 64 bits의 각 세그먼트에 동일한 목적을 위해 세 개의 bits가 추가된다는 것입니다. 이 인코딩은 주로 Interlaken protocol에서 사용됩니다.
인코딩 없음
위에서 언급한 인코딩 방법 없이도 통신 링크를 구현할 수 있습니다. 이러한 protocol 의 예로는 xillyp2p가 있는데, 이는 수신기와 송신기를 정렬하고 동기화하기 위해 모든 223 bits 에 동기화 단어를 사용합니다. 이 protocol에 대해 MGT는 단지 SERDES일 뿐입니다. 이 전략의 주요 장점은 protocol이 MGT의 다른 기능에 전혀 의존하지 않는다는 것입니다. 이를 통해 광범위한 MGTs에서 protocol을 구현하는 것이 간소화됩니다.
단점은 FPGA logic resources가 MGT내부에서 수행될 수 있는 작업에 사용된다는 점입니다.
이 접근 방식은 protocol이 인코딩을 통해 도움이 될 수 있는 모든 요구 사항을 충족할 때 적합합니다. DC 밸런싱, 랜덤화(필요한 경우), 동기화 및 단어 정렬, 데이터와 제어 정보의 구별 등이 있습니다.
요약
위에서 보인 것처럼 application logic의 데이터 스트림을 인코딩하는 데는 다양한 접근 방식이 있으며, 인코딩을 전혀 사용하지 않는 것도 가능합니다. 대부분의 애플리케이션에서 8b/10b 인코딩은 작업하기 가장 쉽지만, 이 인코딩은 물리적 채널의 데이터 스트림과 관련하여 낭비적입니다. 이것이 최근의 protocols가 더 효율적이지만 사용하기 훨씬 더 어려운 다른 인코딩 방법을 채택한 이유입니다.
이것으로 MGTs에 대한 이 시리즈 의 세 번째 페이지를 마무리합니다. 다음 페이지에서는 PCS의 일부 부분, 특히 여기에 언급된 인코딩을 구현하는 부분을 소개합니다.