Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: TimeQuest. Борьба со slack.
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Flip-fl0p
Работаю c чипом CYCLONE V - 5CSEMA5F31C6. САПР - Quartus 13.1.
Столкнулся с проблемой, что между Fast input register или выходами DDR регистра и регистром-приёмником данных набегает огромная задержка по данным. Из-за чего возникает нарушение по setup.
Для начала опишу кратко дизайн:
Имеем 3 приёмные LVDS линии c DDR регистрами. На вход CLK подается опорная частота, которая на PLL умножается на 10 5, для тактирования приёмников.



TimeQuest радостно сообщает о том, что у нас нарушение по setup и фиг вам, а не частота приёмников выше 200...230 MHZ.



Посмотрим, чуть внимательнее на само нарушение. Набегает огромная задержка почти в 3 нс по данным.


Может Quartus расположил регистры приёмники в другом конце чипа ?
Да нет, ближе практически некуда:



На данный момент у меня есть 2 мысли как можно решить проблему:
1. На pll сформировать частоту со сдвигом, и от неё тактировать регистры-приёмники.
2. На LCELL сформировать цепь задержки тактового сигнала регистров приёмников(тупиковый вариант).

Хотелось бы услышать совета от более опытных коллег. Может есть какой-то другой способ решения проблемы ?
Пока мой SDC файл выглядит так:
Код
#**************************************************************
# Create Clock
#**************************************************************
set_time_format -unit ns -decimal_places 3
create_clock -name {CLK}  -period 80MHz [get_ports {CLK}]

#**************************************************************
# Create PLL Clock
#**************************************************************
derive_pll_clocks

set_false_path -from [get_clocks {MY_PLL_COMP|my_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -to [get_ports {RX0}]
set_false_path -from [get_clocks {MY_PLL_COMP|my_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -to [get_ports {RX1}]
set_false_path -from [get_clocks {MY_PLL_COMP|my_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -to [get_ports {RX2}]


Прикрепляю тестовый проект:
Magnum
По идее ДДР должен работать по двум фронтам клока, т.е. при 10-кратной десериализации параллельный клок надо умножать на 5, (а не на 10). ИМХа.
Flip-fl0p
Цитата(Magnum @ Aug 9 2017, 10:22) *
По идее ДДР должен работать по двум фронтам клока, т.е. при 10-кратной десериализации параллельный клок надо умножать на 5, (а не на 10). ИМХа.

Да действительно. Неправильно написал. У меня умножается на 5. Подправлю.
Magnum
А если например в чип-планере выходной сдвиговый регистр погонять по чипу (ближе/дальше от пина), то слак сильно различается?
bogaev_roman
Цитата(Flip-fl0p @ Aug 9 2017, 09:14) *
Да нет, ближе практически некуда:

Два вопроса:
1. Проверьте задержку в IO буфере (delay chain) и приведите цифру.
2. Где расположена pll, от которой питается вся логика - не в другом ли она конце fpga, точно ли этот клок глобальный (пессимизм большой и сам разброс значений для клока)?
ЗЫ. Я так понимаю пины у Вас жестко привязаны (между ними банк памяти или умножитель, что не есть хорошо)? Ради интереса попробуйте их отвязать и посмотреть результат.
Flip-fl0p
Цитата(Magnum @ Aug 9 2017, 10:50) *
А если например в чип-планере выходной сдвиговый регистр погонять по чипу (ближе/дальше от пина), то слак сильно различается?

Отличается не сильно. А как вообще правильно вручную двигать ячейки ? У меня после того, как я подвинул и нажал кнопку "Check and Save all netlist changes" quartus начинает компилировать проект, и возвращает все изменения обратно...

Код
1. Проверьте задержку в IO буфере (delay chain) и приведите цифру.
2. Где расположена pll, от которой питается вся логика - не в другом ли она конце fpga?
ЗЫ. Я так понимаю пины у Вас жестко привязаны (между ними банк памяти или умножитель, что не есть хорошо)? Ради интереса попробуйте их отвязать и посмотреть результат.

Задержка везде по нулям.
Есть фракционный PLL чуть ближе. :
Сейчас PLL расположен тут(см. картинку)


А вот компиляция проекта с "отвязанными" пинами дала поразительный результат: слаки все ушли и времянка выполняется...
Пути совершенно другие стали:

Magnum
Цитата
А как вообще правильно вручную двигать ячейки

Я обычно в окошке "логик лок регион виндов" создаю некий тематический "рут регион", задаю его координаты, размерность, фиксируемость и в свойствах накидываю всё то барахло, которое хочу в него запихнуть.
bogaev_roman
Цитата(Flip-fl0p @ Aug 9 2017, 11:04) *
Пути совершенно другие стали:

Проанализируйте два отличия:
1. Существенно поменялось время IC (хотя Вы написали, что задержка в io-буферах 0).
2. Существенно уменьшился разброс clocks_patch (все-таки убедитесь, что в первом случае клок пошел по глобальной шине клоков и, по возможности, используйте клокконтрол поближе к рабочей логике).
ЗЫ. Кроме этой логики в проекте есть еще какая-то другая логика, стоящая после этих регистров (проект посмотреть в данный момент времени возможности нет)? Если есть, попробуйте ее убрать.
ЗЫЫ. Ограничения на размещение я обычно прописываю прямо в .qsf- файле. Изначально их можно задавать в assignement editor,.
Flip-fl0p
Цитата(bogaev_roman @ Aug 9 2017, 11:54) *
Проанализируйте два отличия:
1. Существенно поменялось время IC (хотя Вы написали, что задержка в io-буферах 0).
2. Существенно уменьшился разброс clocks_patch (все-таки убедитесь, что в первом случае клок пошел по глобальной шине клоков и, по возможности, используйте клокконтрол поближе к рабочей логике).
ЗЫ. Кроме этой логики в проекте есть еще какая-то другая логика, стоящая после этих регистров (проект посмотреть в данный момент времени возможности нет)? Если есть, попробуйте ее убрать.
ЗЫЫ. Ограничения на размещение я обычно прописываю прямо в .qsf- файле. Изначально их можно задавать в assignement editor,.

Никакой логики в проекте нет (за исключением небольшого ряда мультиплексоров, которые никак не влияют на текущий результат работы). Вот структута приёмника:


Magnum
А если например поставить в ДДР лпм галочку регистеред аутпут, то до того регистра, тоже будет такая большая задержка?
Flip-fl0p
Цитата(Magnum @ Aug 9 2017, 13:01) *
А если например поставить в ДДР лпм галочку регистеред аутпут, то до того регистра, тоже будет такая большая задержка?

У меня такой нет sad.gif
Magnum
Цитата(Flip-fl0p @ Aug 9 2017, 17:24) *
У меня такой нет sad.gif

как же так? вот тут смотрели?

Flip-fl0p
В 5 циклоне похоже таких нет...



У меня нет ALTLVDS_RX. У меня самописный приёмник. По некоторым причинам ALTLVDS_RX не подходит.
Magnum
Отнюдь, очевидно это просто разные библиотеки.
bogaev_roman
Цитата(Flip-fl0p @ Aug 9 2017, 13:39) *
В 5 циклоне похоже таких нет...
У меня нет ALTLVDS_RX. У меня самописный приёмник. По некоторым причинам ALTLVDS_RX не подходит.

Все равно на выходе будет обычный дополнительный регистр на рассыпухе. Входной io буфер для данного случая представляет из себя DDIO in из трех регистров и цепочки delay chain, там физически что-то еще дополнительно засунуть нельзя.
Magnum
Цитата(Flip-fl0p @ Aug 9 2017, 17:39) *
У меня нет ALTLVDS_RX. У меня самописный приёмник. По некоторым причинам ALTLVDS_RX не подходит.

А что именно за причины? Это ж 1в1 для режима ддр тоже самое.
Flip-fl0p
Цитата(Magnum @ Aug 9 2017, 13:57) *
А что именно за причины? Это ж 1в1 для режима ддр тоже самое.

Для подстройки фазы клока я применяю выводы для управления динамическим сдвигом, для этого ALT_LVDS_RX я запускаю в режиме EXTERNAL_PLL. Поэтому между ALT_LVDS_RX и PLL необходимо применять клоковый буфер, который требует 2 частоты с PLL, иначе работать не будет. А 2 частоты я не могу применить из-за того, что мне просто не хватит выводов PLL для динамической подстройки. А вот попробовать применить ALT_LVDS_RX в качестве DDR приёмника - это мысль.
Magnum
В том и фишка, при 2 разрядном выходе лвдс_рх вырождается в ддр с одним клоком.
Flip-fl0p
Цитата(Magnum @ Aug 9 2017, 14:32) *
В том и фишка, при 2 разрядном выходе лвдс_рх вырождается в ддр с одним клоком.

Результат аналогичный:

Проблема появляется если входы размещены в банке IOBANK_4A.
Если входы разместить в банке IOBANK_5B - то проблема уходит.
P.S. Реальная железка работает без нареканий wacko.gif
Quartus 15.0 результат аналогичный...
bogaev_roman
Цитата(Flip-fl0p @ Aug 9 2017, 15:03) *
P.S. Реальная железка работает без нареканий wacko.gif

Временная модель, приведенная Вами - скорее всего для худшего случая (slow - повышенная температура, пониженное напряжение и технологический разброс). Все-таки Вы уверены, что клок идет по глобальной линии клока? Интересно посмотреть запас по холду, если он большой, то можно попробовать фазу подергать.
Зы Посмотрел внимательно на последний отчет по времянке, у Вас ограничения не потерялись в sdc (relationship соответствует 1нс, а должен по идее 2.5нс)?
Flip-fl0p
Цитата(bogaev_roman @ Aug 9 2017, 15:26) *
Временная модель, приведенная Вами - скорее всего для худшего случая (slow - повышенная температура, пониженное напряжение и технологический разброс). Все-таки Вы уверены, что клок идет по глобальной линии клока? Интересно посмотреть запас по холду, если он большой, то можно попробовать фазу подергать.
Зы Посмотрел внимательно на последний отчет по времянке, у Вас ограничения не потерялись в sdc (relationship соответствует 1нс, а должен по идее 2.5нс)?

В последнем отчете, я даже на задавл констрейны. Я Посмотрел на FMAX, посмотрел на слаки - и сделал вывод о том, что этот вариант так-же не работает. Не думаю, что если я поставлю PLL, задам констрейны он будет отличаться.
bogaev_roman
Цитата(Flip-fl0p @ Aug 9 2017, 15:36) *
В последнем отчете, я даже на задавл констрейны. Я Посмотрел на FMAX, посмотрел на слаки - и сделал вывод о том, что этот вариант так-же не работает. Не думаю, что если я поставлю PLL, задам констрейны он будет отличаться.

Задайте ограничения, тогда slack уменьшится до -2нс, потом сдвиньте приемную частоту больше, чем на 2нс (300градусов), если hold не вылезет, то по setup должно пройти (в идеальном случае). Но откуда там набегает 3нс при переходе от ddr регистра до обычного в соседней ячейке - загадка.
andrew_b
Цитата(bogaev_roman @ Aug 9 2017, 15:57) *
Но откуда там набегает 3нс при переходе от ddr регистра до обычного в соседней ячейке - загадка.
Вероятно, отгадка такая:
Цитата(http://www.alteraforum.com/forum/showthread.php?t=45705&p=189491#post189491)
Cyclone V DQ pin used for user pin(not DDR DQ pin), always need to route through HMCPHY_RE. this routing element would cause almost 2ns differnece between setup and hold. no way to bypass it.
so never use DQ pins as high speed input or output in cyclone V
Flip-fl0p
Цитата(andrew_b @ Aug 9 2017, 17:02) *
Вероятно, отгадка такая:

Ох ё... Это многое объясняет. В handboock на cyclone 5 я даже не видел ничего похожего (неудивительно 3800 страниц...).
bogaev_roman
Цитата(andrew_b @ Aug 9 2017, 17:02) *
Вероятно, отгадка такая:

Очень интересно. Архитектурная особенность только для cyclone V или для других семейств типа arriaV тоже?
andrew_b
Цитата(bogaev_roman @ Aug 9 2017, 17:16) *
Очень интересно. Архитектурная особенность только для cyclone V или для других семейств типа arriaV тоже?
Про Арию не знаю, не работал. В Циклоне я столкнулся со слаками пару лет назад: https://electronix.ru/forum/index.php?showtopic=130681
Flip-fl0p
Остался ещё один нерешённый вопрос. Почему Quartus удалил частоты С1 и С2 созданные на PLL.... И оставил только С0. Он их не будет "оптимизировать" только если я каждой частоте назначу разные сдвиги фаз.
Да и почему железка то работает как положено и самое главное стабильно, имея такое нарушение по Setup ?
Magnum
Цитата(Flip-fl0p @ Aug 9 2017, 22:34) *
и почему железка то работает как положено и самое главное стабильно, имея такое нарушение по Setup ?

А что удивительного? если задержка ровно на такт у вас, то всё и работает как надо, другое дело, если вы начнете её в температуре гонять, от нулей до +70С, там могут начаться чудеса. Ну и при массовом производстве могут на разных экземплярах разные результаты получаться.
_Anatoliy
Упаду на хвост по теме. Не удаётся выполнить выходные времянки для ЦАП(Fclk = 100MHz,SDR,Cyclon III).
Код
set_output_delay 5 -max -clock {clk_dac} [get_ports {dac_*}]
set_output_delay -3 -min -clock {clk_dac} [get_ports {dac_*}]

Клок в плис приходит от ЦАП -> PLL -> формирование данных, fast_output_register задействован.
Вращение фазы PLL нужного эффекта не приносит. Почему-то на io_obuf задержка 5,3нс и разница на двух битах достигает 5,3 - 2,3 = 3нс.
Что посоветуете,коллеги?
bogaev_roman
Цитата(_Anatoliy @ Aug 10 2017, 11:19) *
Что посоветуете,коллеги?

Эти ограничения из даташита (просто максимальное окно на работу при них получается всего 10-5-3=2нс)? clk_dac - это выход pll (из приведенных ограничений не видно)? Для подробного анализа можете привести схему чипланнера, на которой показаны расположения io-буферов и pll (может они по всему периметру раскиданы, так непонятно)?
_Anatoliy
Цитата(bogaev_roman @ Aug 10 2017, 12:16) *
Эти ограничения из даташита (просто максимальное окно на работу при них получается всего 10-5-3=2нс)? clk_dac - это выход pll (из приведенных ограничений не видно)? Для подробного анализа можете привести схему чипланнера, на которой показаны расположения io-буферов и pll (может они по всему периметру раскиданы, так непонятно)?

Да, из даташита. Окно действительно очень маленькое.
clk_dac - это выход pll
С чиппланером я не очень дружу. io-буфер видно, а как ещё и PLL показать?
bogaev_roman
Цитата(_Anatoliy @ Aug 10 2017, 12:41) *
С чиппланером я не очень дружу. io-буфер видно, а как ещё и PLL показать?

Я сигналы сначала в timequest нахожу, потом правой кнопкой locate->chip planner, в окне chipplanner в show physical routing выделяю появившийся объект, слева (типа окна инструментов) можно подключить к этому объекту fan in/fan out, общее масштабирование - ctrl+колесо мыши. Таким образом можно посмотреть необходимые объекты на всей площади fpga.
_Anatoliy
Цитата(bogaev_roman @ Aug 10 2017, 13:09) *
Я сигналы сначала в timequest нахожу, потом правой кнопкой locate->chip planner, в окне chipplanner в show physical routing выделяю появившийся объект, слева (типа окна инструментов) можно подключить к этому объекту fan in/fan out, общее масштабирование - ctrl+колесо мыши. Таким образом можно посмотреть необходимые объекты на всей площади fpga.

Спасибо! Длинная линия внизу это путь клока от PLL до io_obuf. Это для dac_im[0].
bogaev_roman
Цитата(_Anatoliy @ Aug 10 2017, 13:19) *
Это для dac_im[0].

Можно сразу все dac_im* вытащить со всеми fan-in. Чтобы понять откуда разбег в 3нс получается приведите еще и путь для другого выхода (скорее всего пины находятся между банками памяти или dsp-блоками).
_Anatoliy
Цитата(bogaev_roman @ Aug 10 2017, 13:32) *
Можно сразу все dac_im* вытащить со всеми fan-in. Чтобы понять откуда разбег в 3нс получается приведите еще и путь для другого выхода (скорее всего пины находятся между банками памяти или dsp-блоками).

А как эту * поставить?

Здесь можно выбрать только один бит из списка.
Не выходит у меня вывести всю шину. На снимке справа внизу подсвеченные синим - это мои io_obuf. Внизу по центру - PLL. Показан клок для dac_im[10]. Вроде не через весь кристалл связи идут.

Разбежка в задержках клока в пределах шины = 1,641 - 1,582 = 0,059нс. Думаю что дело не в клоке, а разбежка задержек данных в пределах шины как раз и даёт те клятые 3,0 нс...

Но ведь в лапах стоят триггеры, они ведь должны устранить этот разбег данных wacko.gif
_Anatoliy
Коллеги, а есть то она вообще, правда на земле? Может мне кто нибудь объяснить как с указанными Th и Tsu входного интерфейса ЦАП можно работать с тактовой 160МГц?
Thsu = Tsu - Th = 5 - (-3.2) = 8.2ns
T = 1 / F = 1 / 160 = 6.25ns
Thsu > T
otv116
Цитата(andrew_b @ Aug 9 2017, 17:02) *
Вероятно, отгадка такая:


Большое спасибо, andrew_b, за эту находку. Который день мучаюсь с подобной проблемой. С одного пина быстро долетает, с другого тупит. Уже голову сломал.
Ну и г.. этот CycloneV, столько гадостей в нем, что его достоинства не всегда их могут перебороть.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.