Погляд на 10G Ethernet з боку FPGA розробника

Всім привіт!

Багато фахівців знають, що топове мережеве обладнання використовує спеціальні чіпи для обробки трафіку. Я беру участь у розробці таких молотилок і хочу поділитися своїм досвідом у створенні таких високопродуктивних девайсів (з інтерфейсами 10/40/100G Ethernet).

Для створення нового каналу мережевики найчастіше беруть оптику, пару SFP + модулів, втикають їх у девайси: лампочки радісно загоряються, пакети починають приходити: чіп починає їх передавати одержувачам. Але як чіп отримує пакети з середовища передачі? Якщо цікаво, то ласкаво просимо під кат.

IEEE 802.3

Ethernet - це стандарт, прийнятий асоціацією IEEE. Стандарти 802.3 охоплюють всі можливі різновиди Ethernet (від 10M до 100G). Сконцентруємося на конкретній реалізації фізичного рівня: 10GBASE-R («звичайний» 10G, без надмірностей).

На цьому малюнку показано рівні моделі OSI і те, як вони відображаються на подуровни протоколу Ethernet.

Подурівці:

  • PHY - фізичний подуровень.
  • MAC - подуровень керування доступом до середовища.

PHY поділяється на такі частини:

  • PMD - забезпечує передачі та прийому окремих біт на фізичному інтерфейсі.
  • PMA - забезпечує серіалізацію/десеріалізацію даних, а також виділення клока з послідовних даних (на прийомі)
  • PCS - забезпечує скремблювання/дескремблювання, а також кодування/декодування (64b/66b) блоків даних
  • XGXS - XGMII розширювач: використовується якщо PHY і MAC знаходиться на відстані один від одного (опціональний).
  • RECONCILIATION - подуровень, що транслює XGMII в сигнали MAC.

Терміни:

  • Medium - середовище передачі.
  • MDI - інтерфейс, залежний від середовища передачі даних.
  • XGMII - 10G інтерфейс, незалежний від середовища передачі даних. Завдання XGMII - забезпечити просте і дешеве з'єднання між PHY і MAC.
  • XAUI - 10G інтерфейс підключення до трансіверу.

Для кожного типу фізичного рівня може бути своя реалізація окремих PHY-подурівнів: застосовується різне кодування, різні частоти передачі (довжини хвиль), але чіткий поділ на рівні скрізь простежується. Наявність незалежного від середовища інтерфейсу (XGMII) спрощує розробку прикладної логіки чіпів, оскільки при будь-якому підключенні розробник десь отримає XGMII. Про те, що собою являє XGMII ми поговоримо пізніше.

PMD

Найближчим до середовища розташований подуровень PMD: його завдання вирішують спеціальні модулі, які добре відомі мережевим фахівцям:

Тип додатка

Інтерфейс

XENPAK

XAUI

X2

XAUI

XFP

XFI

SFP+

SFI

У цій таблиці вже є знайома абревіатура: XAUI. Залишимо розгляд XENPAK/X2 на середину статті, і звернемося до найбільш популярних модулях: XFP и SFP+.

XFI/SFI

XFI і SFI фактично являють собою один і той же інтерфейс: дифпара, що працює на швидкостях від 9.95 до 11.10 гігабод. Набір швидкостей обумовлюється тим, що кілька стандартів можуть використовувати цей інтерфейс: від 10GBASE-W WAN до 10GBASE-R over G.709. Нас цікавить 10GBASE-R LAN зі швидкістю в 10.3125 гігабод. Одна дифпара використовується для прийому, інша - для передачі.

XFI/SFI з "єднується безпосередньо до ASIC/FPGA

Завдання подурівнів PMA і PCS можна вирішити на чіпі, де ми будемо виконувати подальшу обробку Ethernet пакетів (після того, як виділимо їх з XGMII). Нагадаю, що в подурівні PMA необхідно на прийомі виділити тактову частоту і десеріалізувати вхідний сигнал. Таку роботу можуть виконати спеціальні апаратні блоки, які для інших завдань не можна використовувати. Ці блоки називаються трансіверами. На їх докладний опис може піти ціла стаття: кому цікаво, можуть подивитися блок-схему трансіверів в FPGA компанії Altera.

Після десеріалізації дані потрапляють в подуровень PCS, де проводиться дескремблювання і декодування (64b/66b) і віддаються дані у вигляді XGMII в бік MAC'a. На передачі виконуються зворотні дії.

PCS може бути реалізований як за допомогою спеціальних апаратних блоків (Hard PCS), так і за допомогою логіки, доступної користувачеві (Soft PCS). Зрозуміло, це твердження справедливе тільки для FPGA: у ASIC'ax все зроблено апаратно. Виробники FPGA закладають апаратні PCS блоки для стандартних протоколів, заощаджуючи розробнику час і ресурси FPGA. Наявність таких блоків дуже підкуповує, оскільки багато стандартних протоколів з досвіду працюють з коробки, і для більшості з них код надається безкоштовно виробником FPGA.

Підключення через зовнішній чіп-трансівер

Трансівери в FPGA - річ дорога, додатковий десяток трансіверів може значно підняти ціну на чіп. Є дешевші чіпи, з трансіверами, що працюють на менших швидкостях (можуть серіалізувати/десеріалізувати дані на менших частотах). Іншим високочастотним інтерфейсом, визначеним у розділі 4 стандарту 802.3, є XAUI: 4 диференційні пари зі швидкістю передачі в 3.125 гігабод (для однієї лінії передачі).

Під час використання XAUI виникає опціональний рівень XGXS, який дозволяє віддалити PHY та MAC один від одного на відстань. Наприклад, виконувати в різних чіпах.

Завдання PMA і PCS в такому підключенні можуть виконати спеціальні 10G трансівери (Допускаю, що може виникнути плутанина, оскільки трохи раніше «трансівери» спливли в FPGA, і тепер тут виникає цей термін. Між іншим, додатки XFP/SFP + теж називаються трансіверами.)

Приклади 10G трансіверів:

  • vitesse.com/products/productLine/10GE-PHYs
  • marvell.com/transceivers/alaska-x-gbe
  • broadcom.com/products/Physical-Layer/10-Gigabit-Ethernet-PHYs

Цей трансівер є окремим чіпом, ставиться між XFP/SFP + модулем і «нашим» чіпом, який буде обробляти Ethernet пакети. За фактом, такий трансівер використовуючи блоки PMA і PCS проводить перетворення XFI/SFI в XGMI, а потім XGMII перетворюється в XAUI.

XAUI подається на ASIC/FPGA, де використовуються трансівери, аналогічні тим, що були розглянуті раніше, але на швидкості 3.125G. Робота трансівера відрізняється від того варіанту, як це відбувається в режимі 10G:

  • Потрібно чотири трансівери (чотири апаратні блоки), оскільки використовується 4 дифпари для цього інтерфейсу.
  • XAUI PCS використовує кодування 8b/10b. У 10G PCS застосовується 64b/66b.

XAUI PCS на виході видає інтерфейс XGMII.

Деякі PHY-трансівери можуть відразу видавати на піни інтерфейс XGMII і тоді трансівери в ASIC/FPGA не треба використовувати:

У такого методу підключення є вагомі недоліки:

  • Велика витрата пінів: у варіанті XGMII у одного чіпа використовується мінімум 78 ніжок, проти 16 у варіанті з XAUI.
  • Паралельні інтерфейси можуть вимагати вирівнювання доріжок за платою, що іноді буває нетривіальним.

З'єднання XENPAK/X2

Як я і обіцяв, ми дісталися до цих типів модулів. Нескладно побачити, що їх підключення зводиться до другого варіанту, тільки без використання зовнішнього чіпа-трансівера. Додаток візьме на себе завдання подуровней PMD, PMA і PCS.

XGMII

XGMII визначається в clause 46 стандарту 802.3. Цей інтерфейс складається з незалежного прийому і передачі. Кожен напрямок має 32-бітову шину даних (RXD/TXD [31:0]), чотири контрольні сигнали (RXC/TXC [3:0]) і клок, за яким працює напрямок (RX_CLK/TX_CLK). У стандарті визначено, що шини даних і контрольних сигналів аналізуються на кожен фронт клока (DDR). За шиною даних йде сам пакет, контрольні сигнали визначають початок допомагають «виділяти» початок і кінець пакету, а так само повідомляють про аварії.

Значення RX_CLK/TX_CLK дорівнює 156.25 МГц. Перемноження 156.25 * 10 ^ 6 * 32 * 2 дає рівно 10 Gbit/s. Найчастіше від заплямування по обох фронтах клока йдуть, підвищуючи частоту або ширину даних:

  • Шина 36 біт (32 + 4) на частоті 312.5 МГц.
  • Шина 72 біт (32 * 2 + 4 * 2) на частоті 156.25 МГц.

Чим менше частота, тим простіше обробити ці дані і тим більше бюджетні чіпи можна використовувати. Роботу на частотах у ауд 300 МГц можуть собі дозволити тільки топові (читай, дорогі) FPGA.

Для того, що б «вичепити» з XGMII пакет застосовується спеціальне MAC-ядро:

  • Пропреітарне. Після купівлі ліцензії на таке IP-ядро, ви (найчастіше) отримуєте зашифровані вихідники (без можливості модифікації) і немає особливого обмеження на кількість чіпів, в яких можна використовувати це ядро. Приклад.
  • З відкритим кодом. Такі ядра дуже корисні для новачків, оскільки код відкритий, і можна розібратися як працює. Ліцензія на використання визначається окремо. Приклад.
  • Самописне.

Зрозуміло, у цього ядра є передавальна частина, яка пакет «перетворює» на інтерфейс XGMII.

Найчастіше таке ядро реалізується на логіці, яка доступна для завдань користувача. Однак, є виробник FPGA, який MAC-ядра реалізував апаратно, економлячи ресури користувачеві.

MAC-ядро, виділивши пакет з XGMII і розмістивши пакет у внутрішній пам'яті чіпа, «передає» контроль над пакетом прикладної логіки чіпа: парсерам, фільтрам, системам комутації тощо. Наприклад, якщо чіп стоїть на мережевій карті і буде прийнято рішення про те, що треба пакет переслати на хост, то він може бути відправлений за допомогою PCIe в оперативну пам'ять, підключену до CPU.

Особистий досвід

З L1 більшою мірою доводиться стикатися інженерам-схемотехнікам, які розводять плати для приладів. FPGA-програмісти з цим працюють тільки на початку підйому заліза: коли запрацював XGMII і всі трансівери пройшли тести, то ми концентруємося на тому, як зробити обробку трафіку. В одному приладі зроблено підключення за першим варіантом: SFI безпосередньо заходить в FPGA. У двох інших за другим варіантом (з використанням трансівера і XAUI). Так само є девайс у якого є підключення як безпосередньо SFI, так і через XAUI, але без трансівера (FPGA підключається до іншого чіпа).

Для використання зовнішніх трансіверів (та й взагалі, більшості спеціалізованих чіпів) необхідно підписати NDA. З цим особливих проблем найчастіше не виникає. Разом з NDA видаються різні доки, наприклад, налаштування регістрів чіпа. З досвіду роботи з трансіверами від двох різних виробників зауважу, що при підйомі заліза в першій партії стабільно виникають якісь проблеми з налаштуванням трансівера, які відносно швидко вирішувалися: трансівери багатофункціональні і іноді для налаштування на необхідний режим роботи треба пошаманити. Іноді буває, що документація на чіпи буває дуже погана, і доводитися перебирати різні варіанти, а техпідтримка не відповідає або відкрито заявляє, що підтримку за цими чіпами вона не здійснює.

Один з плюсів використання чіпа-трансівера є те, що разом з документацією може поширюватися набір прошивок-налаштувань, які необхідно завантажувати в трансівер при установці певного типу модуля. На скільки я розумію, ці прошивки роблять хитре налаштування еквалайзерів, без якого певний тип модулів буде працювати з бітовими помилками. Один з таких SFP + модулів (з лімітуючим підсилювачем) лікувався саме таким чином. Якщо підключатися без трансивера, то такі налаштування треба готувати самим для ASIC/FPGA, що може бути нетривіальним завданням.

Наявність інтерфейсу, який незалежний від середовища передачі, дуже спрощує життя, оскільки код (application logic: парсери, генератори, аналізатори, фільтри тощо) дуже легко портувати зі старих проектів у нові, оскільки не важливо, який тип підключення використовувався.

Підключення (і обробка) 40G/100G до ASIC/FPGA схожа на 10G, однак, там є свої нюанси. Якщо буде цікаво, цьому можна буде присвятити окрему статтю, правда, великою вона не буде.

Hello, habr!

Візьмемо звичайний UDP-пакет з рядком «Hello, habr!» і відправимо на прилад, що б подивитися, як він буде виглядати на XGMII.

У мене на столі лежить розібраний девайс, на якому найчастіше відбувається тестування нових фіч: використовуємо його для наочного прикладу. Для цього підготуємо спеціальну прошивку і підключимо налагоджувач, щоб побачити сигнали всередині чіпа. Підключення 10G зроблено за другим варіантом: за допомогою зовнішнього трансівера, який віддає дані по XAUI в бік FPGA. Цей трансівер двоканальний: може працювати з двома SFP +.

Як виглядає XGMII (і наш пакет) всередині FPGA:

У цьому приладі всередині FPGA використовується 72 бітова шина XGMII, що працює на по позитивному фронту частоти 156.25 МГц.

Легенда:

  • xgmii_rxc - набір контрольних сигналів.
  • xgmii_rxd - набір сигналів даних (розбито на байти для зручності).
  • IDLE - сигнали відсутності передачі пакета.
  • PREAMBLE - преамбула, позначає початок передачі пакета.
  • L2_HDR - заголовок 2 рівня: Ethernet.
  • L3_HDR - заголовок 3 рівня: IP.
  • L4_HDR - заголовок 4 рівня: UDP.
  • MSG - наше повідомлення («Hello, habr!»).
  • PAD - заповнення. Присуває в пакеті, якщо початкова довжина корисного навантаження була менше 60 байт.
  • FCS - це перевірка пакета. За нею можна визначити, побився пакет під час пересилання, чи ні.
  • TERM - сигнал закінчення передачі пакета.

Можна зауважити, що для отримання Ethernet пакета залишилося небагато: знайти його початок і кінець (за контрольними символами) і вирізати зайве: IDLE, PREAMBLE и TERM.

Дякую за час і увагу! Якщо з'явилися питання, ставте без сумнівів.

P.S.

Дякую моїм колегам по цеху des333 і paulig за конструктивну критику і поради.