Jump to content

    

Передача Parameter из BD в констрейн файл

Доброго времени суток.

Итак за пол года изучения 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

Share this post


Link to post
Share on other sites

Приветствую!

Уж если делаете 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.

Share this post


Link to post
Share on other sites
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 не хватило.

Share this post


Link to post
Share on other sites

Приветствую!

46 minutes ago, Nick_K said:

А как так сделать? Я просто хочу, чтобы все исходники лежали в одном месте, но если делать IPи создавать относительные пути к файлам, тогда будет беда. С каждой пересборкой оно постоянно норовит то удалить их, то продублировать 2 раза.

Что так сделать ???

IP компонент это именно компонент -  автономный кусок кода (сорцы, constraints, скрипты, ...) для использования по возможности в РАЗНЫХ проектах.

Успехов! Rob.

Share this post


Link to post
Share on other sites
17 hours ago, RobFPGA said:

IP компонент это именно компонент -  автономный кусок кода (сорцы, constraints, скрипты, ...) для использования по возможности в РАЗНЫХ проектах.

Спасибо. Вроде бы решение и очевидное, но не хотел его признавать.

Вопрос тогда такой. Если я запихну констрейны, а конкретно вышеизложенную проблему, в IP ядро, тогда как описывать все пути? Так чтобы внутри компонента полностью проходил синтез и сборка компонента или придётся указывать по отношению к верхнему компоненту, в котором используется IP (нелогично немного).

Я бы проверил и так и сяк, но увы нет времени (и другое задание подвалило).

Share this post


Link to post
Share on other sites

И в догонку, если описывать все констрейны в IP, то как прикрутить временные? Ибо IP не знает на какой частоте будет работать, а возможно это не одна частота а реконфигурируемая (между разными проектами). Как тогда быть? При условии, конечно, что частоты известны и их зависимости тоже.

Share this post


Link to post
Share on other sites

Приветствую!

Вы можете привязать 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.

Share this post


Link to post
Share on other sites
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 Сообразил как посчитать нужные компоненты после синтеза. Блок как полагается гибкий в настройке и портируемый.

Share this post


Link to post
Share on other sites

Приветствую!

34 minutes ago, Nick_K said:

В приведённом примере после синтеза (при открытом синтезированнном проекте) пропадают все проперти.

Увы это  скорее всего глюк Vivado. То сохраняет в property параметры синтеза  то нет  :wacko:. Надо будет по исследовать это.

40 minutes ago, Nick_K said:

Один из вариантов: получить параметр с BD, но тогда возникает необходимость открыть сам BD проект и не в автоматическом режиме (чётко прописан путь к BD и название проекта).

Лазить в BD на этапе P&R  это просто кю какое-то :mega_shok: - ну хотя бы потому что вы можете делать P&R совсем на другой машине на которой и BD то не будет - только netlist для P&R. 

Так что никаких обходных путей для героев :dance2: - придется считать примитивы напрямую.

Успехов! Rob.

Share this post


Link to post
Share on other sites
2 minutes ago, RobFPGA said:

Лазить в BD на этапе P&R  это просто кю какое-то :mega_shok: - ну хотя бы потому что вы можете делать P&R совсем на другой машине на которой и BD то не будет - только netlist для P&R.

Именно поэтому я и морочу голову вторую неделю. Чтобы проект был удобочитаемым, гибким и кроссплатформенным. Хотя с последним тоже няпряжёнка. Вот пересоздаст кто-то Блок Дизайн под другим именем и хана - пиши сначала.

Share this post


Link to post
Share on other sites

Приветствую!

27 minutes ago, Nick_K said:

Вот пересоздаст кто-то Блок Дизайн под другим именем и хана - пиши сначала.

Пиши что?  Когда вы привязываете constraints файл в корке к REF_NAME ( set_property SCOPED_TO_REF ...) то Vivado автоматом потом находит все истансы этой корки  и к каждой применяет constraint этого файла.  И это в любом проекте. И не надо никаких глобальных иерархических путей. 

Удачи! Rob.

 

Share this post


Link to post
Share on other sites
5 minutes ago, RobFPGA said:

Когда вы привязываете constraints файл в корке к REF_NAME ( set_property SCOPED_TO_REF ...) то Vivado автоматом потом находит все истансы этой корки  и к каждой применяет constraint этого файла.

А ну если так, тогда да. У меня просто руки ещё не дошли до "упрятывания" констрейнов в IP. Вернее я собрал саму корку и констрейны там нормально стали, но при экспорте они куда-то пропали. Позже может разберусь. А возможно там просто нужно сделать пакед IP и не будет проблем. Опять же, есть более насущный вопрос, но к этой теме я вернусь ещё)

Share this post


Link to post
Share on other sites
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) так, чтобы основной проект не матюкался (обычна куча критических варнингов вылазит если юзать в основном проекте)

Share this post


Link to post
Share on other sites

Приветствую!

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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this