Nick_K 0 3 сентября, 2019 Опубликовано 3 сентября, 2019 · Жалоба Доброго времени суток. Итак за пол года изучения Vivado/SystemVerilog добрался вуршины ещё одного холма. В проекте стоит задача передать параметр конфигурации из Block Design в tcl скрипт, который формирует placement констрейны. Ниже скидываю пример тестового проекта. В данном примере для корректной работы нужно прокинуть в папку ip_repo/CSA_1.0 ссылку на sources из корня с именем src иначе ip ядро может не собираться и дико глючить (на линукс машинах уже всё готово). Собственно проблема в том, что я конфигурирую в BD параметр Integer_Resolution компонента CSA (carry save adder), который формирует разное количество триггеров. Дялее мне нужно разложить эти триггеры по плате в конкретной последовательности, для чего в констрейнах прописан скрипт floorplanning.tcl. Вся проблема заключается в автоматической передаче значения Integer_Resolution в переменную component_num в скрипте. Сейчас приходится всё прописывать руками. Возможно ли это сделать в автоматическом режиме? p.s. Любые замечания по проекту также приветствуются, которые позволят оптимизировать/улучшить компоненты или в целом. test_proj.tar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 3 сентября, 2019 Опубликовано 3 сентября, 2019 · Жалоба Приветствую! Уж если делаете IP компонент то делайте его так, чтобы перенести его можно было простым копирование папки IP без плясок с link за пределы оной. Ну а текущие параметры конфигурации корки для применения констрейнов P&R можно взять в скрипте floorplanning прямо из корки set parameter_val [get_property core_parameter_name [get_cells core/instance/path/inst]] Или напрямую посчитав нужные регистры - а вдруг там чего нехватает или лишние добавились после синтеза set reg_num [llength [get_cells -hier -filter {NAME =~ core/instance/path/inst/register_name_reg* && PRIMITIVE_TYPE =~ REGISTER.*.*}]] Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 3 сентября, 2019 Опубликовано 3 сентября, 2019 · Жалоба 41 minutes ago, RobFPGA said: Уж если делаете IP компонент то делайте его так, чтобы перенести его можно было простым копирование папки IP без плясок с link за пределы оной. А как так сделать? Я просто хочу, чтобы все исходники лежали в одном месте, но если делать IPи создавать относительные пути к файлам, тогда будет беда. С каждой пересборкой оно постоянно норовит то удалить их, то продублировать 2 раза. 42 minutes ago, RobFPGA said: set parameter_val [get_property core_parameter_name [get_cells core/instance/path/inst]] За это спасибо! Огромное! Ходил же вокруг да около, вот прям одного get_property не хватило. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 3 сентября, 2019 Опубликовано 3 сентября, 2019 · Жалоба Приветствую! 46 minutes ago, Nick_K said: А как так сделать? Я просто хочу, чтобы все исходники лежали в одном месте, но если делать IPи создавать относительные пути к файлам, тогда будет беда. С каждой пересборкой оно постоянно норовит то удалить их, то продублировать 2 раза. Что так сделать ??? IP компонент это именно компонент - автономный кусок кода (сорцы, constraints, скрипты, ...) для использования по возможности в РАЗНЫХ проектах. Успехов! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 4 сентября, 2019 Опубликовано 4 сентября, 2019 · Жалоба 17 hours ago, RobFPGA said: IP компонент это именно компонент - автономный кусок кода (сорцы, constraints, скрипты, ...) для использования по возможности в РАЗНЫХ проектах. Спасибо. Вроде бы решение и очевидное, но не хотел его признавать. Вопрос тогда такой. Если я запихну констрейны, а конкретно вышеизложенную проблему, в IP ядро, тогда как описывать все пути? Так чтобы внутри компонента полностью проходил синтез и сборка компонента или придётся указывать по отношению к верхнему компоненту, в котором используется IP (нелогично немного). Я бы проверил и так и сяк, но увы нет времени (и другое задание подвалило). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 4 сентября, 2019 Опубликовано 4 сентября, 2019 · Жалоба И в догонку, если описывать все констрейны в IP, то как прикрутить временные? Ибо IP не знает на какой частоте будет работать, а возможно это не одна частота а реконфигурируемая (между разными проектами). Как тогда быть? При условии, конечно, что частоты известны и их зависимости тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 4 сентября, 2019 Опубликовано 4 сентября, 2019 · Жалоба Приветствую! Вы можете привязать constraints к инстансу IP корки при паковке оной set_property SCOPED_TO_REF core_name [get_files ..../ip_repo/core_name/src/core_constrain.xdc] ну а в самом constraint взять актуальные времянки текущего проекта, где корка используется # core_constrain.xdc set wr_clock [get_clocks -of_objects [get_pins {g_*_rst.gr_w_reg[0]/C}]] set rd_clock [get_clocks -of_objects [get_pins {g_*_rst.gr_r_reg[0]/C}]] set wr_clk_period [get_property -min PERIOD $wr_clock] set rd_clk_period [get_property -min PERIOD $rd_clock] # Get minimum period of write or read clock set min_period [expr {(($wr_clk_period < $rd_clk_period) ? $wr_clk_period : $rd_clk_period)}] set skew_value [expr {$min_period * 0.8}] # Set max delay on cross clock domain path set_max_delay -from [get_cells g_*_rst.gr_w_reg[*]] -to [get_cells g_*_rst.gr_r_reg[*]] -datapath_only $min_period set_bus_skew -from [get_cells g_*_rst.gr_w_reg[*]] -to [get_cells g_*_rst.gr_r_reg[*]] $skew_value Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 6 сентября, 2019 Опубликовано 6 сентября, 2019 · Жалоба On 9/3/2019 at 4:01 PM, RobFPGA said: Ну а текущие параметры конфигурации корки для применения констрейнов P&R можно взять в скрипте floorplanning прямо из корки Увы не работает. В приведённом примере после синтеза (при открытом синтезированнном проекте) пропадают все проперти. То же самое и в случае Элаборейтед проекта. Один из вариантов: получить параметр с BD, но тогда возникает необходимость открыть сам BD проект и не в автоматическом режиме (чётко прописан путь к BD и название проекта). То что у меня получилось: # set component_num 16 open_bd_design {/home/nick_k/Work/Projects/Vivado/test_proj/ip_repo/design_1/design_1.bd} #тут, увы, автоматизации нет set component_num [get_property CONFIG.p_int_res [get_bd_cells CSA_0]] for {set num 0} {$num < $component_num} {incr num} { startgroup create_pblock "pblock_sync_rst.s_cs_cnt_rg[$num]" resize_pblock "pblock_sync_rst.s_cs_cnt_rg[$num]" -add SLICE_X0Y${num}:SLICE_X1Y${num} add_cells_to_pblock "pblock_sync_rst.s_cs_cnt_rg[$num]" [get_cells [list "design_1_i/CSA_0/inst/sync_reset.s_csa_count_reg[$num]"]] -clear_locs endgroup } close_bd_design [get_bd_designs design_1] А посчитать компоненты - не вариант, так как это лишь пример и оперировать приходится намного бОльшими блоками с регистрами/комбинаторикой различной длинны. Плюс будет неочевидным, почему плейсмент зависит именно от количества регистров СE, а не в целом. Хотя возможно можно посчитать отдельно блоки как-то. UPD Сообразил как посчитать нужные компоненты после синтеза. Блок как полагается гибкий в настройке и портируемый. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 6 сентября, 2019 Опубликовано 6 сентября, 2019 · Жалоба Приветствую! 34 minutes ago, Nick_K said: В приведённом примере после синтеза (при открытом синтезированнном проекте) пропадают все проперти. Увы это скорее всего глюк Vivado. То сохраняет в property параметры синтеза то нет . Надо будет по исследовать это. 40 minutes ago, Nick_K said: Один из вариантов: получить параметр с BD, но тогда возникает необходимость открыть сам BD проект и не в автоматическом режиме (чётко прописан путь к BD и название проекта). Лазить в BD на этапе P&R это просто кю какое-то - ну хотя бы потому что вы можете делать P&R совсем на другой машине на которой и BD то не будет - только netlist для P&R. Так что никаких обходных путей для героев - придется считать примитивы напрямую. Успехов! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 6 сентября, 2019 Опубликовано 6 сентября, 2019 · Жалоба 2 minutes ago, RobFPGA said: Лазить в BD на этапе P&R это просто кю какое-то - ну хотя бы потому что вы можете делать P&R совсем на другой машине на которой и BD то не будет - только netlist для P&R. Именно поэтому я и морочу голову вторую неделю. Чтобы проект был удобочитаемым, гибким и кроссплатформенным. Хотя с последним тоже няпряжёнка. Вот пересоздаст кто-то Блок Дизайн под другим именем и хана - пиши сначала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 6 сентября, 2019 Опубликовано 6 сентября, 2019 · Жалоба Приветствую! 27 minutes ago, Nick_K said: Вот пересоздаст кто-то Блок Дизайн под другим именем и хана - пиши сначала. Пиши что? Когда вы привязываете constraints файл в корке к REF_NAME ( set_property SCOPED_TO_REF ...) то Vivado автоматом потом находит все истансы этой корки и к каждой применяет constraint этого файла. И это в любом проекте. И не надо никаких глобальных иерархических путей. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 6 сентября, 2019 Опубликовано 6 сентября, 2019 · Жалоба 5 minutes ago, RobFPGA said: Когда вы привязываете constraints файл в корке к REF_NAME ( set_property SCOPED_TO_REF ...) то Vivado автоматом потом находит все истансы этой корки и к каждой применяет constraint этого файла. А ну если так, тогда да. У меня просто руки ещё не дошли до "упрятывания" констрейнов в IP. Вернее я собрал саму корку и констрейны там нормально стали, но при экспорте они куда-то пропали. Позже может разберусь. А возможно там просто нужно сделать пакед IP и не будет проблем. Опять же, есть более насущный вопрос, но к этой теме я вернусь ещё) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 18 сентября, 2019 Опубликовано 18 сентября, 2019 · Жалоба On 9/4/2019 at 10:53 AM, RobFPGA said: Вы можете привязать constraints к инстансу IP корки при паковке оной set_property SCOPED_TO_REF core_name [get_files ..../ip_repo/core_name/src/core_constrain.xdc] Наконец-то дошли руки до упаковки констрейнов в IP блок. *.xdc файлы подтягивает хорошо, но вот всё что для констрейнов в *.tcl скриптах не экспортирует втупую. А при переоткрывании проекта все скрипты исчезают или перемещаются в папку TCL в разделе сорцов. Пробовал прятать в папку Utility XIT/TTCL - но помогло. Сложный способ с установкой в настройках синтеза tcl.pre/tcl.post тоже не дал результата (ссылка на всякий случай). Возможно ли без избыточного геморроя упаковать 2 констрейн tcl файла в кастомное IP? И вопрос не совсем в тему: как правильно(!) добавить в то же IP ядро скрипт для предварительной разводки пары путей (set preRoute [get_nets ...] / route_design -nets [get_nets $preRoute] -delay / route_design -preserve) так, чтобы основной проект не матюкался (обычна куча критических варнингов вылазит если юзать в основном проекте) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 18 сентября, 2019 Опубликовано 18 сентября, 2019 · Жалоба Приветствую! On 9/18/2019 at 11:33 AM, Nick_K said: но вот всё что для констрейнов в *.tcl скриптах не экспортирует втупую Это проблемы авто пакера. Ну не знает он еще что .tcl тоже могут быть констрэйнами - надо ручками в ip добавлять и править property USED_IN и SCOPED_TO_REF для .tcl фалов. add_files -fileset constrs_1 -norecurse ".../ip_repo/test_ip/src/test_ip.tcl" set_property USED_IN_SYNTHESIS 0 [get_files "test_ip.tcl"] set_property USED_IN_IMPLEMENTATION 1 [get_files "test_ip.tcl"] set_property USED_IN_SIMULATION 0 [get_files "test_ip.tcl"] При этом если сделаете merge_project_changes после этого то test_ip.tcl попадает в группу файлов Advanced/Implementation, а не в Standard/Synthesys как обычно (так как галка USED_IN_SYNTHESIS снята). Но и это еще не все глюки - после этого надо еще раз уставить правильные значения USED_IN и SCOPED_TO_REF уже для файла в группе Advanced/Implementation - set group_obj [ipx::get_file_groups xilinx_implementation -of_objects [ipx::current_core]] set_property USED_IN {implementation} [ipx::get_files "test_ip.tcl" -of_objects $group_obj] set_property SCOPED_TO_REF test_ip [ipx::get_files "test_ip.tcl" -of_objects $group_obj] И после этого будет у вас при P&R такая картинка Spoiler ### test_ip.tcl send_msg_id {USER 00-000} "INFO" ">> test_ip.tcl: Instance: [current_instance -quiet .]" proc ct_test_ip {} { set cells [get_cells {del_reg[*]}] puts ">> ct_test_ip: Instance: [current_instance -quiet .]" foreach cell $cells { puts ">> ct_test_ip: Instance: cell:${cell}" } } ct_test_ip ### .... Parsing XDC File [.../sources_1/bd/design_1/ip/design_1_test_ip_0_0/src/test_ip.xdc] for cell 'design_1_i/test_ip_0/inst' Finished Parsing XDC File [.../sources_1/bd/design_1/ip/design_1_test_ip_0_0/src/test_ip.xdc] for cell 'design_1_i/test_ip_0/inst' Parsing XDC File [.../sources_1/bd/design_1/ip/design_1_test_ip_0_1/src/test_ip.xdc] for cell 'design_1_i/test_ip_1/inst' Finished Parsing XDC File [.../sources_1/bd/design_1/ip/design_1_test_ip_0_1/src/test_ip.xdc] for cell 'design_1_i/test_ip_1/inst' Sourcing Tcl File [.../sources_1/bd/design_1/ip/design_1_test_ip_0_0/src/test_ip.tcl] for cell 'design_1_i/test_ip_0/inst' INFO: [USER 00-0] >> test_ip.tcl: Instance: design_1_i/test_ip_0/inst [.../sources_1/bd/design_1/ip/design_1_test_ip_0_0/src/test_ip.tcl:2] >> ct_test_ip: Instance: design_1_i/test_ip_0/inst >> ct_test_ip: Instance: cell:design_1_i/test_ip_0/inst/del_reg[1] >> ct_test_ip: Instance: cell:design_1_i/test_ip_0/inst/del_reg[2] >> ct_test_ip: Instance: cell:design_1_i/test_ip_0/inst/del_reg[3] >> ct_test_ip: Instance: cell:design_1_i/test_ip_0/inst/del_reg[4] Finished Sourcing Tcl File [.../sources_1/bd/design_1/ip/design_1_test_ip_0_0/src/test_ip.tcl] for cell 'design_1_i/test_ip_0/inst' Sourcing Tcl File [.../sources_1/bd/design_1/ip/design_1_test_ip_0_1/src/test_ip.tcl] for cell 'design_1_i/test_ip_1/inst' INFO: [USER 00-0] >> test_ip.tcl: Instance: design_1_i/test_ip_1/inst [.../sources_1/bd/design_1/ip/design_1_test_ip_0_0/src/test_ip.tcl:2] >> ct_test_ip: Instance: design_1_i/test_ip_1/inst >> ct_test_ip: Instance: cell:design_1_i/test_ip_1/inst/del_reg[1] >> ct_test_ip: Instance: cell:design_1_i/test_ip_1/inst/del_reg[2] >> ct_test_ip: Instance: cell:design_1_i/test_ip_1/inst/del_reg[3] Finished Sourcing Tcl File [.../sources_1/bd/design_1/ip/design_1_test_ip_0_0/src/test_ip.tcl] for cell 'design_1_i/test_ip_1/inst' И да - для set_property USED_IN {...} файла можно поставить кучу других этапов "..., opt_design, opt_design_post, phys_opt_design, ...." и соответственно ожидать применение этого файла констрэйнов только на соответствующих этапах. Но я такого еще не пробовал. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться