Shivers 0 8 марта, 2017 Опубликовано 8 марта, 2017 · Жалоба Все не так страшно. Простой расчет: сигнал сопровождения к шине (т.е. строб) задерживается на 2 такта пересинхронизации в приемной части. Это значит, что данные могут задержаться не более чем на 2 такта относительно прихода строба. Если приемная частота 100 МГц, получаем 20нс - это очень много, откуда в ПЛИС такие задержки роутинга через матрицу интерконнекта? Далее, из приемной части должен прийти сигнал подтверждения приема. который задерживается на 2 такта в пересинхронизаторах передающей части, прежде чем выставятся новые данные. Итого, разброс задержек для шины между двумя клоковыми доменами составляет +/- 2 такта, или около +/- 20н (100 МГц), что очень много. Опасность возникает, только если частоты под гигагерц, или если на границе клоковых доменов добавлена логика (изредка встречается, хотя я бы руки за такое отрывал) - вот тогда действительно нужно использовать малтисайкл 2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gin 0 10 марта, 2017 Опубликовано 10 марта, 2017 · Жалоба Все не так страшно. Простой расчет: сигнал сопровождения к шине (т.е. строб) задерживается на 2 такта пересинхронизации в приемной части. Это значит, что данные могут задержаться не более чем на 2 такта относительно прихода строба. Если приемная частота 100 МГц, получаем 20нс - это очень много, откуда в ПЛИС такие задержки роутинга через матрицу интерконнекта? Далее, из приемной части должен прийти сигнал подтверждения приема. который задерживается на 2 такта в пересинхронизаторах передающей части, прежде чем выставятся новые данные. Итого, разброс задержек для шины между двумя клоковыми доменами составляет +/- 2 такта, или около +/- 20н (100 МГц), что очень много. Опасность возникает, только если частоты под гигагерц, или если на границе клоковых доменов добавлена логика (изредка встречается, хотя я бы руки за такое отрывал) - вот тогда действительно нужно использовать малтисайкл 2. Полностью согласен, задержка при передаче от триггера к триггеру (если между ними нет комбинационной логики) в современных ПЛИС занимает мало времени. Так что констрейтить, думаю там действительно не стоит, а то это уже какой то паранойей попахивает) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gin 0 30 марта, 2017 Опубликовано 30 марта, 2017 (изменено) · Жалоба Что то я совсем не так делаю... Не хочет Квартус отключать выбранные пути из анализа. Из-за этого к чертям все времянки летят. Когда анализирую отдельно основную часть проекта (которая на 156 Мгц работает) - он пишет, что может ее и на 230 МГц вытянуть. Когда подключаю дополнительный модуль, работающей на 50 МГц, который изредка обменивается данными с основным, то все рушится. Вместо 156 Квартус дает только 105 МГц (это при том, что раньше он 230 гарантировал!!!). И в отчете как раз междоменные и заваливают частоту. И как мне этот проклятый констрейт правильно задать?! Изменено 30 марта, 2017 пользователем gin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 30 марта, 2017 Опубликовано 30 марта, 2017 · Жалоба да вроде не сложно set_false_path -from [get_clocks clk_1] -to [get_clocks clk_2] set_false_path -from [get_clocks clk_2] -to [get_clocks clk_1] или set_false_path -rise_from <clk_1> -rise_to <clk_2> set_false_path -rise_from <clk_2> -rise_to <clk_1> ну и от падающего до восходящего и наоборот если есть работы по разным фронтам не забывайте что надо как вперед, так и назад Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gin 0 30 марта, 2017 Опубликовано 30 марта, 2017 · Жалоба да вроде не сложно set_false_path -from [get_clocks clk_1] -to [get_clocks clk_2] set_false_path -from [get_clocks clk_2] -to [get_clocks clk_1] или set_false_path -rise_from <clk_1> -rise_to <clk_2> set_false_path -rise_from <clk_2> -rise_to <clk_1> ну и от падающего до восходящего и наоборот если есть работы по разным фронтам не забывайте что надо как вперед, так и назад Тоже так подумал, что надо в обе стороны описывать, вроде помогло. Вот что значит, поплакался на форуме, и заработало)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 30 марта, 2017 Опубликовано 30 марта, 2017 · Жалоба Для сокращения длинных плохо читаемых автоматически созданных имён можно использовать макроподстановки TCL. Очень заинтересовало Ваше сообщение. Надоело после команды derive_pll_clocks врукопашную править имена всех клоков на смысловые. Не сможете ли примерчик подкинуть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gin 0 30 марта, 2017 Опубликовано 30 марта, 2017 · Жалоба Очень заинтересовало Ваше сообщение. Надоело после команды derive_pll_clocks врукопашную править имена всех клоков на смысловые. Не сможете ли примерчик подкинуть? Кстати да, а то писать эти длинные имена вручную очень утомительно. Да и при изменениях в проекте эти имена ведь тоже меняются. Хочется автоматизировать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DuHast 0 30 марта, 2017 Опубликовано 30 марта, 2017 · Жалоба И как мне этот проклятый констрейт правильно задать?! Сделайте через GUI в TimeQues. Команда будет продублирована в командной строке. Скопируйте её и вставте в свой SDC файл. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба Очень заинтересовало Ваше сообщение. Надоело после команды derive_pll_clocks врукопашную править имена всех клоков на смысловые. Не сможете ли примерчик подкинуть? set rx_clk_name {rx_10g_inst|rx_10g_inst|xv_xcvr_10gbaser_nr_inst|ch[0].sv_xcvr_10gbaser_native_inst|g_fpll.altera_pll_156M~PLL_OUTPUT_COUNTER|divc lk} set sys_clk_name {pll_sys_inst|pll_sys_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk} set_false_path -from [get_clocks $rx_clk_name] -to [get_clocks $sys_clk_name] # и ещё больше можно упростить: set rx_clk [get_clocks $rx_clk_name] set sys_clk [get_clocks $sys_clk_name] set_false_path -from $rx_clk -to $sys_clk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба set rx_clk_name {rx_10g_inst|rx_10g_inst|xv_xcvr_10gbaser_nr_inst|ch[0].sv_xcvr_10gbaser_native_inst|g_fpll.altera_pll_156M~PLL_OUTPUT_COUNTER|divc lk} set sys_clk_name {pll_sys_inst|pll_sys_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk} set_false_path -from [get_clocks $rx_clk_name] -to [get_clocks $sys_clk_name] # и ещё больше можно упростить: set rx_clk [get_clocks $rx_clk_name] set sys_clk [get_clocks $sys_clk_name] set_false_path -from $rx_clk -to $sys_clk Спасибо! Но это как раз понятно. Здесь строчку rx_10g_inst|rx_10g_inst|xv_xcvr_10gbaser_nr_inst|ch[0].sv_xcvr_10gbaser_native_i nst|g_fpll.altera_pll_156M~PLL_OUTPUT_COUNTER|divclk всё равно придётся писать вручную (копипастить). Например у меня название клока такое spll1|pll1_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|vco1ph[0], а после пересборки проекта вполне может вместо vco1ph[0] оказаться vco1ph[1],естественно сыпятся все ограничения. Тогда приходится ручками перебивать все имена. Я эту ситуацию имел ввиду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба Спасибо! Но это как раз понятно. Здесь строчку rx_10g_inst|rx_10g_inst|xv_xcvr_10gbaser_nr_inst|ch[0].sv_xcvr_10gbaser_native_i nst|g_fpll.altera_pll_156M~PLL_OUTPUT_COUNTER|divclk всё равно придётся писать вручную (копипастить). Например у меня название клока такое spll1|pll1_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|vco1ph[0], а после пересборки проекта вполне может вместо vco1ph[0] оказаться vco1ph[1],естественно сыпятся все ограничения. Тогда приходится ручками перебивать все имена. Я эту ситуацию имел ввиду. Можно попробовать получить идентификатор и имя выходного пина PLL по имени clock net: foreach_in_collection net [get_nets "clk"] { puts [get_net_info -name $net] puts [set pin_id [get_net_info -pin $net]] puts [set pin_name [get_pin_info -name $pin_id]] } А потом непосредственно сделать имя клока из имени пина, или, по-научному, перебрать все клоки, и выбрать те, у которых target равен $pin_name Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба Можно попробовать получить идентификатор и имя выходного пина PLL по имени clock net: foreach_in_collection net [get_nets "clk"] { puts [get_net_info -name $net] puts [set pin_id [get_net_info -pin $net]] puts [set pin_name [get_pin_info -name $pin_id]] } А потом непосредственно сделать имя клока из имени пина, или, по-научному, перебрать все клоки, и выбрать те, у которых target равен $pin_name Спасибо! Как появится "окно" в работе обязательно попробую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться