Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: выполнение таймингов, идеология расчетов ,xilinx, vivado
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
serg_k1
здравствуйте,
использую vivado 2015.4, artix xc7a200tfbg676-2. Нужно получить выходные сигалы под частоту 400МГц , данные DDR c setup>0.1n и hold >0.3n. Столкнулся с невыполнением таймингов.
Начал разбираться как подсчитывается время прохождения сигналов.
Пусть будет hold.
Для данных считается максимально быстрое прохождение сигналов, для частоты максимально медленное. Но rise один и тот же.
Для данных - посчитали Source Clock Path - состоит из 5 составляющих. сюда прибавили Data Path - еще 3 составляющие.
Для частоты - считают Destination Clock Patch - пусть состоит из 7 составляющих.
При этом Source Clock Path и Destination Clock Patch первые 3 составляющие пути одни и те же. Но считаются для Source Clock Path по максимально быстрому , а для Destination Clock Patch по максимально медленному. Собственно именно здесь и получается большая часть ошибки тайминга. Но ведь это один и тот же фронт в одно и то же время. И не может быть разного прохождения именно этих 3-х участков.
bogaev_roman
Цитата(serg_k1 @ Nov 30 2016, 11:47) *
При этом Source Clock Path и Destination Clock Patch первые 3 составляющие пути одни и те же. Но считаются для Source Clock Path по максимально быстрому , а для Destination Clock Patch по максимально медленному. Собственно именно здесь и получается большая часть ошибки тайминга. Но ведь это один и тот же фронт в одно и то же время. И не может быть разного прохождения именно этих 3-х участков.

Все правильно он считает. Почитайте документацию от производителя по ключевым словам timing corners. Если коротко и своими словами, то для анализа setup|hold у vivado есть две временные модели - fast|slow, и в зависимости от технологического разброса/температуры и напряжения пути будут иметь разную задержку - для сетапа и холда рассчитываются они по разному. Таким образом производитель гарантирует работоспособность всех чипов в заданном температурном диапазоне и просадках по питанию. Т.е. Ваше утверждение
Цитата
Но ведь это один и тот же фронт в одно и то же время. И не может быть разного прохождения именно этих 3-х участков
ошибочно, т.к. допустим при минус 40 градусах время распространения сигнала будет существенно отличаться от него же при плюс 100.
serg_k1
Цитата(bogaev_roman @ Nov 30 2016, 13:57) *
... в зависимости от технологического разброса/температуры и напряжения пути будут иметь разную задержку - для сетапа и холда рассчитываются они по разному. Таким образом производитель гарантирует работоспособность всех чипов в заданном температурном диапазоне и просадках по питанию. ... т.к. допустим при минус 40 градусах время распространения сигнала будет существенно отличаться от него же при плюс 100.

я с этим и не спорю.
но есть вопросы.
с setup вопросов нет. там действительно 2 разных фронта ( и об этом говорит добавка 1.250нс при расчете времени пути). и это определяет то, что мы считаем макс. время для данных и мин. время для частоты на протяжении всего пути.
с hold же все не так. там один и тот же фронт ( то , что это один фронт - отсутствует добавка 1.250нс в расчетах и показано на нижнем рисунке) формируется на 1-3 частях пути, далее он разделяется и идет на данные по одному пути , а на вых.частоту по другому. так вот, мне кажется , что часть пути 1-3 не внесет изменений в подсчет времени hold при "температурном диапазоне и просадках по питанию" именно потому, что это физически один и тот же фронт. т.е. если что-то не так , то это "не так" одинаково скажется на данных и частоте. А дальше остальной путь, конечно, нужно считать по разному.



des333
У Altera в TimeQuest есть вот такой параметр

Посмотрите что-то похожее у Xilinx.
Может быть, что этот параметр у Вас выключен.
bogaev_roman
Цитата(serg_k1 @ Nov 30 2016, 16:27) *
т.е. если что-то не так , то это "не так" одинаково скажется на данных и частоте. А дальше остальной путь, конечно, нужно считать по разному.

Честно говоря, картинки для меня нечитабельны. Вы бы привели полностью пути по расчету сетапа и холда для конкретного пути и сказали, какое место с Вашей точки зрения не корректно рассчитывается. А так на самом деле уточню пару моментов:
- hold - это время в течение которого данные необходимо удерживать после фронта тактовой частоты,
- тактируемая частота обычно в кристалле идет по клоковой дорожке, задержки на которой отличаются от обычной дорожки, по которой идут данные, соответственно утверждение о том что при повышении температуры задержка на пути данных и пути частоты увеличатся на одинаковую величину ошибочно,
- Вы забыли про третий параметр временного анализа - технологический разброс, при котором на разных партиях кристалла один и тот же физический путь в пределах одной температуры имеет не фиксированную величину и при расчетах в одном случае берет максимальную величину, а другом минимальную (для меня, например, в первый раз было неожиданностью увидеть разное значение задержки от пина до входного буфера).
PS посмотрите документ в поиске clock setup and hold slack analysis explained, может найдете для себя что-то новое.
serg_k1
Цитата(des333 @ Nov 30 2016, 17:47) *
У Altera в TimeQuest есть вот такой параметр

Посмотрите что-то похожее у Xilinx.
Может быть, что этот параметр у Вас выключен.

да, такой пораметр clock pessimism считается. и он как раз равен той величине , которая набегает при достижении точки раздвоения . но вот он почему-то усугубляет ситуацию. т.е. эта величина добавляется к Destination Clock Patch и увеличивает Required Time. и соответственно уменьшает hold.

Цитата(bogaev_roman @ Nov 30 2016, 18:00) *
- тактируемая частота обычно в кристалле идет по клоковой дорожке, задержки на которой отличаются от обычной дорожки, по которой идут данные, соответственно утверждение о том что при повышении температуры задержка на пути данных и пути частоты увеличатся на одинаковую величину ошибочно,

общая часть - это одна и та же клоковая дорожка
Цитата(bogaev_roman @ Nov 30 2016, 18:00) *
Вы бы привели полностью пути по расчету сетапа и холда для конкретного пути и сказали, какое место с Вашей точки зрения не корректно рассчитывается. А так на самом деле уточню пару моментов:








сейчас, как я выяснил ранее, почти все считается правильно. но вот параметр clock pessimism усугубляет ситуацию, а должен улучшать. т.е. приближать две рассчетные величины друг к другу
serg_k1
тут мне непонятно следующее. параметр clock pessimism на самом деле уравнивает время в точке раздвоения. мне непонятны знаки времени до этой точки. при этом если Destination Clock Patch считается по макс. времени , а Source Clock Path по миним. времени , то в этой точке цифры должны быть наоборот т.е. Destination Clock Patch больше и тогда clock pessimism должен бы вычитаться. но счет идет не так. но в любом случае с учетом clock pessimism время уравнено.
и это подтверждается тем, что иногда все считается правильно по времени. но все равно со знакамиотрицательными Destination Clock Patch и Source Clock Path до точки раздвоения мне непонятно.
здесь тот же проект, но без bufh. и все идеологически правильно с моей точки зрения. только отрицательные времена в начале. но к сожалению hold отрицательный.
эти разные подсчеты (подходы, результаты) мне непонятны.





Shivers
Цитата(serg_k1 @ Dec 1 2016, 09:39) *
тут мне непонятно следующее. параметр clock pessimism на самом деле уравнивает время в точке раздвоения.

CPPR - Common Path Pessimism Removal занимается тем, что выравнивает задержки клока вплоть до последней общей точки. Начиная с этой вилки клоки до StartPoint и EndPoint идут по разному.

Цитата(serg_k1 @ Dec 1 2016, 09:39) *
мне непонятны знаки времени до этой точки.

Отрицательное время - это значит, что клок пришел раньше; к примеру, фаза могла быть сдвинута PLL.

Цитата(serg_k1 @ Dec 1 2016, 09:39) *
при этом если Destination Clock Patch считается по макс. времени , а Source Clock Path по миним. времени

Так и считается нарушение Hold: наихудший случай, это когда источник сработал очень рано, а клок приемника пришел очень поздно. Почитайте эту статью на хабре про сетап и холд https://habrahabr.ru/post/302806/

Цитата(serg_k1 @ Dec 1 2016, 09:39) *
clock pessimism должен бы вычитаться. но счет идет не так. но в любом случае с учетом clock pessimism время уравнено.

clock pessimism в данном случае определяется исключительно результатами работы фиттера; поскольку дерево клока в ПЛИС не одинаково, то фиттер может расставить триггер-источник и триггер-приемник как с положительным clock pessimism, так и с отрицательным, причем значение clock pessimism тул очень точно рассчитывает, здесь нет каких прикидок и погрешностей - как тул написал, такой точно clock pessimism и будет в конкретно данной разводке. В Вашем случае clock pessimism получился отрицательным, почему - не знаю, надо у фиттера спросить.
serg_k1
Цитата(Shivers @ Dec 1 2016, 14:17) *
В Вашем случае clock pessimism получился отрицательным, почему - не знаю, надо у фиттера спросить.

Спасибо,вроде бы все понятно, кроме того, что оставил. Но ведь нужно попробовать справиться с отрицательным hold. И я решил подвигать частоту, идущую на данные. Частоту Destination Clock я уже двигал- ничего не получилось. Проверил 3 проекта - 1. С одной и той же частотой т.е. исходный 2. проходящей через bufg b 3. проходящей через 2 bufg.
Получилось следующее. Начальный одинаковый путь частоты считается по разному. для 1-го одно, для 2-го другое. При этом один путь не удалось получить какие бы изменения я не делал. Значит это не совсем случайно. 1-й и 2-й вроде бы как должно приблизить значения. Для setup есть запас и вроде бы он немного съелся. а для hold минус тоже должен уменьшиться, но он вырос. И только в 3-м проекте уменьшился. Но там уже setup не выполняется. Вот таблица.




еще меня смущает разное время у Destination Clock в компонентах ODDR (0.418 0.204 ), OBUFDS (1.484 0.842). Да и у других это просматривается. OBUFDS ( 1.366 0.726).
bogaev_roman
Цитата(serg_k1 @ Dec 1 2016, 17:31) *
Для setup есть запас и вроде бы он немного съелся. а для hold минус тоже должен уменьшиться, но он вырос. И только в 3-м проекте уменьшился. Но там уже setup не выполняется. Вот таблица.

setup и hold взаимосвязаны, если у Вас будет увеличиваться запас по setup, то будет уменьшаться запас по hold - это нормально. Теперь вопрос - что на максимальное быстродействие для DDR написано в даташите для конкретного чипа?
Думаю, что Вы пытаетесь работать на граничных условиях. Период 400МГц -> 2.5ns, в режиме DDR размер рабочего окна в идеальном случае соответствует 1.25ns из которых Вашими ограничениями съедается еще 0,4ns.
Кстати, распиновка у Вас фиксированная? Смотрю путь тактовой частоты - начало в координате x0y1 (это для клок контрола), а конец x0_y174, для данных x0_y192. Попробуйте вообще отвязать от пинов или подвинуть их ближе друг к другу и к переходу на клоковое дерево. Можно еще попробовать частоту пускать на прямую - без перехода на клоковый буфер.
serg_k1
Цитата(bogaev_roman @ Dec 2 2016, 12:16) *
setup и hold взаимосвязаны, если у Вас будет увеличиваться запас по setup, то будет уменьшаться запас по hold - это нормально. Теперь вопрос - что на максимальное быстродействие для DDR написано в даташите для конкретного чипа?

но когда я ставлю 1 bufg ( 1-й ---> 2-й) , то setup - запас уменьшается 0.867 ->0.656 , а hold запас тоже уменьшается -0.455 -> -0.709


чип xc7a200tfbg676-2, пока ставлю Artix-7 AC701 Evaluation Platform (xc7a200tfbg676-2)
DS181 ,стр.14


Shivers
Цитата(serg_k1 @ Dec 1 2016, 17:31) *
..И я решил подвигать частоту, идущую на данные. ...

Частоту двигать не стоит, поскольку дерево в ПЛИС фиксированное, и это может затруднить работу фиттера. Лучше буферы в данные добавлять.
Фокус вот в чем. Предположим, есть эндпоинт - приемный триггер. До его входа есть критический путь setup (самый медленный), и есть критический путь hold (самый быстрый). Эти два пути не совпадают, разумеется. Далее, если буфер поставить просто на входе триггера, то выправите Setup но угробите Hold.
Поэтому надо быть хитрее: найти общий элемент в обоих путях (критические сетап и холд), у которого через один вход проходит критический путь setup, а через другой - критический путь Hold. Понимаете фокус? Тогда буфер можно поставить на холдовый вход этого элемента: так и сетап не загубите, и холд вытащите. Вот только это техника из ASIC-ко строения, я не уверен что можно в ПЛИС таким тюнингом заниматься. Если получится, напишите, любопытно.
p.s. И еще раз отошлю к своей статье на хабре https://habrahabr.ru/post/302806/ Там очень подробно опино о природе нарушений сетап и холд, и о том, как с нарушениями бороться.
serg_k1
Цитата(bogaev_roman @ Dec 2 2016, 12:16) *
Кстати, распиновка у Вас фиксированная? Смотрю путь тактовой частоты - начало в координате x0y1 (это для клок контрола), а конец x0_y174, для данных x0_y192. Попробуйте вообще отвязать от пинов или подвинуть их ближе друг к другу и к переходу на клоковое дерево.

Распиновка фиксированная. В проекте частота приходит в одном банке и есть 2 выходных канала А и В по (16+1 + clk) LVDS пары. И они выходят в 2-х других банках. Изначально констрейны прописаны были для всего. Это ,наверное, то же , что и подвинуть ближе друг к другу. И везде были одинаковые проблемы такие же. Но даже для каналов А и В цифры в одной разводке отличалиь не более чем на 0.1нс. Это сейчас я рассматриваю 2 сигнала.
Цитата(bogaev_roman @ Dec 2 2016, 12:16) *
Можно еще попробовать частоту пускать на прямую - без перехода на клоковый буфер.

это я тоже пробовал. Происходит просто смещение величин на 0.3-0.5нс. также как и тогда когда я двигал выходную частоту. следующая таблица это показывает.
фаза -это смещение с шагом ~0.208нс . и 1-я без ODDR на выходе и 2-я c ODDR на выходе.




Цитата(Shivers @ Dec 2 2016, 13:55) *
Лучше буферы в данные добавлять.

я не понял идею. хотя прочитал статью и там все вроде бы понял.
Но в любом случае буферы на данные на выходе поставить нельзя.
Мало того, что это заимствованный IP xilinx - selectio_wizard и туда трудно чего-то вставить. Вообще-то можно сделать самому подобное. Но там sourse clock записывает данные в OSERDESE2 примитив и далее выход приходит на obufds(в картинке ошибся) и далее выходной порт.
картинка

bogaev_roman
Цитата(serg_k1 @ Dec 2 2016, 11:56) *
но когда я ставлю 1 bufg ( 1-й ---> 2-й) , то setup - запас уменьшается 0.867 ->0.656 , а hold запас тоже уменьшается -0.455 -> -0.709

Вы добавляете в цепочку дополнительный элемент, который в общем случае только ухудшит ситуацию (сложите значения сетапа и холда и увидите, что значение станет отрицательным и будет возрастать при увеличении кол-ва элементов). Работаете Вы на граничных условиях. В этих выходных буферах есть программируемая задержка (у артикса в некотрых банках есть такая возможность)?
serg_k1
Цитата(bogaev_roman @ Dec 3 2016, 13:12) *
В этих выходных буферах есть программируемая задержка (у артикса в некотрых банках есть такая возможность)?

нет , там только HR банки. В них только входная задержка.
serg_k1
Цитата(bogaev_roman @ Nov 30 2016, 13:57) *
у vivado есть две временные модели - fast|slow, и в зависимости от технологического разброса/температуры и напряжения пути будут иметь разную задержку - для сетапа и холда рассчитываются они по разному. Таким образом производитель гарантирует работоспособность всех чипов в заданном температурном диапазоне и просадках по питанию.

я так понял, что не получится выполнить тайминги с моими условиями. я на свой вопрос получил на форуме xilinx такой ответ

Цитата
From your constraints you are asking the tools to provide an edge aligned DDR interface with no more than -100ps to +300ps of skew. The tools are telling you (clearly and categorically) that it can't be done.

Without the ODDR, the tools are telling you that the total violation (setup slack + hold slack) is consistently around 980ps, meaning that it cannot give you a skew of less than 980ps plus the 400 you are asking for (around 1300ps of skew).

With the ODDR, the total violation is decreased - its around 450ps plus the 400 you are asking for, so 850ps.
So, no matter what, this will fail. From these numbers alone it is clear that there is no phase that can meet both the setup max and min skew. Furthermore, you are adjusting the skew in increments of 30 degrees - so 1/12 of your clock period. At 400MHz, this is therefore increments of 208ps - again, this is confirmed by your results (the difference in timing between, say, 90deg and 120dec is moving 208ps of slack from setup to hold). You also get into some launch/capture edge changes as you move from 0degrees to 30degrees (which can be fixed, but is not the root of your problem).

If you want to minimize skew, forget about trying to use different clocks on different phases of the MMCM - clock both the forwarded clock and forwarded data on the same clock using the same BUFG. This will minimize the skew (but likely still won't meet your requirements). Using different outputs of the MMCM add skew (about 200ps total) and using different BUFGs adds a fair bit of additional skew (as compared to using a single BUFG).

You might get (slightly) better results using a BUFH instead of a BUFG if your MMCM and all your outputs are in the same bank. There might even be a way to use a BUFIO, which could be slightly better yet. But, again, its not likely that any of these are going to meet your tight requirement.

That being said, Vivado is fairly pessimistic in these situations. The way it handles "on chip variation" is chip wide; the difference in timing between the longest and shortest paths it uses for timing (which is really what is creating all this skew) is the same ratio, regardless of whether the two structures are right beside each other or on opposite corners of the chip. So, if your forwarded clock and data are all in the same bank (ideally with the clock in the middle of the cluster of data), then the skew is going to be better (maybe even a fair bit better) than what the tools predict. Unfortunately, no one can really tell you "how much better".

So, if you really need the tightest possible skew, then just put everything in the same bank and use the same clock to clock both the forwarded clock (using the ODDR) and the output data (using an ODDR or OSERDES) - nothing you can do in the FPGA is better than that. If that isn't good enough, then (basically) you are out of luck...

Изменить временные требования я не могу. поэтому приходится что-то делать с граничными значениями. xilinx проводит проверку в slow process corner (высокая температура, низкое напряжение) и fast process corner (низкая температуры, высокое напряжение). Насколько схема будет работоспособна без этих граничных условий. как это можно проверить? Если я задаю
Код
config_timing_corners -corner fast -delay_type none

то у меня остаются ошибки в slow. и после задания
Код
config_timing_corners -corner slow -delay_type none

ошибки исчезают. но проводится ли какая-то проверка в этом случае?
bogaev_roman
Цитата(serg_k1 @ Dec 5 2016, 10:27) *
ошибки исчезают. но проводится ли какая-то проверка в этом случае?

Всего две модели, Вы отключаете обе, ничего анализироваться не будет.
Вообще я тестовый проектик делал для этого семейства на частоте 450МГц, с 4 линиями данных, правда с минимальными max|min delay. Чтобы тайминг выполнился пришлось прибивать выходные пины данных и частоту рядом друг с другом (частота была посередине между данными). На входе были такие же требования, там для выполнения таймингов пришлось частоту пускать напрямую, в обход клоковых буферов.
В Вашем случае для стабильной работы скорее всего придется снижать тактовую частоту.
Flip-fl0p
Раз уж подняли тему констейнов.... Не могли бы вы подсказать можно ли констнейны задавать кусками ?
Например у меня есть 3 модуля, которые я объединяю в модуле верхнего уровня. Могу ли я написать констрейны для каждого из модулей ? Или я должен писать только для верхнего уровня ?
bogaev_roman
Цитата(Flip-fl0p @ Dec 5 2016, 16:18) *
Раз уж подняли тему констейнов.... Не могли бы вы подсказать можно ли констнейны задавать кусками ?
Например у меня есть 3 модуля, которые я объединяю в модуле верхнего уровня. Могу ли я написать констрейны для каждого из модулей ? Или я должен писать только для верхнего уровня ?

Вивадо и квартус поддерживают в ограничениях стандарт sdс. Ни с какими ограничениями в задании constraint в подмодулях я не сталкивался. Нужно только следить за иерархической структурой - если название поменяется или сама структура проекта, то их придется или переназначать или переписывать пути.
Flip-fl0p
Цитата(bogaev_roman @ Dec 5 2016, 17:15) *
Вивадо и квартус поддерживают в ограничениях стандарт sdс. Ни с какими ограничениями в задании constraint в подмодулях я не сталкивался. Нужно только следить за иерархической структурой - если название поменяется или сама структура проекта, то их придется или переназначать или переписывать пути.

Спасибо за ответ.
Возник очень глупый вопрос, но что-то я не смог разобраться... Допустим у меня есть один из подмодулей для которого я пишу констрейны. А как мне входные и выходные порты этих модулей обконстрейнить ?
Если порты "внешние" т.е идут на память, матрицу, ацп и пр. То надо описать задержки на этих портах как-то так:
Код
set_output_delay -clock [get_clocks {ХХХ}] -max 5.0 [get_ports {YYY[*]}]
set_output_delay -clock [get_clocks {ХХХ}] -min -5.0 [get_ports {YYY[*]}]

А что делать с "внутренними портами" которые объединяют модули ?
Читаю я сейчас TimeQuest для чайников, общую суть уловил, но понимания пока толком нет.
Shivers
Цитата(Flip-fl0p @ Dec 5 2016, 20:51) *
...А как мне входные и выходные порты этих модулей обконстрейнить ? ...

Прочитайте сначала этот пост на хабре https://habrahabr.ru/post/273849/ В расчеты можно не вникать (хотя желательно), а вот как строится граф - надо разобраться обязательно, это основа STA.
А потом очень советую изучить эту книгу http://www.springer.com/us/book/9780387938196 с описанием всемх констрейнтов, какие бывают. Это лучшая книга, какую видел по STA, и отлично качается с либгена в формате PDF.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.