Приветствую!
Цитата(alexadmin @ Apr 9 2018, 11:03)
![*](style_images/1/post_snapback.gif)
Есть два прикола:
Это всего лишь особенности TCL ...
Цитата(alexadmin @ Apr 9 2018, 11:03)
![*](style_images/1/post_snapback.gif)
Если в XDC в конце строки стоит символ комментария (#), то вся такая строка считается закомментированной. Не скажу за последние версии, но на предыдущих версиях было.
Ставте
; перед
# и будет Вам комент как надо.Цитата(alexadmin @ Apr 9 2018, 11:03)
![*](style_images/1/post_snapback.gif)
Если какие-нибудь пины назначены внутри IP-блоков и они конфликтуют с вашими назначениями, то приоритет у IP, а ваши окажутся неназначенными.
В Vivado есть иерархия применения constrain - кто
последний того и тапки (в отличии от классического варианта).
То есть Вы можете переназначить любой уже заданный параметр если зададите его в xdc или tcl который применяется после того файла в котором сидит не нравящийся Вам constrain.
Иногда можно просто переназначив нужный constrain, иногда предварительно удалив старый и потом уже назначив новый.
Сейчас (в отличии от старых версий) в файлах constaint поддерживался весь TCL поэтому можно например так извращается
Код
mgt_pin.tcl
### MGT pins
# 3..0
if {[llength [get_ports -quiet {dp_c2m_p}]] >= 4} {
set_property PACKAGE_PIN J5 [get_ports {dp_c2m_n[0]} ]; # C3
...
set_property PACKAGE_PIN N6 [get_ports {dp_c2m_p[3]} ]; # A30
}
# 7..4
if {[llength [get_ports -quiet {dp_c2m_p}]] >= 8} {
set_property PACKAGE_PIN V3 [get_ports {dp_c2m_n[4]} ]; # A35
...
set_property PACKAGE_PIN R6 [get_ports {dp_c2m_p[7]} ]; # B32
}
reassign_pcie.tcl
#
reset_property LOC [get_cells -hierarchical \
-filter {NAME =~ *gen_channel_container[*].*gen_gthe3_channel_inst[*].GTHE3_CHANNEL_PRIM_INST}]
set_property LOC GTHE3_CHANNEL_X0Y7 [get_cells -hierarchical \
-filter {NAME =~ *gen_channel_container[0].*gen_gthe3_channel_inst[0].GTHE3_CHANNEL_PRIM_INST}]
...
set_property LOC GTHE3_CHANNEL_X0Y0 [get_cells -hierarchical \
-filter {NAME =~ *gen_channel_container[1].*gen_gthe3_channel_inst[3].GTHE3_CHANNEL_PRIM_INST}]
В первом файле автоматом назначает пины для MGT в зависимости от ширины шины в исходнике.
Во втором - отменяет назначение позиций MGT заданное в корке и назначает свои.
Можно наворотить даже целые функции корректируя нетлист после синтеза.
Код
## replace BUFG clock buffers to BUFH for DDR controllert C0,C1,C2,C3
for {set i 0} {$i < 4} {incr i} {
set parent "i_pcie_sys/i_ddr_ctrl/inst/mig_7series_0/u_ddr_ctrl_st_mig_7series_0_1_mig/c${i}_u_ddr3_infrastructure"
puts "BUFG -> BUFH: ${parent}/u_bufg_clkdiv0"
puts "BUFG -> BUFH: ${parent}/gen_mmcm.u_bufg_mmcm_ps_clk"
replace_buf ${parent} "u_bufg_clkdiv0" "BUFG" "BUFH" "clkdiv0_bufh"
replace_buf ${parent} "gen_mmcm.u_bufg_mmcm_ps_clk" "BUFG" "BUFH" "mmcm_ps_bufh"
}
![wacko.gif](style_emoticons/default/wacko.gif)
где
replace_buf это самописная функци которая грузится в "сервисном" файле constrain
Порядок применения xdc/tcl зависит от порядка включения в проект или от назначенного данному файлу приоритета.
Удачи! Rob.