Перейти к содержанию
    

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

В Ultrascale клоковое дерево строится по принципу ASIC, отдельные сегменты со своими BUFG  собираются (на этапе P&R) в сбалансированное дерево. Соответственно задержка через первичный BUFG разная для разной сборки и заполнения проекта.  

Можно попробовать зафиксировать вручную положение BUFG, или запаралелить BUFG с (* keep *)  опцией  (хотя XIlinx и не рекомендует это). Сделать этакий regional clock. 

Удачи! Rob.   

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

4 minutes ago, doom13 said:

Это объяснение разного результата на последних двух скринах?

Вроде как да -  посмотрите у вас первичный BUFG  CLOCK_ROOT в разной позиции. 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, RobFPGA said:

первичный BUFG  CLOCK_ROOT в разной позиции.  

Выделено красной рамкой на скринах? Вот как его заставить разместить на X1Y2, начинает только ругаться.

Я хотел сделать, чтоб в тестовом проекте развело всё в соответствии с основным, но Вивадо сопротивляется.

17 minutes ago, RobFPGA said:

 

Что скажете по поводу задачи, которую пытаюсь решить? Взможно ли тут как-то исправить ситуацию или поможет только HP банк?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В примере 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 ???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Это задержка прохождения сигнала по плате.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, EgorT said:

Это задержка прохождения сигнала по плате.

Откуда min/max?

Длина дорожки постоянна!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, doom13 said:

Откуда min/max?

Длина дорожки постоянна!

а между разными платами? считается то на наихудший случай

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Могу ли пренебречь (считать за 0.000), если линии клока и данных на плате выровнены?

1 minute ago, des00 said:

а между разными платами? считается то на наихудший случай

Так трассировка одинакова, откуда различия?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, doom13 said:

Могу ли пренебречь (считать за 0.000), если линии клока и данных на плате выровнены?

Так трассировка одинакова, откуда различия?

пренебречь можно, так и сделано в вашем примере. трассировка да, а травление может давать разную погонную емкость, т.к. ширина плавает, сам диэлектрик может немного отличаться у разных производителей. 

А по вашей проблеме, без задержек в портах плохо будет. в лоб задачу не решить, надо другие варианты смотреть, возможно собирать шину с применением асинхроннщины

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, des00 said:

А по вашей проблеме, без задержек в портах плохо будет. в лоб задачу не решить, надо другие варианты смотреть, возможно собирать шину с применением асинхроннщины

Спасибо. Сэкономили на FPGA, теперь ломаем голову, как исправить. Смотрю, что большая по ресурсам в том же корпусе позволит решить проблему малой кровью (появляется дополнительный HP банк рядом с HD банком, на котором уже висит Ethernet).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу прокомментировать, правильно ли определяю выходные задержки для 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:

 

Screenshot from 2019-11-27 11-53-25.png

Правильно ли тут используется

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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В тексте не видно фальспассов...

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...