Перейти к содержанию
    

Реализация механизма PCI Express Receiver Detection у Artix-7

Доброго всем дня,

Столкнулся с ещё одной проблемой наличия линка на PCI-E у плат с Артиксами, причём в этот раз LTSSM не может пройти дальше практически самой начальной фазы - Detect.Active, т.е. не отрабатывает процедура Receiver Detection. В описании GTP есть следующий пункт:

image.thumb.png.97ff5c4d25bb47e04994d0553a098d81.png

Судя по нему в начале процедуры определения наличия приёмника ПЛИС должна установить уровень сигнала на линиях TXN и TXP равным (Vdd - Vswing/2). Отдельный вопрос, какое именно значение Vswing они считают правильным, но я предполагаю что 500 мВ. Vdd судя по всему это Vmgtavtt, т.е. 1,2 В. Т.е. в итоге на выходах ПЛИС должно появиться значение напряжения около 0,95 В. Далее, судя по описанию, происходит отключение управляющей цепи и уровень сигнала должен вернуться к Vcmoutac (1,2 В / 2 = 0,6 В) и ПЛИС через заданный интервал должна измерить величину напряжения на линиях TXP/TXN, по которому принимается решение о наличии на линии приёмника. Это полностью согласуется с логикой описания этого процесса в спецификации PCI-E:

image.thumb.png.99bed8cf629e7bc73124fb9577d5c554.png

Однако по факту я наблюдаю совсем другую картину:
1. перед началом процедуры определения приёмника напряжение на выходах 560 мВ;
2. при включении режима определения приёмника на выходе ПЛИС появляется уровень 1,18 В с крутым фронтом (если приёмника нет или он не готов), если приёмник есть и с ним всё хорошо, то уровень около 960 мВ.
3. далее передатчик ПЛИС формирует крутой спад сигнала и уровни возвращаются к исходным 560 мВ;

Т.е. не видно никакого длительного процесса заряда-разряда конденсатора, по которому бы ПЛИС с помощью компаратора (сравнивающего уровень сигнала в линии с опорным значением) могла судить о наличии приёмника на другом конце. Напротив, всё выглядит так, что ПЛИС формирует достаточно мощный импульс и в зависимости от получившегося практически стабильного по времени уровня напряжения принимает решение о наличии/отсутствии приёмника.

Проблема в том, что на некоторых слотах x16 (подключённых напрямую к процессору) процессор далеко не сразу правильно настраивает свои приёмники (подключает терминаторы) или они не сразу включаются и в результате ПЛИС не может определить их наличие, а значит пойти дальше по графу состояний LTSSM. При этом особенно интересно, что в то же самое время, пока ПЛИС не может определить наличие приёмника на другом конце, процессор успешно видит приёмник в ПЛИС и начинает слать TS1/TS2, пытаясь поднимать линк. Однако через некоторый таймаут всё это прекращается, т.к. он по всей видимости не дожидается получения TS1/TS2 от ПЛИС, что логично, т.к. ПЛИС не видит приёмника. Т.е. по факту процессор сам себе обрубает линк с платой. При этом после тёплого ресета линк стабильно поднимается (процессор прогрелся и у него стало всё хорошо? 😉).

Такое поведение наблюдается на паре материнских плат и число чудящих Artix`ов всего два. При этом такая проблема далеко не нова - https://support.xilinx.com/s/article/51135?language=en_US Правда в моём случае процессор не третьего, а четвёртого поколения, для которого такой эрраты в доступной документации нет и значение TX_RXDETECT_REF уже равно рекомендованному 3'b011.

На проблемных платах помогает уменьшение TX_RXDETECT_REF до значения 3'b010, при этом на рабочих платах увеличение значения TX_RXDETECT_REF до 3'b100 ломает установку линка.

Однако логика работы параметра TX_RXDETECT_REF непонятна, т.к. в первую очередь кажется, что этот параметр определяет пороговое значение опорного уровня сигнала внутренного компаратора, при котором приёмник считается подключенным к линии. Однако если установить значение 3'b000, то я вижу, что максимальный уровень выходного сигнала ПЛИС в процессе проверки наличия приёмника снижается до 1,03 В вместо исходных 1,18 В. При этом Detect.Active пролетает с первого раза. Если всё так хорошо, то почему AMD (Xilinx) рекомендует ставить 3'b010 в крайнем случае и то после консультации с их техподдержкой?

Есть-ли у кого-нибудь понимание, как на самом деле работает механизм определения наличия приёмника у Xilinx в седьмой серии? В шестой серии, судя по осциллограммам, механизм реализован плюс-минус также.

Чем на практике чревата установка низких значений TX_RXDETECT_REF?

PS: предложения вида "забить и забыть" принимаются, но игнорируются, т.к. в серии возможны массовые отказы и/или проблемы в совместимости. Поэтому ищется решение, которое бы гарантировало работоспособность плат на Артиксах в максимально широком спектре материнских плат и платформ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наснимал немного картинок попыток Receiver Detection в длинном слоте мат.платы, чтобы было понятно о чём идёт речь.

1. Холодный запуск - попыток начала передачи TS1/TS2 нет, т.к. ПЛИС приёмник не увидела по причине слишком большой амплитуды сигнала на TXP/TXN, которая обусловлена отсутствием нагрузки в виде Rterm на стороне процессора:
PCIE-presence_1.thumb.png.e1dd0b1f83c3bb2e4b6af9c189ca8a15.png

2. Холодный запуск - попыток начала передачи TS1/TS2 нет, т.к. ПЛИС приёмник не увидела по причине слишком большой амплитуды сигнала на TXP/TXN. Но по сравнению с предыдущим вариантом амплитуда ниже, однако недостаточно низкая для определения наличия линка. Т.е. Rterm на стороне процессора подключились, но пока их номинал вне пределов, заданных спецификацией PCIe:

PCIE-Presence_3.thumb.png.a702fe3fcf9ca2240e139a83dca0d347.png

3. Холодный запуск - попыток начала передачи TS1/TS2 есть, линк в итоге поднялся. Но по сравнению с предыдущим вариантом амплитуда та же и компаратору в ПЛИС повезло увидеть "правильный" уровень. Rterm на стороне процессора подключились, но их номинал вне пределов, заданных спецификацией PCIe:

PCIE-Presence_4.thumb.png.43488e5bb9a72088b5b73cd9d8642351.png

4. Теплая перезагрузка по кнопке Reset. Судя по виду диаграммы на линиях TXP/TXN у процессора появились правильные Rterm, линк поднимается с первой попытки:

PCIE-Presence_5.thumb.png.238211b77fede5d664ee3cedbf961a3e.png

5. Заклеил каптоновым скотчем линии TXP/TXP на плате и попробовал запуститься в режиме холодного старта. ПЛИС не увидела приёмника и вошла в режим непрерывных попыток его обнаружения. При этом амплитуда сигнала составила 1,2 В:

PCIE-Presence_6.thumb.png.89fc9a468928dc4553e1d8f2614e3930.png

6. Заклеил каптоновым скотчем линии TXP/TXP на плате, припаял на эти линии после конденсаторов два резистора по 51 Ом на землю, в прошивке ПЛИС установил параметр TX_RXDETECT_REF=3'b000 и попробовал запуститься в режиме холодного старта. ПЛИС сразу увидела наличие "приёмника" и начала передавать TS1/TS2:

PCIE-Presence_50ohm-000.thumb.png.afd912eca36c0b588a2aab9c6c1526f2.png

7. То же самое, что в предыдущем эксперименте, только TX_RXDETECT_REF=3'b011. В режим холодного старта ПЛИС сразу увидела наличие "приёмника" и начала передавать TS1/TS2:

PCIE-Presence_50ohm-011.thumb.png.3eb27834a227d3c82b82e48d202f7e66.png

8. То же самое, что в предыдущем эксперименте, только TX_RXDETECT_REF=3'b111. В режим холодного старта ПЛИС не увидела наличие "приёмника" и не начала передавать TS1/TS2 несмотря на вполне красивую картину на шине:

PCIE-Presence_50ohm-111.thumb.png.9320edd0838653e7c5b8bc0defc3f10b.png

 

Из вышеприведённых результатов я делаю следующие выводы:
1. Значение TX_RXDETECT_REF определяет величину опорного напряжения компаратора, который определяет присутствие приёмника на линиях TXP/TXN. При этом значение по-умолчанию 3'b011 по всей видимости даёт значение опорного уровня около 1,05 В, чего бывает недостаточно для нормальной работы с некотоыми интеловскими процессорами. Значение  3'b010 по всей видимости соответствует значению 1,1 В, которое в моём случае даёт стабильный  результат. Но даже установка значения 3'b000 не несёт никаких фатальных последствий, т.к. без приёмника на линии ПЛИС не начинает передачу TS1/TS2.
2. Параметры приёмника в процессорах/ПЛИС (значения Rterm) нестабильны и могут меняться в процессе работы. В результате если в BIOS стоит малый таймаут на запуск линка PCIe может не успевать подниматься. Возможно это связано с тем, что в процессоре реализован PCIe Gen3, но проверить это невозможно.
3. Короткие слоты, которые подключены к хабу (PCH) всегда работают стабильно и судя по наблюдаемым осциллограммам на них сразу после Reset'a присутствуют правильные значения Rterm.
4. Описание процесса Receiver Detection у Xilinx следует читать так: ПЛИС выдаёт на линии TXP/TXN значение Vdd (MGTAVTT) = 1,2 В, которое при наличии подключённых к линии Rterm = 40...60 Ом даёт значение напряжения Vdd - Vswing/2 = 0,85 В. Vswing = 0,7 В, на которые происходит увеличение напряжения на линиях TXP/TXP, т.е. разность между Vdd и Vcm. Далее, спустя заданный интервал, ПЛИС с помощью компаратора сравнивает значения напряжений на TXP/TXN с пороговым значением и  если значение напряжений ниже порога, то это определяется как присутствие приёмника на линии. После этого выдача 1,2 В на линии TXP/TXN прекращается (закрывается ключ внизу) и трансивер переходи в режим передачи TS1/TS2.

Итог: интеловские процессоры нарушают спецификацию PCIe, но большинство распространённых плат на это забивает и работает, в отличие от Artix-7, которому такое не нравится. Но и ему можно объяснить, что всё хорошо и не стоит излишне переживать. 😉

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, Flood сказал:

В результате, рекомендуете ставить TX_RXDETECT_REF = 3'b010 ?

Да, это повышает шансы и с таким значением этого параметра ни одного сбоя не зафиксировано.

Ещё в эту тему нашлась прикольная эррата на Kintex XC7K325T:

image.thumb.png.292599f18619ded3f0d70dc2e629c0bf.png

Судя по ней и значение  TX_RXDETECT_REF = 3'b000 очень даже ничего, правда там немного другой тип GT-трансивера, но тем не менее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 minutes ago, makc said:

Ещё в эту тему нашлась прикольная эррата на Kintex XC7K325T:

Это не на Engineering sample?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

44 минуты назад, Flood сказал:

Это не на Engineering sample?

Да, из Kintex-7 FPGA XC7K325T CES9937 Errata EN171 (v1.6) February 28, 2012

Я обратил на неё внимание из-за рекомендации по установке значения TX_RXDETECT_REF = 3'b000 и комментария "Set the following attributes to force the transmitter to always detect a receiver".

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...