blackfin 25 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба 3 minutes ago, gosha-z said: С написанием без квадратных скобок? Да, без скобок. Вот как я выше написал, так Vivado и синтезирует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 2 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба 4 minutes ago, blackfin said: Вот как я выше написал, так Vivado и синтезирует. Попробовал. 12-4739 присутствует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZwergNase 0 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба Возможно, надо добавить пробел после group в -group[get_clocks -include_generated_clocks clk_fpga_0] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба Приветствую! 4 hours ago, gosha-z said: Попробовал. 12-4739 присутствует. У вас это сообщения когда выдается? При синтезе или при P&R? Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 2 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба При синтезе Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба Приветствую 12 minutes ago, gosha-z said: При синтезе При синтезе может быть так что этого клока еще нет. Так как полный нетлист создается только перед P&R или когда вы делаете Open synthesys desig (почти полный). Да и при синтезе Vivado в большинстве своем кладет болт на эти констрейны. Это больше нужно для P&R. Надо смотреть полный лог синтеза чтобы понять в какой последовательности и к чему применяются файлы констрейнов. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба Во-первых в синтезе констрейны должны быть видны. Это ненормально как-то. Хотя наличие неких настроек может убрать видимость во время синтеза. Во-вторых, если констрейны видны в p&r, то можно подтянуть и пользовательские констрейны только на фазу p&r. Всё равно указанный констрейн нужен только для исключения анализа заведомо асинхронных цепей в timing analysis, который для FPGA делается после p&r. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Avex 1 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба До синтеза есть еще одна фаза работы тула - элаборация. Это, когда считывается RTL и преобразуется в нетлист на generic селлах. Т.е. тул с самого начала и до конца работает с нетлистом, другое дело что действительно - нетлисты до синтеза и после заметно отличаются, особенно в части комбинационной логики, где в ходе минимизации и мэппинга создаются и удаляются логические элементы и цепи. По этой причине констрейнты до синтеза и после выглядят немного разно, но только в части имен (пинов, портов, селлов и т.д.). У топикстартера использован иерархический пин. В принципе, такой констрейнт будет валиден и до и после синтеза. Если только выше этого пина не намешано чего то нехорошого, вроде комбинационной логики, или если этот порт исчезает в процессе синтеза по какой либо причине. Но вот что точно - судя по ворнингу тула, в констрейнтах пропущен пробел, а в слове asynchronous допущена грамматическая ошибка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба Приветствую! Делаем пару простеньких скрипта: ### test_clk_before.tcl proc test_clocks {{msg "none"}} { puts ">> $msg" set clocks [get_clocks -include_generated_clocks] foreach clk $clocks { puts ">> Clock: $clk ..." report_property $clk } } test_clocks "Before ..." ... ### test_clk_after.tcl test_clocks "After ..." Добавляем эти файлы как constraint причем test_clk_before.tcl ставим в списке в самом начале, а test_clk_after.tcl в конце (ну или после любого вашего файла) Запускаем синтез и смотрим что выводится ... , удивляемся, возмущаемся, чешем голову Spoiler Processing XDC Constraints Initializing timing engine ... Sourcing Tcl File [.../src/xdc/test_clk_before.tcl] >> Before ... >> Clock: i_zynq_sys/processing_system7_0/FCLK_CLK0 ... Property Type Read-only Value CLASS string true clock FILE_NAME string true ..../sys_processing_system7_0_0_in_context.xdc INPUT_JITTER double true 0.000 IS_GENERATED bool true 0 IS_PROPAGATED bool true 1 IS_USER_GENERATED bool true 0 IS_VIRTUAL bool true 0 LINE_NUMBER int true 1 NAME string true i_zynq_sys/processing_system7_0/FCLK_CLK0 PERIOD double true 10.000 SOURCE_PINS string* true i_zynq_sys/processing_system7_0/FCLK_CLK0 SYSTEM_JITTER double true needs timing update*** WAVEFORM double* true 0.000 5.000 >> Clock: i_zynq_sys/processing_system7_0/FCLK_CLK1 ... Property Type Read-only Value CLASS string true clock FILE_NAME string true ..../sys_processing_system7_0_0_in_context.xdc INPUT_JITTER double true 0.000 IS_GENERATED bool true 0 IS_PROPAGATED bool true 1 IS_USER_GENERATED bool true 0 IS_VIRTUAL bool true 0 LINE_NUMBER int true 2 NAME string true i_zynq_sys/processing_system7_0/FCLK_CLK1 PERIOD double true 5.000 SOURCE_PINS string* true i_zynq_sys/processing_system7_0/FCLK_CLK1 SYSTEM_JITTER double true needs timing update*** WAVEFORM double* true 0.000 2.500 Finished Sourcing Tcl File [..../src/xdc/test_clk_before.tcl] ... >> After ... >> Clock: i_zynq_sys/processing_system7_0/FCLK_CLK0 ... Property Type Read-only Value CLASS string true clock FILE_NAME string true ..../sys_processing_system7_0_0_in_context.xdc INPUT_JITTER double true 0.000 IS_GENERATED bool true 0 IS_PROPAGATED bool true 1 IS_USER_GENERATED bool true 0 IS_VIRTUAL bool true 0 LINE_NUMBER int true 1 NAME string true i_zynq_sys/processing_system7_0/FCLK_CLK0 PERIOD double true 10.000 SOURCE_PINS string* true i_zynq_sys/processing_system7_0/FCLK_CLK0 SYSTEM_JITTER double true needs timing update*** WAVEFORM double* true 0.000 5.000 >> Clock: i_zynq_sys/processing_system7_0/FCLK_CLK1 ... Property Type Read-only Value CLASS string true clock FILE_NAME string true ..../sys_processing_system7_0_0_in_context.xdc INPUT_JITTER double true 0.000 IS_GENERATED bool true 0 IS_PROPAGATED bool true 1 IS_USER_GENERATED bool true 0 IS_VIRTUAL bool true 0 LINE_NUMBER int true 2 NAME string true i_zynq_sys/processing_system7_0/FCLK_CLK1 PERIOD double true 5.000 SOURCE_PINS string* true i_zynq_sys/processing_system7_0/FCLK_CLK1 SYSTEM_JITTER double true needs timing update*** WAVEFORM double* true 0.000 2.500 ... Finished Sourcing Tcl File [..../src/xdc/test_clk_after.tcl] После открываем Open synthesys и смотрим вывод в консоле (или запускаем там же test_clocks "Open ...") если не поверим своим глазам с первого раза: Spoiler test_clock "Open synthesys ..." >> Open synthesys ... >> Clock: clk_fpga_0 ... Property Type Read-only Value CLASS string true clock FILE_NAME string true .../zynq7_sys_processing_system7_0_0.xdc INPUT_JITTER double true 0.300 IS_GENERATED bool true 0 IS_PROPAGATED bool true 1 IS_USER_GENERATED bool true 0 IS_VIRTUAL bool true 0 LINE_NUMBER int true 23 NAME string true clk_fpga_0 PERIOD double true 10.000 SOURCE_PINS string* true i_zynq_sys/processing_system7_0/inst/PS7_i/FCLKCLK[0] SYSTEM_JITTER double true 0.050 WAVEFORM double* true 0.000 5. >> Clock: clk_fpga_1 ... Property Type Read-only Value CLASS string true clock FILE_NAME string true .../zynq7_sys_processing_system7_0_0.xdc INPUT_JITTER double true 0.150 IS_GENERATED bool true 0 IS_PROPAGATED bool true 1 IS_USER_GENERATED bool true 0 IS_VIRTUAL bool true 0 LINE_NUMBER int true 20 NAME string true clk_fpga_1 PERIOD double true 5.000 SOURCE_PINS string* true i_zynq_sys/processing_system7_0/inst/PS7_i/FCLKCLK[1] SYSTEM_JITTER double true 0.050 WAVEFORM double* true 0.000 2.500 Обратите внимание на то что при синтезе и при Open synthesys разные исходные файлы констрейнов для задания клоков - и соответственно имена тоже. Оба фала присутствуют в списке фалов для синтеза но парсится при синтезе только system7_0_0_in_context.xdc. Могу предположить что так как IP ядро синтезируется отдельно (в режиме out of context) то при последующем синтезе всего проекта используется только .xdc который при этом использовался и сохранен в .dcp корки. А вот при создании полного нетлиста уже используется нормальный zynq7_sys_processing_system7_0_0.xdc Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Avex 1 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба Любопытно. С точки зрения построения клокового дерева, его вершина не может висеть в воздухе. Поэтому если смотреть хелп на sdc команду create_clock , то надо указывать реальный пин селла (к примеру, выход флопа) или макроблока (к примеру, выход pll), или же реальный входной пад. Но поскольку тулы часто делают поблажки разработчикам, то во многих тулах можно указать в качестве источника клока и просто иерархический пин в RTL, а тул уже сам пропагирует цепь вверх и найдет реальную вершину дерева. Но в данном случае имеем, что тул не просто пропагирует цепь в поисках рут-пина, но еще и переименовывает название клока. Выглядит дико, но похоже это корень проблемы у топикстартера. И как по мне, это баг тула. Не должен клок переименовываться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба Приветствую! 19 minutes ago, Aleх said: Любопытно. С точки зрения построения клокового дерева, его вершина не может висеть в воздухе. В полном нетлисте конечно - но для синтеза отдельных модулей достаточно считать какую-то точку (даже виртеальную) как референс 19 minutes ago, Aleх said: Но в данном случае имеем, что тул не просто пропагирует цепь в поисках рут-пина, но еще и переименовывает название клока. Нет - переименовывает не Vivado, а разработчик IP Zynq который в двух файлах констрейнов - для OOC синтеза и для P&R задавал разные имена клоков. ### .dcp - zynq_sys_processing_system7_0_0_in_context.xdc create_clock -period 10.000 [get_ports -no_traverse FCLK_CLK0] create_clock -period 5.000 [get_ports -no_traverse FCLK_CLK1] ### zynq_sys_processing_system7_0_0.xdc create_clock -name clk_fpga_1 -period "5" [get_pins "PS7_i/FCLKCLK[1]"] set_input_jitter clk_fpga_1 0.15 #The clocks are asynchronous, user should constrain them appropriately.# create_clock -name clk_fpga_0 -period "10" [get_pins "PS7_i/FCLKCLK[0]"] set_input_jitter clk_fpga_0 0.3 19 minutes ago, Aleх said: И как по мне, это баг тула. Не должен клок переименовываться. Как мне кажется в самом переименование ничего плохого нет - даже наоборот иногда достает использовать каждый раз десятиэтажный мат имя клока который tool автоматом сгенерировал. Удачи! Rob Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 24 июня, 2020 Опубликовано 24 июня, 2020 · Жалоба Приветствую! 45 minutes ago, RobFPGA said: Нет - переименовывает не Vivado, а разработчик IP Zynq который в двух файлах констрейнов - для OOC синтеза и для P&R задавал разные имена клоков. Даже не так - тут дело в идеологии при синтезе c модулями OOC, при этом нет полной иерархии проекта - то есть например i_zynq_sys/processing_system7_0/inst/PS7_i/FCLKCLK[0] при синтезе еще не виден так как часть .../inst/PS7_i/FCLKCLK[0] лежит внутри .dcp и будет доступна только в полном нетлисте. Соответственно чтобы избавится от раздражающих варнингов для TC можно посоветовать использовать многоэтажный мат плясать так сказать от печки - соответвующих пинов модулей в иерархии, доступных при синтезе. set_clock_groups -name all_async -asynchromous \ -group [get_clocks -include_generated_clocks -of [get_pins {i_zynq_sys/processing_system7_0/FCLKCLK0}] \ -group [get_clocks -include_generated_clocks clk51_25_in] Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Avex 1 25 июня, 2020 Опубликовано 25 июня, 2020 (изменено) · Жалоба Если клок формируетя внутри корки, это объясняет его кривое название: авторам требовалось придумать 100% уникальное имя, вот они и привязались к иерархическому пути. Вполне себе вариант, разве только еще слэши и скобки заменить на подчеркивания, но это дело вкуса. Как с этим поступать - опять же, дело вкуса. Я бы на месте ТС использовал названия клоков из корки (если это действительно тот самый кейс с коркой) один в один, чтобы не было двух, настолько разных, наборов констрейнтов, и как напоминание, откуда они выходят. Изменено 25 июня, 2020 пользователем Aleх Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться