Временные ограничения для внешних интерфейсов ПЛИС

Здравствуйте. В данной статье я хочу по возможности максимально просто и понятно рассказать о том, как рассчитываются временны́е ограничения (timing constraints) на синхронные интерфейсы ПЛИС. Просто — не значит коротко, но зато простыми словами, которые вы сможете легко понять. Если вы новичок и перед вами стоит задача описать свой первый SPI, то данная статья должна вам помочь понять для чего нужны ограничения и как их рассчитать.

Введение


Временны́е ограничения — это некоторая информация, пользуясь которой утилита временно́го анализа в составе САПР может посчитать успешно ли пройдут данные через все регистры проекта. Эти ограничения пользователь должен сам рассчитать и записать в файле временны́х ограничений. Без этих ограничений пользователь пишет проект наугад, не проверяя его работоспособность, а компилятор будет ругаться, что не нашел ограничений.

В предыдущей статье (ссылка) я рассказал о том, что из себя представляет передача данных между двумя регистрами и как рассчитывается выполнение временны́х соотношений в случае передачи данных внутри ПЛИС, когда оба рассматриваемых регистра, пути прохождения тактовых сигналов и сигналов данных лежат внутри ПЛИС. Из той статьи нужно вынести понимание концепции синхронной логики как сети, сплетенной из множества межрегистровых передач (рис. 1), и термина «слэк» (рис. 2).

В этой статье мы рассмотрим случаи передачи данных, в которых один из двух регистров передачи находится вне ПЛИС — это регистр внешнего устройства — микроконтроллера, АЦП и т.п.

ysb0l8pui3e-urvpvgfqzgsho8m.png
Рис. 1. Схема межрегистровой передачи данных от регистра-источника (source) к регистру-получателю (destination).

fbeo8xpjrmep5abpz_k_uaxac9k.png
Рис. 2. Смысл слэков относительно фронта захвата на входе регистра-получателя.

Общие формулы расчета слэков, выведенные в предыдущей статье:

$\min SetupSlack = \min DataRequired - \max DataArrival = $

$=T-CSU+\min t_{CLKtoDST}-\max t_{CLKtoSRC}-\max t_{SU}-\max t_{CO}-\max t_D$

$\min Hold Slack = \min DataArrival - \max DataRequired =$

$=-CHU+\min t_{CLKtoSRC}-\max t_{CLKtoDST}+\min t_{CO}-\max t_H+\min t_D$


Пробежимся по терминам.

Слэк (slack) — это запас по времени. Он должен быть положительным.

Время предустановки (setup time, $t_{SU}$) — минимальное время, которое данные должны уже находиться на входе регистра-получателя на момент прихода фронта клока на тактовый вход получателя.

Время удержания (hold time, $t_H$) — минимальное время, которое данные должны всё ещё держаться на входе получателя после момента прихода фронта клока на тактовый вход получателя.

Время срабатывания регистра (clock-to-output time, $t_{CO}$) — время от прихода фронта клока на тактовый вход регистра-источника до появления на его выходе новых стабильных данных.

Нестабильность тактовой частоты по предустановке/удержанию (CSU/CHU) — мера нестабильности тактового сигнала. В расчетах несет смысл запаса «на всякий случай» для учтения явлений, вызванных неидеальной периодичностью клока.

$t_D$ — это время прохождения сигналом данных пути между регистрами.
$t_{CLKtoSRC}$ — это время, за которое фронт тактового сигнала доходит от источника тактового сигнала до тактового входа регистра-источника. А от источника тактового сигнала до регистра-получателя — соответственно $t_{CLKtoDST}$.

Пути прохождения сигналов проиллюстрированы на рисунке 3.

yf9azs7-fwbxtsgkaprc_apwp5c.png
Рис. 3. Обозначение времени прохождения путей тактовых сигналов и данных.

На этом рисунке мы видим две точки — зеленую и красную. Обе из них являются точками, в которых пути клока источника и клока получателя еще не разошлись. Зеленая точка — это выход глобального тактового буфера, точка входа в глобальную тактовую сеть ПЛИС, относительно которой тактовые входы всех регистров приблизительно равноудалены. Красная точка — некая произвольная точка в глобальной тактовой сети, в которой, как и на входе сети, клок ещё не разделился на две свои копии, ушедшие на разные регистры. Но только зеленая точка является подходящей точкой для начала отсчета времён прохождения клоков, потому что находится в одном из понятных компилятору мест. В данном примере — на входе глобальной тактовой сети. Но в случае простых интерфейсов, тактирующихся снаружи, зеленой точкой может быть и просто ножка ПЛИС. Компилятор знает тайминги от этой точки до каждого из регистров. А красная точка, место случайного совпадения путей двух анализируемых клоков, не подходит для начала отсчета.

Виды анализируемых передач


Давайте проведем классификацию случаев для временного анализа. Анализ проводится отдельно для каждой ножки ПЛИС относительно некоторого клока. В результате анализа оценивается возможность ножки корректно отдать или принять данные. Внешний интерфейс синхронного обмена данными ПЛИС с внешним устройством представляет собой несколько линий, подведенных к ножкам. Из них одна линия — это линия клока. Он должен быть общим для регистров на обеих сторонах. Остальные линии, одна или множество, это однонаправленные линии ввода или вывода. То, что для ПЛИС является линией ввода, для внешнего устройства является линией вывода, и наоборот. В данной статье мы рассматриваем только простейшие случаи временного анализа, поэтому не касаемся асинхронных и самосинхронных интерфейсов, а также использования двунаправленных линий ввода-вывода.

Случаи анализа можно классифицировать по направлению данных относительно ПЛИС (Input/Output) и по направлению клока относительно ПЛИС (System/Source Synchronous). Для каждого случая есть два типа анализа (Setup/Hold). Итого, четыре случая для анализа и восемь уравнений, которые нам надо вывести.

Sytem Synchronous Output / Вывод данных, тактированных внутренним клоком ПЛИС


Рассмотрим случай, когда нам нужно отдать что-то наружу на своем клоке (рис. 4).
Принципиально схема передачи данных не изменилась. Вот только регистры теперь принадлежат двум разным микросхемам, а на пути данных между ними не комбинационная логика, а просто дорожки на плате. И наша задача состоит в том, чтобы адаптировать известные нам формулы слэков к немного иной ситуации.

hqhytmfvqmofbrl6e4gsrrobate.png
Рис. 4. Передача данных наружу по собственному клоку ПЛИС.

На рисунке 4 мы видим схему межрегистровой передачи. На ней показаны времена процессов, относящиеся к каждому из регистров, и времена, за которые сигналы проходят пути.

Я задал следующую индексацию: время, относящееся к данным, помечено буквой D. Время, относящееся к клоку, помечено буквой C. Если событие происходит внутри ПЛИС, то его время помечено индексом «int», а если во внешнем устройстве, то «ext». Время на путь клока от источника клока до выходной клоковой ножки имеет самый длинный индекс «Cintout». DataTrace и ClkTrace — это времена на проход соответствующих дорожек на печатной плате. Блок «CLK» символизирует собой некий внутренний источник клока.

Главная черта упомянутых на рисунке величин — все они положительные. Все они равны абсолютной длительности каких-либо физических процессов, а значит физически могут быть только положительными величинами. Это важно для дальнейших рассуждений.

Теперь мы максимально подробно рассмотрим анализ слэка предустановки. Глядя на рисунок 4 мы легко соотносим увиденные величины со слагаемыми формул слэков:

$t_{CLKtoSRC} = t_{Cint}$

$t_D = t_{Dint}+DataTrace+t_{Dext}$

$t_{CLKtoDST}=t_{Cintout}+ClkTrace+t_{Cext}$

Теперь подставим эти равенства в формулу слэка предустановки:

$\min SetupSlack = \min DataRequired - \max DataArrival = $

$=T-CSU+\min t_{CLKtoDST}-\max t_{CLKtoSRC}-\max t_{SU}-\max t_{CO}-\max t_D=$

$=T-CSU+\min (t_{Cintout}+ClkTrace+t_{Cext})-\max (t_{Cint})-t_{SU}-t_{CO}-$

$-\max (t_{Dint}+DataTrace+t_{Dext})$


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

$\min SetupSlack = T-CSU+\min t_{Cintout}+\min ClkTrace+\min t_{Cext} -\max t_{Cint}-$

$ -t_{SU}-t_{CO}-\max t_{Dint}-\max DataTrace-\max t_{Dext} $


Теперь переставим слагаемые местами так, чтобы сгруппировать в скобках слагаемые процессов внутри ПЛИС и процессов внутри внешнего устройства:

$\min SetupSlack = T-CSU-(\max t_{Cint}+t_{CO}+\max t_{Dint}-\min t_{Cintout})+$

$ +\min ClkTrace-\max DataTrace-(\max t_{Dext}+t_{SU}-\min t_{Cext}) $


Что же мы видим в скобках? Если присмотреться и еще раз вспомнить про то, что все указанные величины больше нуля, то можно сказать, что мы видим выражение некого эквивалентного (со звездочкой) времени срабатывания регистра ПЛИС и эквивалентного времени предустановки регистра внешнего устройства:

$\max t_{Cint}+t_{CO}+\max t_{Dint}-\min t_{Cintout}=\max t_{CO}^*$

$\max t_{Dext}+t_{SU}-\min t_{Cext}=\max t_{SU}^*$

$\min SetupSlack = T-CSU-\max t_{CO}^*+\min ClkTrace-\max DataTrace-\max t_{SU}^* $


Почему бы нам не пользоваться эквивалентными величинами, если производители микросхем уже посчитали их за нас с учетом своих внутренних задержек? Эквивалентные значения на стороне ПЛИС рассчитает компилятор без участия пользователя, а эквивалентные значения внешнего устройства указываются в явном виде в даташите на устройство.
Теперь вглядимся внимательно еще раз в последнее выражение. В нем первые три слагаемых уже известны анализатору, ведь мы уже указали ему рабочую частоту и величину нестабильности. Компилятор произвел трассировку и анализатор знает эквивалентное время срабатывания своего регистра. Значит анализатору известна длительность всех процессов внутри ПЛИС. А вот последние три слагаемых уникальны для каждой ножки и пользователю необходимо самому их посчитать и указать анализатору в виде числа. Что же это за число? Рассмотрев внимательнее три последних слагаемых мы увидим, что их можно интерпретировать как отрицательный максимум некой величины:

$\min ClkTrace-\max DataTrace-\max t_{SU}^*=-\max OutputDelay $


И эта величина по смыслу равна задержке всего, что происходит снаружи ПЛИС, относительно всего, что происходит внутри. Ее так и называют — выходная задержка, Output Delay.
Подытожим:

$\min SetupSlack = T-CSU-\max t_{CO}^*-\max OutputDelay $

$ \max OutputDelay = \max DataTrace+\max t_{SU}^*-\min ClkTrace = $

$=\max (DataTrace+t_{SU}^*-ClkTrace )$


Теперь выведем аналогичное уравнение для слэка удержания. Вспомним общее уравнение и подставим в него новые слагаемые:

$\min Hold Slack = \min DataArrival - \max DataRequired =$

$=-CHU+\min t_{CLKtoSRC}-\max t_{CLKtoDST}+\min t_{CO}-\max t_H+\min t_D = $

$=-CHU+\min (t_{Cint})-\max (t_{Cintout}+ClkTrace+t_{Cext}) +t_{CO}- t_H+$

$+\min (t_{Dint}+DataTrace+t_{Dext}) $

Раскроем скобки и сразу же сгруппируем слагаемые вокруг каждого из регистров:

$\min Hold Slack =-CHU+(t_{CO}+\min t_{Cint}+\min t_{Dint}-\max t_{Cintout})-$

$ -\max ClkTrace +\min DataTrace-(t_H-\min t_{Dext}+\max t_{Cext}) $

И снова мы видим как слагаемые группируются в эквивалентные величины, на сей раз $t_{CO}$ и $t_H$:

$\min Hold Slack =-CHU+\min t_{CO}^* +\min DataTrace -\max ClkTrace -\max t_H^* $

И последние три слагаемых можно понимать как минимальную внешнюю задержку:

$\min DataTrace -\max ClkTrace -\max t_H^* = \min OutputDelay$


Подытожим:

$\min Hold Slack =-CHU+\min t_{CO}^* +\min OutputDelay $

$\min OutputDelay = \min (DataTrace -ClkTrace - t_H^*) $


Надо подчеркнуть, что $\min OutputDelay $ и $\max OutputDelay $ — это минимум и максимум не абсолютно одной и той же величины. В каждом анализе по предустановке и анализе по удержанию рассматриваются разные ситуации и разные внешние задержки. А значит и слагаемые, как видно из формул, берутся разные.

Source Synchronous Output / Вывод данных, тактированных внешним клоком


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

8tpz7u9dju4jfels5ga86p_3akg.png
Рис. 5. Передача данных наружу по внешнему клоку.

На рисунке 5 мы видим источник клока снаружи. Соответственно исчезла величина $t_{Cintout}$ и появилось время прохода клока до внешнего устройства «Clk Trace Ext».

Глядя на рисунок 5 соотнесём увиденные величины со слагаемыми общих формул слэков:

$t_{CLKtoSRC} = ClkTrace+ t_{Cint}$

$t_D = t_{Dint}+DataTrace+t_{Dext}$

$t_{CLKtoDST}=ClkTraceExt+t_{Cext}$


С помощью этих выражений раскроем слагаемые в формуле слэка предустановки, сразу сгруппируем их по регистрам и получим эквивалентный вид:

$\min SetupSlack = \min DataRequired - \max DataArrival = $

$=T-CSU+\min t_{CLKtoDST}-\max t_{CLKtoSRC}-\max t_{SU}-\max t_{CO}-\max t_D=$

$=T-CSU-(\max t_{Cint} +t_{CO} +\max t_{Dint})-\max DataTrace - $

$ -(\max t_{Dext}+t_{SU}-\min t_{Cext}) -\max ClkTrace+\min ClkTraceExt =$

$ = T-CSU-\max t_{CO}^*-\max (t_{SU}^*+DataTrace+ClkTrace-ClkTraceExt)$

$\min SetupSlack = T-CSU-\max t_{CO}^*-\max OutputDelay $

$ \max OutputDelay = \max (t_{SU}^*+DataTrace+ClkTrace-ClkTraceExt)$


Аналогично разбираем слэк удержания:

$\min Hold Slack = \min DataArrival - \max DataRequired =$

$=-CHU+\min t_{CLKtoSRC}-\max t_{CLKtoDST}+\min t_{CO}-\max t_H+\min t_D = $

$=-CHU+(\min t_{Cint}+t_{CO}+\min t_{Dint})+\min DataTrace+\min ClkTrace -$

$-(t_H-\min t_{Dext}+\max t_{Cext}) - \max ClkTraceExt$

$\min Hold Slack = -CHU+\min t_{CO}^* + \min OutputDelay$

$ \min OutputDelay= \min (DataTrace+ClkTrace-ClkTraceExt-t_H^*) $


Если в этой схеме рассмотреть частный (но частый) случай, когда источник клока находится внутри внешнего устройства, то выведенные формулы изменятся только лишь тем, что ClkTraceExt станет в них равным нулю. Перемещение источника клока вовнутрь внешнего устройства вызовет в наших расчетах микроскопическое растекание клока внутри внешнего устройства между тактовым выходом и регистром, но оно будет учтено производителем внешнего устройства и войдет в величины эквивалентных $t_{SU}^*$ и $t_H^*$.

System Synchronous Input / Ввод данных, тактированных внутренним клоком ПЛИС


Теперь переходим к рассмотрению входных ног синхронного интерфейса. ПЛИС и внешнее устройство на рисунке 6 поменялись местами.

dpjc8bz4kx9eg1shcsqqadp2afu.png
Рис. 6. Прием данных по собственному клоку ПЛИС.

Анализ такой схемы ничуть не сложнее предыдущих.

$t_{CLKtoSRC} = t_{Cintout} +ClkTrace +t_{Cext}$

$t_D = t_{Dext}+DataTrace+t_{Dint}$

$t_{CLKtoDST}=t_{Cint}$

Раскрываем, группируем…

$\min SetupSlack = \min DataRequired - \max DataArrival = $

$=T-CSU+\min t_{CLKtoDST}-\max t_{CLKtoSRC}-\max t_{SU}-\max t_{CO}-\max t_D=$

$=T-CSU-(t_{SU}+\max t_{Dint}-\min t_{Cint} +\max t_{Cintout}) -\max DataTrace - $

$ -(t_{CO}+\max t_{Dext} +\max t_{Cext} )- \max ClkTrace $

И получаем величину внешней задержки, которую на этот раз уже мы назовем входной:

$\min SetupSlack = T-CSU-\max t_{SU}^* -\max InputDelay$

$\max InputDelay = \max (DataTrace + t_{CO}^* +ClkTrace)$


Теперь слэк удержания:

$\min Hold Slack = \min DataArrival - \max DataRequired =$

$=-CHU+\min t_{CLKtoSRC}-\max t_{CLKtoDST}+\min t_{CO}-\max t_H+\min t_D = $

$=-CHU-(t_H-\min t_{Dint} + \max t_{Cint} - \min t_{Cintout})+\min DataTrace + $

$ + (t_{CO}+ \min t_{Dext} + \min t_{Cext}) +\min ClkTrace $

$\min Hold Slack = -CHU-\max t_H^*+\min InputDelay$

$ \min InputDelay= \min (t_{CO}^*+DataTrace+ClkTrace) $

Source Synchronous Input / Ввод данных, тактированных внешним клоком


Также, по накатанной, смотрим на схему передачи данных и раскрываем слагаемые общей формулы.

xamhy94-vz6m755fizbuxv52rk4.png
Рис. 7. Прием данных по внешнему клоку.

$t_{CLKtoSRC} = ClkTraceExt +t_{Cext}$

$t_D = t_{Dext}+DataTrace+t_{Dint}$

$t_{CLKtoDST}=ClkTrace+t_{Cint}$


Формула слэка предустановки:

$\min SetupSlack = \min DataRequired - \max DataArrival = $

$=T-CSU+\min t_{CLKtoDST}-\max t_{CLKtoSRC}-\max t_{SU}-\max t_{CO}-\max t_D=$

$=T-CSU-(t_{SU}+\max t_{Dint}-\min t_{Cint})-\max DataTrace - $

$ -(t_{CO}+\max t_{Dext}+\max t_{Cext}) -\max ClkTraceExt+\min ClkTrace=$

$ = T-CSU-\max t_{SU}^*-\max (t_{CO}^*+DataTrace+ClkTraceExt-ClkTrace)$

$\min SetupSlack = T-CSU-\max t_{SU}^*-\max InputDelay $

$ \max InputDelay = \max (t_{CO}^*+DataTrace+ClkTraceExt-ClkTrace)$


Формула слэка удержания:

$\min Hold Slack = \min DataArrival - \max DataRequired =$

$=-CHU+\min t_{CLKtoSRC}-\max t_{CLKtoDST}+\min t_{CO}-\max t_H+\min t_D = $

$=-CHU-(t_H-\min t_{Dint}+\max t_{Cint})+\min DataTrace+$

$+(t_{CO}+\min t_{Dext}+\min t_{Cext})+\min ClkTraceExt - \max ClkTrace$

$\min Hold Slack = -CHU-\max t_H^* + \min InputDelay$

$ \min InputDelay= \min (t_{CO}^*+DataTrace+ClkTraceExt-ClkTrace) $


Опять же, если источник клока находится внутри внешнего устройства — то просто приравниваем ClkTraceExt нулю.

Как пользоваться полученными формулами


Мы получили формулы внешних задержек и можем рассчитать конкретные числа задержек, чтобы вписать их в файл временных ограничений. Эти формулы глобально состоят из двух видов слагаемых — это временные характеристики портов внешнего устройства и задержка на дорожках платы.

Характеристики портов обычно находятся в даташитах в разделах под названиями вроде «Electrical Characteristics / AC Specifications / Timing Requirements». Порой эти характеристики названы другими именами и придется проявить смекалку, чтобы найти их. Но таблицы с числами как правило сопровождаются временными диаграммами, которые позволят вам идентифицировать нужный параметр.

С дорожками несколько сложнее. Точный расчет задержки на плате — вопрос нетривиальный. Задержка зависит от длины, ширины, толщины и углов поворота дорожки, от толщины и материала платы, от расстояния до разных земляных слоев, от близости дорожек друг к другу и от множества иных факторов. Впрочем влияние каждого из этих факторов довольно невелико и на низких частотах интерфейсов, до десятков мегагерц, этими сложностями можно пренебречь. Упрощенный расчет задержки на дорожке выглядит так: скорость распространения волны в фольге считается равной половине скорости света в вакууме. В пересчете это дает примерно 0.007 нс/мм. Погрешность такой оценки нивелируется широким диапазоном оценки задержки. Для максимальной задержки считаем удельную задержку равной 0.010 нс/мм, а для минимальной — 0.005 нс/мм.

Есть еще один нюанс. Схемотехники, проектируя печатные платы, стараются протягивать дорожки синхронных интерфейсов примерно одинаковым путем и соблюсти их равные длины. Проверьте длины дорожек данных и клока на своей целевой плате. Скорее всего они почти равны и компонент выражений (DataTrace — ClkTrace) на практике можно считать нулевым.
Если на пути данных или клока стоит элемент вносящий задержку — ее тоже нужно учесть. Это может быть буфер, инвертор, преобразователь уровня или гальваноразвязка. Такие элементы способны вносить очень большую задержку, десятки наносекунд, поэтому к ним нужно отнестись очень внимательно.

Заключение


В данной статье вы увидели формулы, по которым определяется выполнение временных ограничений в синхронных интерфейсах. Зная эти формулы можно понимать от чего зависит успешная передача данных и как рассчитать верные ограничения для анализатора. В следующей статье я приведу пример оформления файла временных ограничений и использования анализатора.

© Habrahabr.ru