dxp 58 14 декабря, 2018 Опубликовано 14 декабря, 2018 · Жалоба Всем привет! Столкнулся со следующей проблемой: Vivado выдаёт предупреждения о том, что не может найти pins, cells, nets, прописанные в констрейнах, хотя оные объекты вроде на месте - это легко проверяется хоть через просмотр нетлиста, хоть через схематик, хоть через Tcl консоль, выдавая туда команды get_pins/get_cells/get_nets - ровно те, которые прописаны в констрейнах. Всё находится, всё на месте. Но при запуске, например, Synthesis, в окне Messages вижу: Цитата [Vivado 12-508] No pins matched 'dpc_clk_gen/inst/plle2_adv_inst/CLKOUT0'. ["<...>/timing.xdc":24] Интриги добавляет ещё то обстоятельство, что аналогичный констрейн на другой объект не вызывает такого поведения - там всё хорошо. Вот оба констрейна: create_generated_clock -name pcie_user_clk [get_pins pcie_port/pipe_clock_i/mmcm_i/CLKOUT2] create_generated_clock -name dpc_clk [get_pins dpc_clk_gen/inst/plle2_adv_inst/CLKOUT0] Это два простых констрейна для переименования клоков. Разница между ними в том, что первый относится к MMCM, находящейся внутри корки, а второй - к инстансу в проекте. Сам объект на месте (как уже выше указал), более того, по результату вижу, что клок-то таки переименовался (имеет указанное в констрейне имя). Вот оно на схеме (пин помечен маркером): В общем, заподозревал, что что-то тут, возможно, с порядком обработки данных - такое впечатление, что констрейн прикладывается в момент, когда ещё нетлист не готов и поэтому не находит объект (а в случае первого констрейна находит потому, что там в проект подтаскивается корка, синтезированная OOC, т.е. уже с нетлистом). Но если так, то как это разрулить? Никаких средств не нашёл, гугление тоже не помогло. Из-за этой же фигни не удаётся использовать waiver'ы - подобная ругань, что нет объектов (а они есть в результирующем нетлисте). В общем, обращаюсь к коллективному разуму и опыту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 14 декабря, 2018 Опубликовано 14 декабря, 2018 · Жалоба Да, примерно так и есть. Для меня всегда было вопросом на каких стадиях сборки какие констрейны применяет вивада. Для сложных случаев приходилось даже прописывать констрейны в post-synthesis / post-place / post-route скрипты, чтобы они выполнились когда нужные объекты возникли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 14 декабря, 2018 Опубликовано 14 декабря, 2018 · Жалоба Приветствую! Для синтеза это "нормальное" поведение если часть BD/IP у вас синтезируется как OOC модули. В таком случае при синтезе констрэйны привязанные к net|pin внутри этих OOC не находятся. Так как модуль OOC виден при синтезе как black-box. Тут нужно либо забить на варнинги, либо все синтезировать одним куском (global), либо выносить такие констрэйны в отдельный xdc с опцией "только для P&R". 1 hour ago, alexadmin said: Да, примерно так и есть. Для меня всегда было вопросом на каких стадиях сборки какие констрейны применяет вивада Порядок применения констрэйнов в Vivado описан в доке. Если в общем случае то сначала все ip.xdc, затем user.xdc | user.tcl (в порядке включения в проекте!!!). Ну а конкретная последовательность видна в логе синтеза/P&R Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 14 декабря, 2018 Опубликовано 14 декабря, 2018 · Жалоба Присоединяюсь к вышесказанному. В целом, ксайлинкс прямо рекомендует использовать одни констрейны для синтеза и другие для раскладки. Хотя лично я просто забиваю на ругань синтезатора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 14 декабря, 2018 Опубликовано 14 декабря, 2018 · Жалоба Приветствую! Так как сейчас можно полноценно использовать tcl для констрейнов то при желании можно ваять универсальный файл выбирая через if часть для синтеза или P&R. Но у меня такое впечатление что Vivado при синтезе не учитывает данные по клоку - так как по логу видно что xdc применяется после окончания синтеза . Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 58 15 декабря, 2018 Опубликовано 15 декабря, 2018 · Жалоба 19 часов назад, RobFPGA сказал: выбирая через if часть для синтеза или P&R А как определить в процессе, какой этап происходит (синтез или какой-либо из этапов P&R- их там чуть не с полдюжины)? Какая-то тиклевая команда есть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 15 декабря, 2018 Опубликовано 15 декабря, 2018 · Жалоба 4 hours ago, dxp said: А как определить в процессе, какой этап происходит (синтез или какой-либо из этапов P&R- их там чуть не с полдюжины)? Какая-то тиклевая команда есть? у синтеза и имплеметации раздельные окна логов. Ну и там написано что он делает) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 15 декабря, 2018 Опубликовано 15 декабря, 2018 · Жалоба Приветствую! 7 hours ago, dxp said: А как определить в процессе, какой этап происходит (синтез или какой-либо из этапов P&R- их там чуть не с полдюжины)? Какая-то тиклевая команда есть? Казалось бы что может быть проще ... if {[current_run]=="synth_1"} {... Ан нет :( Ведь к моменту применения файлов констрейнов процесс синтеза УЖЕ ЗАКОНЧИЛСЯ! Поэтому [current_run] возвращает ... сюрприз ... "impl_1" Но нормальные герои как известно всегда в обход ползут. # synth_implentation_constaint_file.tcl # out current property report_property [current_design] report_property [current_project] report_property [current_run] report_property [current_fileset] common::send_msg_id "SYNTH: 00-000" "INFO" "apply user's common constraint" # common constraint create_clock -period 3.000 -name CLK_IN [get_ports clk_in] create_clock -period 5.000 -name CLK_OU [get_ports clk_ou] set_clock_groups -asynchronous -group {CLK_IN} set_clock_groups -asynchronous -group {CLK_OU} # Stone near 3 roads if {[get_property DESIGN_MODE [current_fileset]]=="RTL"} { common::send_msg_id "SYNTH: 00-000" "INFO" "apply user's synthesis constraint" # ... } elseif {[get_property DESIGN_MODE [current_fileset]]=="GateLvl"} { common::send_msg_id "SYNTH: 00-000" "INFO" "apply user's implementation constraint" # ... } else { common::send_msg_id "SYNTH: 00-000" "ERROR" "F..k! Where i'm?" exit 1 } Увы - в Vivado все еще каша в части организации внутренних процессов и упорядочивании команд. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 15 декабря, 2018 Опубликовано 15 декабря, 2018 · Жалоба я мож путаю - но кажется в виваде есть понятие "свойства файла" где указывается для какого этапа применяется ограничения (синтез, имплемент итд) и порядок применения (очерёдность). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 58 17 декабря, 2018 Опубликовано 17 декабря, 2018 · Жалоба В 16.12.2018 в 04:48, Alex77 сказал: я мож путаю - но кажется в виваде есть понятие "свойства файла" где указывается для какого этапа применяется ограничения (синтез, имплемент итд) Ничего не путаете, всё так и есть (и как же я сам не догадался, ведь знал же про это свойство). Спасибо за идею, тут вообще всё реализуется на раз! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Doka 4 8 января, 2019 Опубликовано 8 января, 2019 · Жалоба On 12/14/2018 at 2:05 PM, RobFPGA said: Приветствую! Но у меня такое впечатление что Vivado при синтезе не учитывает данные по клоку - так как по логу видно что xdc применяется после окончания синтеза . Удачи! Rob. гайд по non-project mode такую последовательность прямым текстом и рекомендует (иначе объекты не будут найдены): read_verilog ... synth_design ... -> read_xdc ... opt_design ... PS: быть может это связано с тем, что на этапе synth_design выполняется маппирование во внутреннее представление (как в synopsys DC в GTECH), а синтез (с констрейнтами) происходит всёже в opt_design Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться