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

3 minutes ago, Nick_K said:

А пардон, я тогда недопонял проблему. Но в любом случае можно посмотреть констрейны, когда была PLL. Возможно там указаны какие-то значения, которые позволят улучшить проект без оного (PLL).

Вся проблема описана в первом посте. Она собственно и остаётся.

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


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

Кстати один из известных мне вариантов - попробовать развести сначала критические пути, а потом остальной проект. Ну или вручную на крайняк

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


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

On 11/18/2019 at 9:19 AM, doom13 said:

Т.к. PHY прикручен к HD банку. AXI Ethernet пришлось немного подправить и сделать внешний преобразователь GMII в RGMII.

А зачем его делать самому, если есть готовый: GMII to RGMII ?

Там и constraints готовые есть на стр. 39-41.

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


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

36 minutes ago, blackfin said:

А зачем его делать самому, если есть готовый: GMII to RGMII ?

Он не доступен для моего девайса

Screenshot from 2019-11-21 11-40-00.png

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


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

16 minutes ago, doom13 said:

Он не доступен для моего девайса

Да, похоже, что так.

Тогда можно взять только constraints из PG160..

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


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

31 minutes ago, blackfin said:

Тогда можно взять только constraints из PG160..

Хотелось бы разобраться, что может быть неверно из того что есть (оно то из экзампла Xilinx взято).

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


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

Вернул всё к исходному состоянию (выкинул из проекта ILA и развелось немного в другом виде), но собралось с работающим приёмником пакетов.
Для приёмной части RGMII описано следующее (взято из Templates Vivado):

set_property PACKAGE_PIN G17 [get_ports LAN_RXC]
set_property PACKAGE_PIN H16 [get_ports LAN_RX_CTL]
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 IOSTANDARD LVCMOS25 [get_ports LAN_RXC]
set_property IOSTANDARD LVCMOS25 [get_ports LAN_RX_CTL]
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]}]

create_clock -period 8.000 -name LAN_RXC -waveform {0.000 4.000} [get_ports LAN_RXC]

set rgmii_rx_clk            LAN_RXC;

set rgmiirx_rxc_period 	    8.000;
set rgmiirx_dv_bre          1.200;
set rgmiirx_dv_are          1.200;
set rgmiirx_dv_bfe          1.200;
set rgmiirx_dv_afe          1.200;
set input_ports             [list LAN_RX_CTL {LAN_RXD[0]} {LAN_RXD[1]} {LAN_RXD[2]} {LAN_RXD[3]}];

set_input_delay -clock $rgmii_rx_clk -max [expr $rgmiirx_rxc_period/2 - $rgmiirx_dv_bfe] [get_ports $input_ports] -add_delay;
set_input_delay -clock $rgmii_rx_clk -min $rgmiirx_dv_are [get_ports $input_ports] -add_delay;
set_input_delay -clock $rgmii_rx_clk -max [expr $rgmiirx_rxc_period/2 - $rgmiirx_dv_bre] [get_ports $input_ports] -clock_fall -add_delay;
set_input_delay -clock $rgmii_rx_clk -min $rgmiirx_dv_afe [get_ports $input_ports] -clock_fall -add_delay;

Значения rgmiirx_dv_bre, rgmiirx_dv_are, rgmiirx_dv_bfe, rgmiirx_dv_afe из мануала на PHY.

Screenshot from 2019-11-18 09-21-44.png

Результат следующий:

Copyright 1986-2018 Xilinx, Inc. All Rights Reserved.
--------------------------------------------------------------------------------------------------------------
| Tool Version      : Vivado v.2018.2 (lin64) Build 2258646 Thu Jun 14 20:02:38 MDT 2018
| Date              : Thu Nov 21 16:51:28 2019
| Host              : andrei running 64-bit Ubuntu 16.04.5 LTS
| Command           : report_timing -from [get_ports {LAN_RXD[0]}] -delay_type min_max -file timingreport.txt
| Design            : xcku3p
| Device            : xcku3p-ffvd900
| Speed File        : -2  PRODUCTION 1.20 05-21-2018
| Temperature Grade : I
--------------------------------------------------------------------------------------------------------------

Timing Report

Slack (VIOLATED) :        -0.265ns  (required time - arrival time)
  Source:                 LAN_RXD[0]
                            (input port clocked by LAN_RXC  {rise@0.000ns fall@4.000ns period=8.000ns})
  Destination:            rgmii_adapter_inst/rgmii_rx_inst/IDDRE1_rgmii_rd0/D
                            (rising edge-triggered cell IDDRE1 clocked by LAN_RXC  {rise@0.000ns fall@4.000ns period=8.000ns})
  Path Group:             LAN_RXC
  Path Type:              Setup (Max at Slow Process Corner)
  Requirement:            4.000ns  (LAN_RXC rise@8.000ns - LAN_RXC fall@4.000ns)
  Data Path Delay:        1.159ns  (logic 1.058ns (91.289%)  route 0.101ns (8.711%))
  Logic Levels:           2  (IBUFCTRL=1 INBUF=1)
  Input Delay:            2.800ns
  Clock Path Skew:        2.598ns (DCD - SCD + CPR)
    Destination Clock Delay (DCD):    2.598ns = ( 10.598 - 8.000 ) 
    Source Clock Delay      (SCD):    0.000ns = ( 4.000 - 4.000 ) 
    Clock Pessimism Removal (CPR):    0.000ns
  Clock Uncertainty:      0.235ns  ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE + DCD
    Total System Jitter     (TSJ):    0.071ns
    Total Input Jitter      (TIJ):    0.000ns
    Discrete Jitter          (DJ):    0.000ns
    Phase Error              (PE):    0.000ns
    Duty Cycle Distortion   (DCD):    0.200ns
  Clock Net Delay (Destination): 1.746ns (routing 0.626ns, distribution 1.120ns)

    Location             Delay type                Incr(ns)  Path(ns)    Netlist Resource(s)
  -------------------------------------------------------------------    -------------------
                         (clock LAN_RXC fall edge)    4.000     4.000 f  
                         input delay                  2.800     6.800    
    G16                                               0.000     6.800 r  LAN_RXD[0] (IN)
                         net (fo=0)                   0.000     6.800    LAN_RXD_IBUF[0]_inst/I
    G16                  INBUF (Prop_INBUF_HDIOB_S_PAD_O)
                                                      1.058     7.858 r  LAN_RXD_IBUF[0]_inst/INBUF_INST/O
                         net (fo=1, routed)           0.000     7.858    LAN_RXD_IBUF[0]_inst/OUT
    G16                  IBUFCTRL (Prop_IBUFCTRL_HDIOB_S_I_O)
                                                      0.000     7.858 r  LAN_RXD_IBUF[0]_inst/IBUFCTRL_INST/O
                         net (fo=1, routed)           0.101     7.959    rgmii_adapter_inst/rgmii_rx_inst/rgmii_rd[0]
    HDIOLOGIC_S_X0Y46    IDDRE1                                       r  rgmii_adapter_inst/rgmii_rx_inst/IDDRE1_rgmii_rd0/D
  -------------------------------------------------------------------    -------------------

                         (clock LAN_RXC rise edge)    8.000     8.000 r  
    G17                                               0.000     8.000 r  LAN_RXC (IN)
                         net (fo=0)                   0.000     8.000    LAN_RXC_IBUF_inst/I
    G17                  INBUF (Prop_INBUF_HDIOB_M_PAD_O)
                                                      0.659     8.659 r  LAN_RXC_IBUF_inst/INBUF_INST/O
                         net (fo=1, routed)           0.000     8.659    LAN_RXC_IBUF_inst/OUT
    G17                  IBUFCTRL (Prop_IBUFCTRL_HDIOB_M_I_O)
                                                      0.000     8.659 r  LAN_RXC_IBUF_inst/IBUFCTRL_INST/O
                         net (fo=1, routed)           0.169     8.828    rgmii_adapter_inst/rgmii_rx_inst/rgmii_rxc
    BUFGCE_HDIO_X0Y6     BUFGCE (Prop_BUFCE_BUFGCE_HDIO_I_O)
                                                      0.024     8.852 r  rgmii_adapter_inst/rgmii_rx_inst/BUFG_rgmii_rxc_0/O
    X1Y2 (CLOCK_ROOT)    net (fo=1466, routed)        1.746    10.598    rgmii_adapter_inst/rgmii_rx_inst/gmii_rx_clk
    HDIOLOGIC_S_X0Y46    IDDRE1                                       f  rgmii_adapter_inst/rgmii_rx_inst/IDDRE1_rgmii_rd0/CB  (IS_INVERTED)
                         clock pessimism              0.000    10.598    
                         clock uncertainty           -0.235    10.363    
    HDIOLOGIC_S_X0Y46    IDDRE1 (Setup_IDDR_HDIOLOGIC_S_CB_D)
                                                     -2.668     7.695    rgmii_adapter_inst/rgmii_rx_inst/IDDRE1_rgmii_rd0
  -------------------------------------------------------------------
                         required time                          7.695    
                         arrival time                          -7.959    
  -------------------------------------------------------------------
                         slack                                 -0.265    


 

Screenshot from 2019-11-21 16-49-10.png

Screenshot from 2019-11-21 16-50-30.png

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


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

1. Правильно ли прописаны констрейны? (взяты из Templates Vivado, похоже, должны быть правильными, Xilinx рекомендует!)

2. Если правильно, то почему не может выполнить времянку для setup?

3. Или тут он физически не может закинуть данные со входного пина до IDDRE1 буфера за требуемое время?

4. Вот ещё вычитал

Quote

Once the I/O timing constraints have been entered, it is important to review how timing is
analyzed on the I/O paths and the amount of slack violation for both setup and hold checks.
By using the timing reports from/to all ports for both setup and hold analysis (that is,
delay type = min_max), you can verify that:
• The correct clocks and clock edges are used as reference for the delay constraints.
• The expected clocks are launching and capturing the I/O data inside the FPGA device.
• The violations can reasonably be fixed by placement or by setting the proper delay line
tap configuration. If this is not the case, you must review the I/O delay values entered
in the constraints and evaluate whether they are realistic, and whether you must modify
the design to meet timing

Как быть, если для HD банка не предусмотрен delay line tap configuration?

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


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

8 часов назад, blackfin сказал:

А зачем его делать самому, если есть готовый: GMII to RGMII ?

Там и constraints готовые есть на стр. 39-41.

Мы пробовали. К этому ядру констрейнты не работают из коробки у нас. Приходится допиливать.

В даташитах вроде описано все логично, но не работает. Я тоже с этим бился долго.

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


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

On 11/21/2019 at 7:57 PM, Dimidrol said:

Мы пробовали. К этому ядру констрейнты не работают из коробки у нас. Приходится допиливать.

В даташитах вроде описано все логично, но не работает. Я тоже с этим бился долго.

У нас в проекте на MYIR используется IP core RGMII_to_GMII "из коробки"..

При этом сама Vivado создает файлы констрейнтов:

MYIR_bd_gmii_to_rgmii_0_0_clocks.xdc


# Identify RGMII Rx Pads only.  
# Receiver clock period constraints: please do not relax
set rx_clk [get_clocks -include_generated_clocks -of [get_ports rgmii_rxc]]

# define a virtual clock to simplify the timing constraints
create_clock -name MYIR_bd_gmii_to_rgmii_0_0_rgmii_rx_clk -period 8

# Identify RGMII Rx Pads only.  
# This prevents setup/hold analysis being performed on false inputs,
# eg, the configuration_vector inputs.

set_input_delay -clock [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_rx_clk] -max -1.5 [get_ports {rgmii_rxd[*] rgmii_rx_ctl}]
set_input_delay -clock [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_rx_clk] -min -2.8 [get_ports {rgmii_rxd[*] rgmii_rx_ctl}]
set_input_delay -clock [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_rx_clk] -clock_fall -max -1.5 -add_delay [get_ports {rgmii_rxd[*] rgmii_rx_ctl}]
set_input_delay -clock [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_rx_clk] -clock_fall -min -2.8 -add_delay [get_ports {rgmii_rxd[*] rgmii_rx_ctl}]

set_false_path -rise_from [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_rx_clk] -fall_to $rx_clk -setup
set_false_path -fall_from [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_rx_clk] -rise_to $rx_clk -setup
set_false_path -rise_from [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_rx_clk] -rise_to [get_clocks $rx_clk] -hold
set_false_path -fall_from [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_rx_clk] -fall_to $rx_clk -hold

set_multicycle_path -from [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_rx_clk] -to $rx_clk -setup 0
set_multicycle_path -from [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_rx_clk] -to $rx_clk -hold -1

set ip_gtx_clk     [get_clocks -include_generated_clocks -of_objects [get_pins -of [get_cells -hier -filter {name =~ *i_bufgmux_gmii_clk}] -filter {name =~ *O}]]
create_generated_clock -add -name MYIR_bd_gmii_to_rgmii_0_0_rgmii_tx_clk -divide_by 1 -source [get_pins -of [get_cells -hier -filter {name =~ *rgmii_txc_out}] -filter {name =~ *C}] -master_clock [get_clocks -of [get_ports gmii_clk_125m*]] [get_ports rgmii_txc]


set_false_path -fall_from $ip_gtx_clk -rise_to [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_tx_clk] -setup
set_false_path -rise_from $ip_gtx_clk -fall_to [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_tx_clk] -setup
set_false_path -fall_from $ip_gtx_clk -fall_to [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_tx_clk] -hold
set_false_path -rise_from $ip_gtx_clk -rise_to [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_tx_clk] -hold

set_output_delay -clock [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_tx_clk] -max -1.0 [get_ports {rgmii_txd[*] rgmii_tx_ctl}]
set_output_delay -clock [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_tx_clk] -min -2.6 [get_ports {rgmii_txd[*] rgmii_tx_ctl}] -add_delay
set_output_delay -clock [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_tx_clk] -clock_fall -max -1.0 [get_ports {rgmii_txd[*] rgmii_tx_ctl}] 
set_output_delay -clock [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_tx_clk] -clock_fall -min -2.6 [get_ports {rgmii_txd[*] rgmii_tx_ctl}] 

set_multicycle_path 0 -setup -end -rise_from $ip_gtx_clk -rise_to [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_tx_clk]
set_multicycle_path 0 -setup -end -fall_from $ip_gtx_clk -fall_to [get_clocks MYIR_bd_gmii_to_rgmii_0_0_rgmii_tx_clk]

MYIR_bd_gmii_to_rgmii_0_0.xdc

# Set the select line for the clock muxes so that the timing analysis is done on the fastest clock
set_case_analysis 0 [get_pins -of [get_cells -hier -filter { name =~ *i_bufgmux_gmii_clk } ] -filter {REF_PIN_NAME == CE0}]
set_case_analysis 0 [get_pins -of [get_cells -hier -filter { name =~ *i_bufgmux_gmii_clk } ] -filter {REF_PIN_NAME == S0}]
set_case_analysis 1 [get_pins -of [get_cells -hier -filter { name =~ *i_bufgmux_gmii_clk } ] -filter {REF_PIN_NAME == CE1}]
set_case_analysis 1 [get_pins -of [get_cells -hier -filter { name =~ *i_bufgmux_gmii_clk } ] -filter {REF_PIN_NAME == S1}]

# False path constraints to async inputs coming directly to synchronizer
set_false_path -to [get_pins -of [get_cells -hier -filter { name =~ *i_MANAGEMENT/SYNC_*/data_sync* } ]  -filter { name =~ *D } ]
set_false_path -to [get_pins -of [get_cells -hier -filter { name =~ *i_gmii_to_rgmii/i_sync_rx*/data_sync* } ]  -filter { name =~ *D } ]   
set_false_path -to [get_pins -of [get_cells -hier -filter { name =~  *reset_sync* } ] -filter {REF_PIN_NAME == PRE }]
set_false_path -to [get_pins -of [get_cells -hier -filter { name =~  *idelayctrl_reset_gen/*reset_sync* } ] -filter {REF_PIN_NAME == PRE }]

# False path constraints from Control Register outputs
set_false_path -from [get_pins -of [get_cells -hier -filter { name =~  *i_MANAGEMENT/DUPLEX_MODE_REG* } ] -filter {REF_PIN_NAME ==  C }]
set_false_path -from [get_pins -of [get_cells -hier -filter { name =~  *i_MANAGEMENT/SPEED_SELECTION_REG* } ] -filter {REF_PIN_NAME == C }]


#-----------------------------------------------------------
# To Adjust GMII Rx Input Setup/Hold Timing                -
# These IDELAY Tap values are given for illustration       - 
# prupose. Please modify as per design requirements        -
#-----------------------------------------------------------
#set_property IDELAY_VALUE  "16"   [get_cells -hier -filter {name =~ *MYIR_bd_gmii_to_rgmii_0_0_core/*delay_rgmii_rx_ctl          }]
#set_property IDELAY_VALUE  "16"   [get_cells -hier -filter {name =~ *MYIR_bd_gmii_to_rgmii_0_0_core/*delay_rgmii_rxd*            }]
#set_property IODELAY_GROUP "gpr1" [get_cells -hier -filter {name =~ *MYIR_bd_gmii_to_rgmii_0_0_core/*delay_rgmii_rx_ctl          }]
#set_property IODELAY_GROUP "gpr1" [get_cells -hier -filter {name =~ *MYIR_bd_gmii_to_rgmii_0_0_core/*delay_rgmii_rxd*            }]
#set_property IODELAY_GROUP "gpr1" [get_cells -hier -filter {name =~ *i_MYIR_bd_gmii_to_rgmii_0_0_idelayctrl}]

В файле, который создаем мы сами и добавляем в проект описываются только внешние клоки и пины корпуса:

create_clock -name RGMII_0_rxc -period 8.00 [get_ports RGMII_0_rxc]

set_property IOSTANDARD LVCMOS18 [get_ports {RGMII_0_rd[*]}]
...
  
set_property IOSTANDARD LVCMOS18 [get_ports MDIO_PHY_0_mdc]
set_property IOSTANDARD LVCMOS18 [get_ports MDIO_PHY_0_mdio_io]

set_property slew FAST [get_ports {RGMII_0_td[*]}]
...
  
set_property PULLUP true [get_ports MDIO_PHY_0_mdc]
set_property PULLUP true [get_ports MDIO_PHY_0_mdio_io]

set_property PACKAGE_PIN N17 [get_ports {RGMII_0_rd[0]}]
...

Никаких отрицательных slacks в отчете нет..

Схема IP core RGMII_to_GMII "из коробки":

RGMII2GMII.jpg

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


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

Тут ключевой момент - наличие в банке IDELAYE2/3 (для них должен быть отдельный xdc-файл), у меня в HD банке блоки IDELAYE3 отсутствуют.

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


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

doom13 Ключевой момент здесь фалзпасы. В первом посте констрейнты то правильные, но они задают пути с райза - на фолл приемного клока, через порты интерфейса RGMII. А это эквивалентно увеличению частоты в два раза;  конечно, такой констрейнт никогда не выполнится, и нужно вводить фалзпасы. Как в посте blackfin , но я бы добавил еще ключ -through с именем портов GMII, для гарантии, что фалзпас будет наложен только на интерфейс.

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


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

Может кто подскажет почему получаю разные результаты implementation? Это для двух проектов, один исходный - FPGA забита на процентов 50%, второй тестовый для экспериментов с ограничениями RGMII (Вопрос в том, как добиться одинакового результата для разводки? Что касается назначения пинов, то в обоих случаях они одинаковы):

1)

 

Screenshot from 2019-11-26 14-25-11.png

2)

 

Screenshot from 2019-11-26 14-24-56.png

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


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

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

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

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

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

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

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

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

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

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