Занимаюсь сейчас SATA на плате с Kintex7 и уперся в некоторый тупик - поведение трансивера меняется от ресета к ресету и, чаще всего, не обеспечивает нормальной работы.
Сгенерирован стандартный пример на 3 ГБит/с с минимумом изменений, для процедуры сброса используется встроенный контроллер, т.е. снаружи сброс подается только сигналом soft_reset. Далее я наблюдаю происходящее после сброса, ориентируясь главным образом на признак rxnotintable, говорящий об ошибке на нижнем уровне при 10b/8b-декодировании внутри трансивера (ну и заодно rxdisperr).
Я вижу что:
1. Иногда (1 случай из 20) все работает нормально, правда с периодом в минуту-пять-полчаса может проскочить одиночная ошибка (тоже ведь не нормально или как?)
2. В большинстве случаев после прохождения процедур OOB начинают сыпаться ошибки (сразу или через некоторое время). При этом alignment обычно проходит, а вот дальше уже все тухло. От случая к случаю ошибки могут вылезать или длинными периодами, или быть перманентными (например каждое четвертое принятое слово - с ошибкой).
Будь это моя собственная логика, я бы списал на асинхронщину, клоки/сбросы и т.п. Ну тут все происходит внутри адской коробочки и как быть непонятно.
На данный момент я успел проверит следующее:
1. Тупой тест с PRBS на базе готового примера через loopback-кабель проходит - то есть линия сама по себе целая. IBERT тест к сожалению запустить не удается. По невыясненным причинам вивада говорит, то debug-ядра внутри проекта нет (или клока нет). Хотя берется готовый пример,а клок тот же, что и в рабочем проекте.
2. Был найден AR# 53364 с указанием какие параметры задавать RX CDR для разных протоколов. Ни к каким видимым эффектам не привело.
3. Поигрался с разными режимами эквалайзера, впрочем не особо понимая их внутреннюю физику. Опять-таки видимого результата нет.
4. Естественно попробовал разные кабели и несколько жестких дисков.
5. Тайминги в проекте вроде как проходят, но даже если бы не проходили - это все снаружи, а проблемы начинаются непосредственно с приема внутри трансивера.
6. Кое где были упоминания про длительную настройку эквалайзера, которая может мешать начальной процедуре установления соединения. Возможно, но по крайней мере по ее окончании я должен получать из линии символы без ошибок - а сыпятся rxnotintable.
Может кто-то боролся с похожими проблемами и может навести на след проблемы?