Як подружити PCIe з 10-метровими мідними кабелями і 100-метрової оптикою

Добрий день!

Мене звати Антон. У компанії YADRO я займаюся хардверной розробкою.

В кінці оглядової статті про історію та розвиток PCI Express Олексій згадав про нашому власному адаптер для зовнішнього підключення PCI Express (далі для стислості — PCIe) пристроїв за допомогою кабелю. Сьогодні я розповім, як ми його тестували і доводили для правильної роботи з різними типами і довжинами кабельних з'єднань.



Адаптер був розроблений для з'єднання компонентів наших систем між собою по шині PCIe допомогою кабелю. На момент розробки існуючі для цього готові рішення нас не влаштовували по ряду причин – якісь не підтримували швидкості Gen3, які використовували кабелі, які ми вважали безперспективними і т. п.

Далі я розповім, з якими проблемами ми зіткнулися (і досі стикаємося) при роботі з нашим адаптером. Але для того, щоб краще розуміти сенс — спочатку заглибимося в теоретичні аспекти взаємодії PCIe пристроїв.

Зроблю застереження — описане нижче належить в цілому до PCIe, але в рамках цієї статті для конкретики я використовував термінологію з документації PLX, так як працює наш адаптер саме на чіпі цього виробника. У інших виробників аналогічні методи і сутності можуть називатися інакше, що суті не змінює.

Тюнінг
PCIe-пристрої мають еквалайзер в приймальному і передавальному трактах. Параметри еквалайзерів можна і потрібно змінювати (тюнінгувати) з метою отримання надійного (BER < 10-12) з'єднання.

Тюнінг передавача
Передавачі PCIe мають наступні параметри еквалайзера, якими можна управляти:
  • De-emphasis або post-cursor
  • Pre-shoot або pre-cursor
  • Main або cursor
Щоб слово «cursor» не миготіло постійно — далі я буду використовувати перші версії найменування даних параметрів.

Ці параметри визначають співвідношення між амплітудами сигналу у часовій області:


Коефіцієнт De-emphasis визначає співвідношення Vb/Va, коефіцієнт Pre-shoot відповідає за співвідношення Vc/Vb, Main — це, за великим рахунком, розмах між максимальним значенням з урахуванням pre-shoot і мінімальним з урахуванням de-emphasis (розмах між короткою верхньою полицею і довгою нижньою) або навпаки.

Якщо не дуже глибоко вдаватися в технічні деталі — De-emphasis посилює амплітуду переданого біта в залежності від значення попереднього біта, а Pre-shoot — робить те ж саме в залежності від значення наступного біта. Main визначає розмах сигналу в цілому.

Значення Main, De-emphasis і Pre-shoot задаються коефіцієнтами від 0 до 63. Сума всіх коефіцієнтів дорівнює 63. Тобто, якщо поставити Pre-shoot = 6 (3.5 dB), а De-emphasis = 13 (-6 dB), то на Main залишиться тільки 44. Таким чином відбувається перерозподіл енергії сигналу між ВЧ (перемикання бітів) і НЧ (1 або 0) складовими.

Забігаючи вперед, скажу: для 10-метрового кабелю в нашому випадку оптимальні значення — це на 63 Main і по нулях на Pre-shoot і De-emphasis, або 55-57 на Main з невеликим значенням Pre-shoot. Тобто на такій довжині кабелю сигнал загасає так, що приймача вже стає не до фронтів — він просто не може розпізнати наявність сигналу в лінії.

Тюнінг приймача
При надходженні сигналу в приймач послідовно задіюються такі інструменти:
  • ATT (аттенюатор);
  • BOOST або CTLE — підсилювач ВЧ складової;
  • DFE — блок, по суті працює аналогічно de-emphasis/pre-shoot стадіями передавача (за замовчуванням вимкнено), призначений для усунення міжсимвольної інтерференції (ISI).
Передатна функція ATT — практично рівномірний ослаблення сигналу у всьому діапазоні частот:


Передатна функція CTLE — значне посилення в області ВЧ:


Зазвичай ATT і CTLE працюють в протифазі — низькі значення ATT супроводжуються високими значеннями CTLE. Тобто приймач спочатку масштабує вхідний сигнал до прийнятного рівня, а потім накачує ВЧ складову, яка зазнає найбільшого ослаблення в процесі проходження по каналу.

Якщо доводиться налаштовувати коефіцієнти руками, то потрібно мати на увазі, що слабка аттенюация (і як наслідок – надмірно відкритий «око») може призвести до перенасичення слайсера в приймальному тракті. А надто велике значення BOOST – приводить і до посилення ВЧ шумів, обумовлених, наприклад, перехресними перешкодами. Загалом — не потрібно викручувати ці ручки в максимум.

Знову-таки, забігаючи вперед, у разі 10-метрового кабелю ATT калібрується на 0x0F — максимальне значення, яке означає відсутність аттенюаціі. І CTLE в районі 0x09 — досить серйозне посилення ВЧ. Тобто на цих дистанціях сигнал загасає так, що тут як раз ручки майже максимум доводиться викручувати.

Тренування PCIe Gen3
PCIe Gen3 принципово відрізняється від Gen2 і Gen1 тим, що в процесі тренування присутній итеративная фаза, в ході якої підлаштовуються параметри приймального і передавального трактів. Дуже укрупнено процес тренування виглядає наступним чином:
  1. Все починається з Gen1. На даному етапі ніякого тюнінгу немає, всі стартують з стандартними значеннями і не змінюють їх в процесі. Зокрема, для приймача Gen1 це ATT=0x09, CTLE=0x05.
  2. DownStream порт повідомляє Upstream порту початкові значення для налаштування передавача (TX PRESETS) для Gen3 і задає стартові значення для самого себе (зазвичай вони збігаються).
  3. Upstream порт налаштовує свій передавач, і партнери переходять в режим Gen3. Якщо якість з'єднання при цьому не дозволяє отримати BER нижче ніж 10-4 — то все, нічого не працює. Тобто стартові значення параметрів найчастіше бувають важливі.
  4. Якщо link-up стався — Downstream порт починає калібрувати свій приймач і радити Upstream порту нові налаштування передавача до моменту досягнення BER 10-12.
  5. Після цього відбувається та ж процедура, але навпаки — радить Upstream, а DownStream калібрується. Ну і далі трапляється link-up.
Механізм такого інформаційного взаємодії партнерів з'єднання називається Backchannel Tuning.

Тестування і доведення при роботі з мідними кабелями
На момент першого включення ми, звичайно, не проводили ніяких тестів (а хто їх проводить?). Ми зчепили два адаптера мідним кабелем, і побачили замигавшую лампочку. Далі з допомогою команди lspci ми перевіряли, що віддалено підключений PCIe-комутатор видно в дереві PCIe системи, і параметри встановленого з'єднання відповідають очікуваним, тобто x4/x8/x16 (залежно від конфігурації) на швидкості 8 ГТ/с.

Далі ми почали більш детально вивчати якість з'єднання. Для півметрових і триметрових кабелів BER був нульовий. З 10-метровими кабелями виникли складнощі, і для їх вирішення довелося добряче попрацювати.

Link-up на 10 метрах у нас стався відразу, але супроводжувався величезною швидкістю наростання помилок. Дані можна було передавати, але дуже повільно. І скільки б ми не гралися з TX PRESETS, скільки б ні тюнинговали приймач — нічого не допомагало. Вирішили включити DFE. І… нічого не сталося.

Подальші дослідження привели нас до того, що DFE має два режими роботи — т. зв. EDFE (Edge DFE), метою якого є розширити «око» сигналу по осі часу, і тестовий режим CDFE (Central DFE), метою якого є підвищити розкривши «очі» по осі амплітуди.

EDFE нам не допоміг.

CDFE у PLX сімейства Capella 1 включається таємничої розписом невідомих регістрів — дуже схожою на введення якийсь кодової послідовності. Суть її виробником не розкривається. Але він нам допоміг досить відчутно — BER з 120 k x 10-12 знизився до 1.5 k x 10-12. Але це все одно вище необхідного стандартом рівня, і ми продовжили битися головою об стіну, перебираючи різні параметри.

Ми грали великою кількістю різних параметрів, наприклад, чутливістю приймача, часом оцінки передавача, кількістю ітерацій — не допомагало нічого. Треба сказати, що апаратні засоби комутатора PLX разом з спеціалізованим ПЗ дозволяють отримати зображення глазкової діаграми для кожної лінії. Але для нас ця функція виявилася марною, так як точка захоплення даних, що використовуються при побудові глазкової діаграми, знаходиться до блоку DFE — тобто, ми не бачимо, що робить DFE з сигналом. А до DFE у нас не просто закритий «око», а буквально 0 в лінії (хоча link-up все-таки виходить).

В результаті у нас настала деморалізація. Ми зрозуміли, що авіаносець зупинити не вийде, і вирішили пошукати гудзик — зайнялися іншою проблемою, яку до цього тимчасово відклали. Проблема полягала в тому, що в загальному-то link-up іноді відбувався не на всіх лініях. Це говорило про те, що були якісь проблеми при початковому з'єднанні на швидкості Gen1 — так як саме на цьому етапі вибраковуються лінії.

Ми включили (знову ж тестовий) режим калібрування Gen1 (в стандартній роботі він не передбачений). Gen1 зовсім перестав працювати (мабуть ніяк не міг вийти на прийнятний рівень BER)— але натомість ми побачили, на яких параметрах приймач намагається зробити link-up, куди він прагне, і раптово зрозуміли, що вони знаходяться в іншій всесвіту по відношенню до стандартних. Заради цікавості ми взяли і перебили стандартні 0x09/0x05 на 0x09/0x0F (вимкнули аттенюатор для Gen1).

І отримали не просто стабільний link-up Gen1, але і набагато більш приємні значення BER для Gen3 — 0.3 x 10-12, що вже вкладається в рамки стандарту. Яким чином приймальний тракт Gen1 пов'язаний з Gen3 — виробник не говорить. Але так ось воно працює.

Робота з оптичними кабелями
З оптичними кабелями довелося окремо повозитися з-за особливостей PCIe, але в порівнянні з роботою за «пробивання» 10-метрових мідних кабелів це було простіше.

Якщо коротко позначати ситуацію — з оптикою все інакше, ніж для міді.

У чому відмінності від міді
Receiver Detect
Після початку роботи передавачі PCIe починають перевіряти лінію на предмет наявності навантаження. Роблять вони це, аналізуючи сигнал, відбитий від протилежного кінця лінії. Якщо лінія не терминирована приймачем — передавач це розпізнає і выбраковывает цю лінію.

Проблема з оптичними приймачами полягає в тому, що часто їх термінація не відповідає специфікації PCIe, вони можуть бути терминированы на інший імпеданс або взагалі не бути терминированы на землю. Побачивши таке, передавач може вирішити, що у нього приймача немає — і не почати процедуру встановлення з'єднання. Для коректної роботи з оптикою рекомендується замаскувати сигнали блоку Receiver Detect. Іншими словами, змусити передавач «бачити» приймач.

Стан Electrical Idle (далі — IDLE)
Періоди простою лінії з відсутністю модуляції, викликані, наприклад, переходом в стан низького споживання, можуть призвести до перенасичення PIN-діода і викликати проблеми при виході з цього стану. Приймач може помилково прийняти шум, викликаний перехідним станом оптичного приймача, за вихід з стану IDLE і налаштуватися на помилкову частоту. Це призведе до вибракування даної лінії при процедури встановлення з'єднання в подальшому.

На малюнку нижче показано, що отримує приймач PCIe, коли в лінії з оптикою трапляється IDLE:


Там, де «Dead Zone» — повинен бути постійний рівень сигналу. А величина «Settling time» може мати різне значення на різних лініях.

Режим Inferred IDLE
При використанні режиму Inferred IDLE приймач аналізує контекст переданих даних і не покладається на рівні сигналу при визначенні входу в стан IDLE. Використання даного режиму переважно при використанні оптичного кабелю, оскільки без нього:
  • перехідні процеси в оптичному приймачі можуть ініціювати помилковий вхід у стан IDLE і наступні стадії станів автомата LTSSM.
  • перехід в стан IDLE одним партнером, може бути не розпізнано другим партнером.
У комутаторах PLX – це режим за замовчуванням.

Downtrain Disable
В процесі встановлення з'єднання приймач намагається зловити з'єднання на найстаршій або самої молодшої лінії. Як тільки він це зробить, у решти ліній залишається обмежений час на завершення тренування. В увазі описаних вище причин, настройка різних ліній може займати сильно різний час, тому після встановлення з'єднання по крайній лінії інші можуть просто не встигнути і будуть вибраковано. Рекомендується заборонити приймача встановлювати з'єднання на ширині каналу нижче заданої, щоб він до кінця намагався налаштувати всі лінії порту.

Тюнінг
Оптичні пристрої нелинейны, тому покладатися на механізм Backchannel Tuning не можна, так як він розраховує на лінійне ослаблення сигналу при розрахунку коефіцієнтів калібрування приймачів і передавачів. В ряді випадків його краще вимикати, а параметри приймачів і передавачів калібрувати руками.

Загалом, існує досить багато параметрів, якими можна управляти, щоб змусити оптику працювати. Щоб мати до них доступ «на льоту», ми поставили на адаптер мікросхему CPLD. Почали ми з того, що задіяли відразу всі параметри, рекомендовані виробником комутатора, — і нічого не сталося. Потім ми виявили, що один параметр, а саме відключення блоку Receiver Detect, ми забули.

Включили його, і оптика ожила.

Потім всі параметри, крім Receiver Detect, ми повернули в стан за замовчуванням. Оптика продовжила жити.

Маскування Receiver Detect жодним чином не заважає роботі і по пасивному мідному кабелю. Таким чином ми отримали працездатну на обох типах сполук конфігурацію.

Треба сказати, що в каналі іноді з'являються помилки, але частота їх виникнення знаходиться в рамках стандарту. А так як тюнінгом стосовно оптиці ми по суті поки ще не займалися, тобто стійке переконання, що ці помилки можна перемогти.

Дослідники даного питання сильно і багато лякають розробників тим, що з-за великих виробничих розкидів між кабелями досить проблематично зібрати з'єднання x8 з двох кабелів x4, а тим паче x16 — з 4 кабелів x4. Тому, задавшись метою мінімізувати ці ризики, ми вирівняли всі траси на платі в 100 пс. Я не знаю, мало це якесь значення, але проблем з агрегування чотирьох лінків х4 в x16 на 100-метровій оптиці у нас не виникло.

Загальні проблеми
У використовуваному нами кабельному з'єднанні (і оптичному, і мідному) є такі підводні камені:
  • в лінії не передається опорний синхросигнал (далі – клок);
  • в лінії не передається I2C;
  • в лінії не передається PERST#, PRSNT# та інший sideband.


Клок
У загальному випадку PCIe жмут необхідний для нормальної працездатності каналу. Але використовувані нами комутатори — SRIS-сумісні. SRIS — Separate Reference Independent Spread. Простими словами, вони не просто можуть працювати на різних клоках, але ці клок можуть бути SSC.
SSCSpread Spectrum Clocking — це модуляція частоти клока в інтервалі 0 до -5000 ppm частотою 30-33 кГц. Застосовується для зниження ЕМІ. Потужність випромінювання при цьому розмазується в спектрі, так як частота клока постійно трохи плаває.
При цьому нормальна робота можлива тільки при з'єднанні двох SRIS пристроїв. Працездатність при прямому безклоковом підключенні хост процесора до чого б то не було не гарантується. Хоча ми спостерігали нормальну роботу при безклоковом кабельному з'єднанні процесора x86 з PLX пристроєм за умови, що використовуваний на хост-процесорі жмут не використовує SSC. Це називається SRNS — Separate Reference No Spread.

Наш адаптер має власну підсистему клоков, яка дозволяє як тактувати все від системного PCIe клока, так і працювати на своєму, — який в свою чергу може бути як SSC, так і не SSC.

Робота на системному клоке в результаті тестування нам не сподобалася, хоча ми плекали надію працювати тільки на ньому, а все решту схематику, що відноситься до клокам — прибрати.

Робота на власному клоке як nonSSC так і SSC — стабільна та надійна при використанні пасивних мідних кабелів до 4 метрів, а так само з оптичним кабелем. Для 10-метрового мідного кабелю нормальна робота каналу в даний момент досягається тільки при nonSSC клоке.

I2C
Це опціональний інтерфейс, і ми взагалі нічого не втрачаємо, не передаючи його. Просто треба було зазначити, що ми його не передаємо.

Інший sideband
Відсутність оного тягне, наприклад, такі проблеми:
  • неможливість синхронного скидання всього PCIe дерева, як це відбувається, коли всі PCIe пристрою в одній коробочці;
  • проблеми з раптовим зникненням і додаванням пристроїв на шині PCIe;
та інше подібне, що можна назвати загальним словом — синхронізація.

Дані проблеми потребують більш глобального підходу і будуть вирішуватись на етапі системної інтеграції. В даний момент ми обходимося тим, що включаємо хост-систему після таргету, щоб хост-система могла нормально здійснити энумерацию PCIe пристроїв в стандартному процесі своєї завантаження.

Також ця проблема неактуальна при використанні NTB.

Варіанти і аналоги
Власне, як вже згадував Олексій минулій статті, адаптер у нас буде у двох варіантах. Другий варіант не буде оснащений комутатором PCIe, а буде мати простий редрайвер. Це більш дешевий варіант, який підходить для тих випадків, коли не потрібна біфуркація портів.

Ще треба сказати, що у використовуваному нами відносно недорогому чіпі PCIe-комутатора немає контролера DMA. Тому якщо з'єднати між собою два цих адаптера, швидкість буде невисокою і сильно залежати від роботи процесора – від того, як і якими він оперує блоками даних. При наявності хоча б за одним адаптером DMA контролера — реальна швидкість зазвичай становить близько 50-60% від фізично доступного межі – тобто близько 8-9 ГБ/с в одну сторону. Хоча, звичайно, окремо взята операція з пересилання даних може статися і на швидкості 16 ГБ/с. PR-щики люблять писати 32 ГБ/с — це фізичний межа в ОБИДВІ сторони. Але інформаційна взаємодія на шини PCIe зазвичай двостороннє – на кожну транзакцію таргет відсилає Completion Response. Так що робота з продуктивністю 32 ГБ/с представляється мені вельми сумнівною.

Природно, такий вибір чіпа цілком раціональний: у запланованих сценаріїв використання хоча б за одним адаптером обов'язково буде контролер DMA. Тому переплачувати вдвічі за більш просунутий чіп PCIe-комутатора зі вбудованою підтримкою DMA в нашому випадку немає сенсу.

Продавати цей адаптер як окремий продукт не плануємо — не наша сфера діяльності, будемо ставити тільки в комплексні рішення з власного обладнання. Якщо потрібен подібний адаптер з DMA-контролером, то на ринку з'явилися такі рішення. Можна подивитися на Dolphin PXH830 (HBA) або PHX832 (Host/Target), хоча у цих адаптерів трохи інші параметри.

У моделі 830 заявлена можливість розбиття портів на 2 x8 або 1 x16, нашого режиму 4 x4 немає. Модель 832 може працювати в режимі 4 x4, але тільки з пасивними кабелями до 5 м. Для обох моделей заявлена підтримка оптичних кабелів довжиною до 100 м.

Що далі?
У підсумку адаптер заробив з мідними кабелями до 10 метрів і з оптичними до 100 метрів, BER в обох випадках знаходиться в межах припустимих стандартом. Плануємо випустити другу ревізію із зменшеною кількістю шарів, поліпшити layout, потестувати і погратися з тонкою настройкою параметрів під оптику для додаткової шліфування результатів.

Дякую за увагу.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.