RobFPGA 33 26 ноября, 2019 Опубликовано 26 ноября, 2019 · Жалоба Приветствую! В Ultrascale клоковое дерево строится по принципу ASIC, отдельные сегменты со своими BUFG собираются (на этапе P&R) в сбалансированное дерево. Соответственно задержка через первичный BUFG разная для разной сборки и заполнения проекта. Можно попробовать зафиксировать вручную положение BUFG, или запаралелить BUFG с (* keep *) опцией (хотя XIlinx и не рекомендует это). Сделать этакий regional clock. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 26 ноября, 2019 Опубликовано 26 ноября, 2019 · Жалоба 9 minutes ago, RobFPGA said: В Ultrascale клоковое дерево строится по принципу ASIC, отдельные сегменты со своими BUFG собираются (на этапе P&R) в сбалансированное дерево. Соответственно задержка через первичный BUFG разная для разной сборки и заполнения проекта. Это объяснение разного результата на последних двух скринах? Правильно? Я пробовал заставить Vivado сделать всё одинаково, но он игнорит констрейны. Этот проходит (тут изначально кинуло на другой BUFGCE): set_property LOC BUFGCE_HDIO_X0Y6 [get_cells rgmii_adapter_inst/rgmii_rx_inst/BUFG_rgmii_rxc_0] А вот это не проходит set_property CLOCK_REGION X1Y2 [get_cells rgmii_adapter_inst/rgmii_rx_inst/BUFG_rgmii_rxc_0] тут пытался привязать X1Y3 (CLOCK_ROOT) net (fo=11, routed) 0.389 9.105 rgmii_adapter_inst/rgmii_rx_inst/gmii_rx_clk) чтоб сделало X1Y2 (CLOCK_ROOT) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 33 26 ноября, 2019 Опубликовано 26 ноября, 2019 · Жалоба Приветствую! 4 minutes ago, doom13 said: Это объяснение разного результата на последних двух скринах? Вроде как да - посмотрите у вас первичный BUFG CLOCK_ROOT в разной позиции. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 26 ноября, 2019 Опубликовано 26 ноября, 2019 · Жалоба 4 minutes ago, RobFPGA said: первичный BUFG CLOCK_ROOT в разной позиции. Выделено красной рамкой на скринах? Вот как его заставить разместить на X1Y2, начинает только ругаться. Я хотел сделать, чтоб в тестовом проекте развело всё в соответствии с основным, но Вивадо сопротивляется. 17 minutes ago, RobFPGA said: Что скажете по поводу задачи, которую пытаюсь решить? Взможно ли тут как-то исправить ситуацию или поможет только HP банк? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 26 ноября, 2019 Опубликовано 26 ноября, 2019 · Жалоба Тестовый проект под Vivado 2018.2 rgmii_v2.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба В примере Xilinx для описания output delay # Double Data Rate Source Synchronous Outputs # # Source synchronous output interfaces can be constrained either by the max data skew # relative to the generated clock or by the destination device setup/hold requirements. # # Setup/Hold Case: # Setup and hold requirements for the destination device and board trace delays are known. # # forwarded _________________________________ # clock __________| |______________ # | | # tsu_r | thd_r tsu_f | thd_f # <------>|<-------> <------>|<-----> # ________|_________ ________|_______ # data @ destination XXX__________________XXXXXXXXXXXXXXXX________________XXXXX # # Example of creating generated clock at clock output port # create_generated_clock -name <gen_clock_name> -multiply_by 1 -source [get_pins <source_pin>] [get_ports <output_clock_port>] # gen_clock_name is the name of forwarded clock here. It should be used below for defining "fwclk". set fwclk <clock-name>; # forwarded clock name (generated using create_generated_clock at output clock port) set tsu_r 0.000; # destination device setup time requirement for rising edge set thd_r 0.000; # destination device hold time requirement for rising edge set tsu_f 0.000; # destination device setup time requirement for falling edge set thd_f 0.000; # destination device hold time requirement for falling edge set trce_dly_max 0.000; # maximum board trace delay set trce_dly_min 0.000; # minimum board trace delay set output_ports <output_ports>; # list of output ports # Output Delay Constraints set_output_delay -clock $fwclk -max [expr $trce_dly_max + $tsu_r] [get_ports $output_ports]; set_output_delay -clock $fwclk -min [expr $trce_dly_min - $thd_r] [get_ports $output_ports]; set_output_delay -clock $fwclk -max [expr $trce_dly_max + $tsu_f] [get_ports $output_ports] -clock_fall -add_delay; set_output_delay -clock $fwclk -min [expr $trce_dly_min - $thd_f] [get_ports $output_ports] -clock_fall -add_delay; # Report Timing Template # report_timing -rise_to [get_ports $output_ports] -max_paths 20 -nworst 2 -delay_type min_max -name src_sync_ddr_out_rise -file src_sync_ddr_out_rise.txt; # report_timing -fall_to [get_ports $output_ports] -max_paths 20 -nworst 2 -delay_type min_max -name src_sync_ddr_out_fall -file src_sync_ddr_out_fall.txt; что такое trce_dly_max, trce_dly_min ??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EgorT 0 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба 28 minutes ago, doom13 said: set trce_dly_max 0.000; # maximum board trace delay set trce_dly_min 0.000; # minimum board trace delay Это задержка прохождения сигнала по плате. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба 7 minutes ago, EgorT said: Это задержка прохождения сигнала по плате. Откуда min/max? Длина дорожки постоянна! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба 3 minutes ago, doom13 said: Откуда min/max? Длина дорожки постоянна! а между разными платами? считается то на наихудший случай Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EgorT 0 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба 3 minutes ago, doom13 said: Откуда min/max? Длина дорожки постоянна! Вот есть такой же вопрос https://forums.xilinx.com/t5/Timing-Analysis/How-to-calculate-max-and-min-Data-delays-on-board-trace-delay-in/td-p/331227 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба Могу ли пренебречь (считать за 0.000), если линии клока и данных на плате выровнены? 1 minute ago, des00 said: а между разными платами? считается то на наихудший случай Так трассировка одинакова, откуда различия? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба 5 minutes ago, doom13 said: Могу ли пренебречь (считать за 0.000), если линии клока и данных на плате выровнены? Так трассировка одинакова, откуда различия? пренебречь можно, так и сделано в вашем примере. трассировка да, а травление может давать разную погонную емкость, т.к. ширина плавает, сам диэлектрик может немного отличаться у разных производителей. А по вашей проблеме, без задержек в портах плохо будет. в лоб задачу не решить, надо другие варианты смотреть, возможно собирать шину с применением асинхроннщины Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба 14 minutes ago, des00 said: А по вашей проблеме, без задержек в портах плохо будет. в лоб задачу не решить, надо другие варианты смотреть, возможно собирать шину с применением асинхроннщины Спасибо. Сэкономили на FPGA, теперь ломаем голову, как исправить. Смотрю, что большая по ресурсам в том же корпусе позволит решить проблему малой кровью (появляется дополнительный HP банк рядом с HD банком, на котором уже висит Ethernet). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба Прошу прокомментировать, правильно ли определяю выходные задержки для RGMII. тут удалось выполнить все ограничения накрутив фазу клока для MMCM): set_property PACKAGE_PIN H16 [get_ports LAN_RX_CTL] set_property PACKAGE_PIN G17 [get_ports LAN_RXC] set_property PACKAGE_PIN G16 [get_ports {LAN_RXD[0]}] set_property PACKAGE_PIN D17 [get_ports {LAN_RXD[1]}] set_property PACKAGE_PIN E16 [get_ports {LAN_RXD[2]}] set_property PACKAGE_PIN F17 [get_ports {LAN_RXD[3]}] set_property PACKAGE_PIN E17 [get_ports LAN_TX_CTL] set_property PACKAGE_PIN D16 [get_ports LAN_TXC] set_property PACKAGE_PIN C16 [get_ports {LAN_TXD[0]}] set_property PACKAGE_PIN B17 [get_ports {LAN_TXD[1]}] set_property PACKAGE_PIN B16 [get_ports {LAN_TXD[2]}] set_property PACKAGE_PIN A17 [get_ports {LAN_TXD[3]}] set_property IOSTANDARD LVCMOS25 [get_ports LAN_RX_CTL] set_property IOSTANDARD LVCMOS25 [get_ports LAN_RXC] set_property IOSTANDARD LVCMOS25 [get_ports {LAN_RXD[0]}] set_property IOSTANDARD LVCMOS25 [get_ports {LAN_RXD[1]}] set_property IOSTANDARD LVCMOS25 [get_ports {LAN_RXD[2]}] set_property IOSTANDARD LVCMOS25 [get_ports {LAN_RXD[3]}] set_property IOSTANDARD LVCMOS25 [get_ports LAN_TX_CTL] set_property IOSTANDARD LVCMOS25 [get_ports LAN_TXC] set_property IOSTANDARD LVCMOS25 [get_ports {LAN_TXD[0]}] set_property IOSTANDARD LVCMOS25 [get_ports {LAN_TXD[1]}] set_property IOSTANDARD LVCMOS25 [get_ports {LAN_TXD[2]}] set_property IOSTANDARD LVCMOS25 [get_ports {LAN_TXD[3]}] set_property PACKAGE_PIN F14 [get_ports FPGA_CLK_50M] set_property IOSTANDARD LVCMOS33 [get_ports FPGA_CLK_50M] create_clock -period 20.000 -name FPGA_CLK_50M -waveform {0.000 10.000} [get_ports FPGA_CLK_50M] create_clock -period 8.000 -name LAN_RXC -waveform {0.000 4.000} [get_ports LAN_RXC] set_clock_groups -asynchronous -group {FPGA_CLK_50M} -group {LAN_RXC} # RGMII output delay # For this constraint set PHY register 20.1 to 0 in software driver # # Double Data Rate Source Synchronous Outputs # # Source synchronous output interfaces can be constrained either by the max data skew # relative to the generated clock or by the destination device setup/hold requirements. # # Setup/Hold Case: # Setup and hold requirements for the destination device and board trace delays are known. # # forwarded _________________________________ # clock __________| |______________ # | | # tsu_r | thd_r tsu_f | thd_f # <------>|<-------> <------>|<-----> # ________|_________ ________|_______ # data @ destination XXX__________________XXXXXXXXXXXXXXXX________________XXXXX # # Example of creating generated clock at clock output port create_generated_clock -name LAN_TXC -multiply_by 1 -source [get_pins mmcm_1_inst/inst/clk_out5] [get_ports LAN_TXC] # gen_clock_name is the name of forwarded clock here. It should be used below for defining "fwclk". set fwclk LAN_TXC; # forwarded clock name (generated using create_generated_clock at output clock port) set tsu_r 1.000; # destination device setup time requirement for rising edge set thd_r 0.800; # destination device hold time requirement for rising edge set tsu_f 1.000; # destination device setup time requirement for falling edge set thd_f 0.800; # destination device hold time requirement for falling edge set trce_dly_max 0.000; # maximum board trace delay set trce_dly_min 0.000; # minimum board trace delay set output_ports [list LAN_TX_CTL {LAN_TXD[0]} {LAN_TXD[1]} {LAN_TXD[2]} {LAN_TXD[3]}]; # list of output ports # Output Delay Constraints set_output_delay -clock $fwclk -max [expr $trce_dly_max + $tsu_r] [get_ports $output_ports]; set_output_delay -clock $fwclk -min [expr $trce_dly_min - $thd_r] [get_ports $output_ports]; set_output_delay -clock $fwclk -max [expr $trce_dly_max + $tsu_f] [get_ports $output_ports] -clock_fall -add_delay; set_output_delay -clock $fwclk -min [expr $trce_dly_min - $thd_f] [get_ports $output_ports] -clock_fall -add_delay; Из доки на PHY: Правильно ли тут используется create_generated_clock -name LAN_TXC -multiply_by 1 -source [get_pins mmcm_1_inst/inst/clk_out5] [get_ports LAN_TXC] Т.к. вообще сам клок LAN_TXC берётся с ODDRE1 (пин mmcm_1_inst/inst/clk_out5 идёт на ODDRE1/С где ODDRE1/D1 == 1 и ODDRE1/D2 == 0)? Сам тестовый проект (тут с описакнием выходных задержек) под Vivado 2018.2: rgmii_v2.zip Каким образом ODDRE1 преобразовался в OSERDESE3? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба В тексте не видно фальспассов... set_false_path -fall_from [get_clocks rx_clock] -rise_to clk275 -setup set_false_path -rise_from [get_clocks rx_clock] -fall_to clk275 -setup set_false_path -fall_from [get_clocks rx_clock] -fall_to clk275 -hold set_false_path -rise_from [get_clocks rx_clock] -rise_to clk275 -hold Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться