Добрый день. Хотел бы рассказать о работе с высокочастотными шинами с точки зрения согласования линий. Тема, как мне кажется, неочевидная.
Стоит оговориться, что подробнее про разработку печатных плат рассказано в пособии/методичке, написанной мной же. Ссылка. Распространение полностью свободное и бесплатное, цель – снизить порог вхождения для новичков и студентов, а также получить обратную связь.
1) Зачем согласовывать линии между собой
Итак, сначала нужно определить, что вообще надо согласовывать и с кем, как – уже потом. Есть интерфейсы последовательные – это когда все сообщение целиком идет по одной линии за несколько тактов. Есть интерфейсы параллельные, это когда сообщение передается за один такт по нескольким линиям.
Также интерфейсы бывают синхронные и асинхронные. У синхронных добавляется еще одна линия – синхронизация. По ней идет сигнал тактирования (буквально 0101, прямоугольный сигнал или синус). Нужна она, очевидно, для синхронизации обоих устройств (или множества, смотря что за интерфейс). Главное устройство на линии (Master) вместе с отправкой бита по сигнальной линии дает также синхроимпульс по линии синхронизации, и подчиненное устройство (Slave) «смотрит» на эту линию синхронизации. Когда на ней происходит определенное событие (обычно ловит фронт, возрастающий или нисходящий, то есть переключение с 0 на 1 или наоборот) – Slave считывает состояние сигнальной линии, и так бит за битом. Конечно, синхронизация бывает разной, но сейчас не об этом. То есть, линия синхронизации нужна для того, чтобы второе устройство на линии точно знало, когда нужно «ловить» бит информации. С асинхронными интерфейсами все по-другому. Оба устройства заранее должны знать, на какой частоте они работают (например, указывается в прошивках) или уметь «договариваться» о рабочей частоте (как PCIe, например). Оба имеют встроенные генераторы тактовых импульсов, по которым происходит считывание или передача данных. В таком случае трассировать надо на одну линию меньше, но интерфейс становится сложнее с точки зрения алгоритмов и аппаратной части микросхемы. К тому же теоретически синхронные интерфейсы надежнее (но история уже показала, что не все так однозначно).
Вся эта тирада нужна была для того, чтобы объяснить – а зачем вообще согласовывать время распространения сигналов. Так вот, есть у нас параллельная шина (то есть, в одно и то же время из Master выходят сигналы по нескольким линиям, и Slave должен получить их тоже в один и тот же момент времени) или синхронный последовательный интерфейс (Slave должен сопоставить состояние линии сигнала и линии синхронизации). Если будет рассинхронизация линий – часть сообщения потеряется, или будет записана с ошибкой. Представьте, что у вас есть 4 линии данных, по трем сигнал доходит за 1 такт, по третьей – за 2 такта. В итоге каждое сообщение будет содержать 3 актуальных бита и 1 «старый», из-за чего информация превратится в кашу, ибо правильно собирать и самостоятельно согласовывать линии по времени – задача сложная, так микросхемы были бы в разы дороже.
Что с этим делать? Правильно, нужно сделать так, чтобы сигналы приходили к Slave в один и тот же момент времени. Как? Для начала нужно понять, откуда берется вообще рассинхронизация. Любая линия, хоть на плате, хоть простой проводочек, имеет скорость распространения сигнала. От чего она зависит – отдельный момент, разберем позже. Но раз есть скорость – значит для конкретного фронта сигнала есть и время распространения от одного устройства до другого. А если это время распространения у разных фронтов одной шины отличается – возникает тот самый рассинхрон. А это время распространения и называется той самой задержкой, обычно исчисляется в пикосекундах.
2) Почему именно время
Можно подумать, что достаточно сделать дорожки одной длины. Длина одинаковая, значит сигналы придут одинаково, верно? Если бы все было так просто. Если линии идут по одному слою, на их пути нет переходных отверстий, опорная плоскость идеально покрывает весь слой под ними, в микросхемах нет внутренних задержек/длин (о них дальше) – то да, так считать можно (при трассировке дифференциальной пары иногда так и правда делать можно, но сейчас не о ней). Пришла пора рассказать, что же влияет на скорость распространения сигнала (фазовая скорость, если по-умному). В идеальных условиях – емкость и индуктивность линии, то есть – ширина дорожки, расстояние до опорной плоскости и диэлектрическая проницаемость (если очень интересно – можно побаловаться в калькуляторе импеданса Altium Designer, поменять ширину линии, параметры диэлектрика и увидеть скорость распространения, он ее пишет). В неидеальных – добавляются еще шероховатость меди и неоднородность диэлектрика, но это уже отдельная тема. Все это означает, что скорость распространения сигнала в разных условиях будет разной.
Разные условия – это разные слои печатной платы и использование переходных отверстий. На самом деле еще очень много что, но об этом не сейчас. В реальной жизни развести шину по одному слою бывает невозможно или крайне затруднительно. А значит придется использовать как минимум два, да еще и с переходным отверстием. По внешним слоям все распространяется одинаково при одинаковой ширине дорожки, тут все понятно (если под этими слоями одинаковые диэлектрики). Но вот внутренние – другая история, ибо медь есть по обе стороны от дорожки, и сверху, и снизу. То есть, емкостная связь образуется с полигонами на обеих плоскостях (или полигоном на одном слое и всякой хренью на другом), а значит – скорость распространения изменится. Это означает, что на миллиметр длины дорожки задержка будет другой. То есть, проложили вы часть линий шины на внешнем слое, часть – на внутреннем, сделали их одинаковыми по длине. Вот только на внешнем на один миллиметр приходится, например, 5 пикосекунд, а на внутреннем – 6,5. На 30 мм (а это еще довольно мало) это даст рассогласование в 45 пикосекунд (а окно допуска интерфейса, к примеру, 15 пикосекунд) – и все, оно работать с большой вероятностью откажется.
Один момент про внутренние слои. Если расположить на одном из соседних слоев не цельный полигон земли (или любой другой, что довольно нехорошо, но когда выбора нет – выбора нет), а накидать разной хрени (сигнальные линии, куски полигонов) – то рассчитать скорость распространения рассматриваемой сигнальной линии будет сложно. Без полноценного физического моделирования (Ansys/софт от Keysight, например) ничего не выйдет. Разумеется, можно прищуриться, прошептать «плевать» и считать значение задержки на миллиметр как для линии, соседствующей с двумя полигонами, но гарантий работоспособности такой топологии никто не даст (если интерфейс, опять же, очень чувствителен к этому, как та же DDR).
Про слои вроде бы понятно, скорость распространения разная, из-за этого если линии одной шины разбросаны на разных слоях или переходят между слоями – надо согласовывать их по задержке, а не длине. Теперь можно переключиться на переходные отверстия. Они являются элементом трассы, имеют эффективную длину (то есть, путь сигнала, если он идет не через все слои). А значит – обладают собственной задержкой. Тот же Altium Designer, который я использую, сам эту задержку не умеет не считает. Сразу стоит обозначить порядок вносимой задержки, чтобы вы понимали, можете вы это игнорировать или нет: ~5-20 пс. Да, разброс большой и зависит от немалого количества факторов: диаметр медного стакана, толщина меди в этом стакане, диаметр «юбки», наличие юбки на каждом из слоев, наличие дорожек/полигонов рядом с переходным отверстием на каждом слое, все используемые диэлектрики и так далее. Короче говоря, руками считать не очень удобно. Честно говоря, я и сам не нашел конкретного ответа на вопрос «что делать?», но есть пути решения. Первый – взять переходное отверстие за 10 пикосекунд, вбить это значение в свойства переходного отверстия и пусть Altium делает с этим что хочет (а он будет, но об этом позже). Или другой вариант – написать свою программу для расчета задержки в отверстии (пришлось такую колхозить). Верифицировать ее особо нечем, но планка DDR4 на частоте 3200 МТ/с и материнские платы с LPDDR4X на 4266 МТ/с, разработанные мной, работают стабильно.
Так вот, про взаимодействие Altium и задержки переходного отверстия. Задержка указывается для всего отверстия, от первого до последнего слоя. Но, если сигнал проходит путь не целиком, а, например, выходит где-то на среднем слое – он вычислит эффективную длину переходного отверстия и возьмет только часть общей задержки в отверстии (да, пропорционально). С длиной он, кстати, работает тут хорошо – умеет понимать, какой путь проходит сигнал в переходном отверстии на самом деле и добавляет все это к общей длине/задержке.
3) Дополнительные факторы
На задержку влияет многое: внутренние контактные длины/задержки микросхем, стек платы, качество опорной плоскости, соблюдение импеданса, различные неоднородности на пути линии (изменение ширины/последовательные компоненты/переходные отверстия), соседство с другими линиями/полигонами/иными элементами топологии и так далее. Поговорим мы о неоднородностях, импедансе и внутренних задержках,
3.1) Внутренние контактные задержки и длины микросхем
Подумаем, что такое микросхема? Кусок правильно обработанного кремния, подключенный проволочками к выводам или подложке. Значит, внутри нее тоже есть линия передачи – от области, что отправляет/принимает сигнал до посадочного места на плате, и эти линии передачи тоже имеют собственную задержку. В подробности вдаваться не будем, так как это головная боль производителя микросхемы – измерить эту задержку и дать нам эти данные, просто запомним, что оно есть всегда и в некоторых случаях это нужно учитывать, а в некоторых – нет.
В некоторых случаях можно считать эти задержки заранее согласованными «как надо» – то есть, на параллельных линиях все выровнено, в дифференциальных парах – тоже. Те же микросхемы в корпусах QFN/QFP и им подобные – типичный случай. А вот с BGA – уже сложнее, ибо такие микросхемы могут быть произведены по-разному. Подложка может быть текстолитовой (как у любого процессора, например), и в этой подложке сигналы неизбежно ловят рассинхронизацию, в таком случае производитель должен предоставлять в пачке документации файл с этими задержками. А иногда подложка сделана из каких-то полимеров или эпоксидных составов, и там уже можно надеяться, что производитель не забил и растащил сигналы по контактным площадкам относительно ровно.
Также на учитывать/не учитывать влияет тип интерфейса и его частота. Согласитесь, для какого-нибудь UART совершенно неважно, 10 пикосекунд в микросхеме или 100, ибо на одной из самых распространенных частот –115200 бит/с, период одного бита составляет около 8 микросекунд (то есть, эти десятки/сотни пикосекунд даже не процент). А для DDR последних поколений – это уже может быть критичным, ибо время одного фронта (да, именно фронта, ибо работает оно по обоим фронтам синхроимпульса) может составлять 100-200 пикосекунд, а окно допуска – порядка 10-20 пикосекунд (если фронт сигнала убежит слишком далеко от фронта синхроимпульса, то микросхема может просто не «захватить» этот сигнал), и вот тут эти десятки пикосекунд в подложке уже играют огромную роль.
Также бывает такое, что документация неполная, то есть, производитель дает только внутренние «длины» – то есть, буквально длины дорожек в подложке. Это, конечно, замечательно, но что делать-то с этим? Во-первых, без задержек на большинстве интерфейсов обойтись очень даже можно. Те же PCIe/USB требуют согласованности только внутри дифференциальной пары, между собой же пары согласовывать не нужно (да, задержка на миллиметр в подложке может отличаться, но оба интерфейса до 3 версии включительно переживают такие нюансы). А вот оперативная память – уже другое дело. На один слой точно не залезть, одинаковые участки трасс на слоях делать критически сложно, а значит выход один – что-то придумывать. И вариант есть, то самое «во-вторых».
Текстолитовая подложка обычно делается на основе высококачественных материалов и очень тонких диэлектриков. В теории – можно найти какой-нибудь дофига крутой препрег и посчитать линию на 40-50 Ом для него, взяв скорость распространения из калькулятора импеданса. В моем случае получилось порядка 5,5 пикосекунд на миллиметр. Берем файлик с длинами, добавляем колонку, перемножаем значение длины на 5,5 и получаем задержку. Да, это близко к полному бреду, но это лучше, чем полное ничто, да и альтернатив нет, если производитель попросту не озаботился нормальной документацией. А если документацию не получается достать вообще – то лучше отказаться от этого проекта, ибо шанс на успех довольно низок (не заведется оперативка из-за рандомного разбега в подложке на 10-50 пикосекунд и все, жить на пониженных частотах ОЗУ или надеяться на контроллер памяти с его training-процедурами).
3.2) Соблюдение импеданса и неоднородности на пути сигнала
Сам по себе импеданс (точнее отклонение от целевого значения) влияет скорее на затухание сигнала, чем больше отклонение – тем хуже сигналу – тем меньший путь он сможет пройти, сохраняя свою целостность. Речь, разумеется, о едином импедансе на всей трассе.
Изменения импеданса (локальные изменения ширины дорожки, искажения опорной плоскости, последовательно включенные компоненты, переходные отверстия, да даже препрег с крупным шагом сетки плетения) вызывают отражения, то есть, часть сигнала отражается в обратную сторону. Из-за этого сигнал тоже может побиться и потерять в мощности, короче – снова затухание, пусть и так говорить не принято. Бывает неизбежное изменение импеданса: выходит сигнал из кристалла, проходит часть корпуса (золотая проволочка до контакта микросхемы или подложка), выходит на посадочное место на плате, и уже потом – на дорожку. За этот путь сигнал претерпевает искажения импеданса (и отражения как следствие), насколько сильные – зависит от производителя микросхемы. И с конечной точкой сигнала то же самое, ибо входит он почти всегда в другую микросхему. Получается, под нашим контролем только участок трассы на плате, а значит следует быть с этим участком как можно аккуратнее.
Последовательные компоненты на линии, что это такое? Иногда это конденсаторы (на ВЧ дифференциальных интерфейсах их очень любят, и да, если он требуется – его убирать ни в коем случае нельзя), иногда – резисторы (обычно небольшие, 10-30 Ом, чуть-чуть приглушает сигнал, чтобы линия не так сильно орала в соседей и в окружающую среду). Дорожка обычно имеет ширину порядка 0,1 – 0,2 мм, а пятак посадочного места такого пассивного компонента – от 0,25 до 1,6 мм (от 0201 до 1206), и при прохождении этого перехода никуда не деться от искажения импеданса и отражений (можно, конечно, сделать вырез в опорной плоскости под пятаком, переместив ее на третий слой, но это крайне неудобно, стабильно работает и без этого). Максимум, что тут можно сделать – использовать пассивные компоненты как можно меньшего размера (но тогда стоимость монтажа компонентов вырастет), и воспользоваться инструментом Teardrop. Этот инструмент создает плавный переход ширины дорожки от изначальной к конечной (что бы там ни находилось, кусок дорожки с другой шириной, переходное отверстие, пятак компонента) каплевидной формы. Это позволяет менять импеданс не резкой «ступенькой», а плавным переходом, в следствие чего отражения получаются не такие «злые». И снова – это неизбежные искажения, полностью избавиться от них невозможно.
Также изменения импеданса вызывают различные моменты в топологии. Если конкретнее – взаимное расположение сигнальной дорожки и остальных дорожек/переходных отверстий/полигонов на том же слое (при условии, что на соседних слоях уже есть постоянная опорная плоскость, без этого будет полный хаос). Например, ведете вы две дорожки на небольшом расстоянии друг от друга (предположим, что расстояние между ближайшими точками линий составляет 0.2 мм). При этом возникают не только перекрестные помехи, но и изменение импеданса – ведь создается паразитная емкостная связь с чем-то еще, кроме опорной плоскости. И, что самое хреновое, появляется не только искажение импеданса, но и изменение скорости распространения сигнала, а это тоже учитывать довольно тяжело. Как правильно выбирать этот зазор? Зачастую, для единичных линий подойдет «правило»: 2*W или 2*H – терпимо, 3*W или 3*H – отлично, где W – значение ширины дорожки, H – расстояние до опорной плоскости (толщина диэлектрика).
Перейдем к конкретике, где такое возможно? Зачастую при проведении параллельных линий, использовании инструментов согласования длины/задержки.
Это дело учесть можно. Да, перекрестные помехи будут и учитывать их непросто (или я не очень умный и не знаю как). Но изменение импеданса и задержки – можно, и сейчас расскажу как. Есть у нас известно расстояние между параллельными линиями и длина параллельного участка (да, петлю «змейки» согласования тоже можно считать параллельным участком), то мы можем использовать встроенный инструмент для расчета параметров линии. Заходим в Layer Stack Manager, переключаемся на вкладку Impedance. Если у нас уже есть настроенный шаблон для наших линий – прекрасно, если нет – создаем его таким, какой он есть на плате (только ширину линии правильную задать надо). В итоге мы видим и итоговый импеданс, и задержку на единицу линии (наносекунды на метр, что абсолютно равно более понятным пикосекундам на миллиметр). После этого создаем другой профиль, не Single, а Single-Coplanar. Данные дорожки указываем те же самые, а в поле Clearance (S) записываем значение зазора относительно соседних параллельных дорожек. И снова видим значение задержки и импеданса, которые теперь можно смело сравнивать.
Вот мой конкретный случай, в одном узком месте пришлось расположить дорожки довольно близко на небольшой протяженности. Ширина дорожек 0.1 мм, зазор до соседей 0.175, протяженность участка около 2 мм. При расчете единичного импеданса значение задержки составляет 7,03 пс/мм, для «компланарной» линии – 7,04 мм. То есть, на этом участке мы приобретаем дополнительную задержку в 0,02 пс, что является погрешностью в сравнении с общим окном допуска в +/- 20 пс относительно линии синхронизации.

Но бывают и другие моменты, которые учитывать уже не так удобно. Точечные пересечения с переходными отверстиями, углами других дорожек, полигонов и прочих элементов топологии. Примерно на том же участке линия идет рядом с переходными отверстиями питания, земли и сигналов. С ними тоже образуется емкостная связь, но из-за точечного сближения на задержку это почти не влияет. А вот искажения импеданса все копятся, пусть и малые – но их может быть множество. А таких случаях стоит стараться держаться как можно дальше от всего такого, насколько это возможно. А возможно не всегда, ибо тут представлены куски зоны «fanout» BGA микросхемы, и эта зона является грязной – почти всегда. Зачастую просто невозможно сделать все правильно и красиво, и довольно неприятные компромиссы тут неизбежны. Да, при наличии перфекционизма тут бывает больно.

Перфекционизм. Он тут скорее вынужденный, чем происходящий из «чувства прекрасного». Вот представьте ситуацию: данных о задержках в BGA микросхеме у вас нет, расчет задержки и импеданса линий как бы есть, но насколько он соответствует реальности – а пес его знает, задержка в переходном отверстии рассчитана программой по неизвестным алгоритмам – вроде выглядит адекватно, но тоже неизвестна релевантность. Добавьте сюда особенности производства – ведь неизвестно сколько смолы вытечет из препрега при прессовании, а значит насколько он изменит свою толщину, насколько изменится импеданс и задержка на каждом конкретном слое. Неизвестна шероховатость меди и ее однородность – а это тоже влияет на задержку. И что тут делать? Правильно, стараться сделать топологию как можно более «красивой» и стараться согласовывать все «в ноль», потому что погрешность может вылезти откуда угодно. Увы, это тяжело не только когнитивно, но и морально – ведь ответственность за результат и свои знания перед самим собой никто не снимет.
4) Согласование дифференциальных пар
Тут все веселее. Беда в том, что соседние элементы топологии влияют на линии в паре неравномерно, так как одна линия всегда будет ближе, другая – дальше. А требование дифференциальной пары к строгой согласованности проводников внутри нее никто не отменял.
Начнем с согласованности. Прямой и инвертированный сигналы пары выходят из микросхемы в один и тот же момент времени (если нет задержек в подложке, но об этом не будем). В другую микросхему эти сигналы тоже должны прийти в один момент времени, и тут окно допуска в разы строже, чем с одиночными линиями (например, 1 пс против 20 пс соответственно). Тут есть два момента – согласованность всей линии относительно микросхемы (по-простому – сделать так, чтобы суммарная задержка обоих проводников пары была полностью одинаковой) и согласованность линии на каждом ее участке. Сначала поговорим про первое.
Согласование внутри дифференциальной пары относительно микросхем. Нужно сделать так, чтобы любые перекосы в проведенных дорожках (и подложке, если есть) были скомпенсированы до момента входа дифференциальной пары в конечную микросхему. Важно: тут, как и с одиночными линиями, важно учитывать задержки микросхем (если они есть), и источника, и цели.
Как именно использовать инструменты согласования длин/задержек. Да, тут тоже есть советы и нюансы. Возьмем абстрактную ситуацию – соседних элементов топологии нет, места достаточно. Для согласования длин и задержек линий можно сделать одну-две больших змейки, а можно сделать много маленьких, или вообще использовать пилозуб (sawtooth). Может показаться, что второй вариант лучше – ведь так зазор внутри пары нарушается слабее, а значит ей будет лучше. Нет, не так, потому что одна змейка, пусть и большая – это два отражения (ее начало и конец, искажение импеданса сначала вверх, потом вниз), а много маленьких – соответственно, много меньших отражений. А из-за того, что змейки эти имеют одинаковый период, высоту (особенности работы инструмента) – создается периодическая система искажений, что может привести к наложению дополнительных гармоник на сигнал (что нам вот никак не нужно). Поэтому всегда лучше сделать 1-2 горба побольше и не ломать сигнал.
Согласование участков дифференциальной пары. А вот с согласованностью на протяжении всей дифференциальной пары интереснее. Помним – одна из линий передает прямой сигнал, вторая – инвертированный, являющийся частью опоры. Логично, что они должны быть зеркальными – их фронты и «плато» должны совпадать по времени, и так должно быть на протяжении всей пары на плате. Но при изгибах возникает перекос длины (и задержки, как следствие). Ведете линию, надо повернуть на 45 или 90 градусов (то есть, два изгиба под 45, под 90 сразу гнуть не стоит), и в месте изгиба один проводник становится длиннее другого (к слову, если рядом будет поворот в другую сторону, компенсирующий это искажение – дополнительно что-то делать не надо, рядом – порядка 10-15 мм). Получается так, что сигналы после этого изгиба распространяются уже не идеально синхронно, а с некоторым смещением, из-за чего сигналу становится хуже (часть возвратного пути нарушается). Поэтому у каждого локального искажения (до или после, главное – как можно ближе) строго рекомендуется исправлять эту несогласованность. С задержками в корпусах микросхем та же история, как только появляется место – согласуем в ноль (потому что сразу при выводе все линии находятся очень близко друг к другу, и, если кинуться исправлять «с нулевой» – можно нахватать перекрестных помех, получить дополнительное искажение задержки и импеданса).
Переходные отрезки. Перед любым переходным отрезком дифференциальной пары тоже рекомендуется производить согласование. Переходом я тут называю переходные отверстия и подключение к последовательным компонентам. Эти участки и так довольно негативно влияют на сигнал (сильное искажение импеданса), поэтому дополнительная рассогласованность усугубит этот эффект, ведь опорный сигнал будет сдвинута от реального по фазе. Правда, в зоне «фанаута» BGA микросхем получится так сделать далеко не всегда (а где согласовывать разность задержек корпуса микросхемы, если переходные отверстия-то едва влезают), но такие места бывают, от них никуда не деться. «Грязь» в зоне фанаута – увы, норма, хоть и стоит стараться ее минимизировать.
Согласование дифференциальных пар между собой. Есть дифференциальные интерфейсы, требующие согласованности пар внутри него (как пример – HDMI, 3 дата-пары и одна CLK). Для этого можно использовать инструмент Interactive Diff Pair Length Tuning, он изменяет длину/задержку сразу обоих проводников внутри пары.
Отличие скорости дифференциальной пары. Бывает такое, что в шине есть как дифференциальные пары, так и одиночные линии (та же DDR). И тут можно допустить одну небольшую ошибку – подумать, что скорость распространения одиночки и диффпары одинаковая. Ан-нет, отличается. Лучше это всегда проверять в том же калькуляторе импеданса Altium и смотреть на эту разницу в погонной задержке исходя из предполагаемой длины трассы – где-то это может быть 0,2 пикосекунды (что вообще погрешность), а в другом случае это даст все 20-30.
Если появились вопросы/предложения, обнаружились ошибки — буду рад получить обратную связь.
ссылка на оригинал статьи https://habr.com/ru/articles/1024798/