doom13 0 21 ноября, 2019 Опубликовано 21 ноября, 2019 · Жалоба 3 minutes ago, Nick_K said: А пардон, я тогда недопонял проблему. Но в любом случае можно посмотреть констрейны, когда была PLL. Возможно там указаны какие-то значения, которые позволят улучшить проект без оного (PLL). Вся проблема описана в первом посте. Она собственно и остаётся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 21 ноября, 2019 Опубликовано 21 ноября, 2019 · Жалоба Кстати один из известных мне вариантов - попробовать развести сначала критические пути, а потом остальной проект. Ну или вручную на крайняк Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blackfin 25 21 ноября, 2019 Опубликовано 21 ноября, 2019 · Жалоба On 11/18/2019 at 9:19 AM, doom13 said: Т.к. PHY прикручен к HD банку. AXI Ethernet пришлось немного подправить и сделать внешний преобразователь GMII в RGMII. А зачем его делать самому, если есть готовый: GMII to RGMII ? Там и constraints готовые есть на стр. 39-41. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 21 ноября, 2019 Опубликовано 21 ноября, 2019 · Жалоба 36 minutes ago, blackfin said: А зачем его делать самому, если есть готовый: GMII to RGMII ? Он не доступен для моего девайса Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blackfin 25 21 ноября, 2019 Опубликовано 21 ноября, 2019 · Жалоба 16 minutes ago, doom13 said: Он не доступен для моего девайса Да, похоже, что так. Тогда можно взять только constraints из PG160.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 21 ноября, 2019 Опубликовано 21 ноября, 2019 · Жалоба 31 minutes ago, blackfin said: Тогда можно взять только constraints из PG160.. Хотелось бы разобраться, что может быть неверно из того что есть (оно то из экзампла Xilinx взято). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 21 ноября, 2019 Опубликовано 21 ноября, 2019 · Жалоба Вернул всё к исходному состоянию (выкинул из проекта 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. Результат следующий: 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 21 ноября, 2019 Опубликовано 21 ноября, 2019 · Жалоба 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dimidrol 0 21 ноября, 2019 Опубликовано 21 ноября, 2019 · Жалоба 8 часов назад, blackfin сказал: А зачем его делать самому, если есть готовый: GMII to RGMII ? Там и constraints готовые есть на стр. 39-41. Мы пробовали. К этому ядру констрейнты не работают из коробки у нас. Приходится допиливать. В даташитах вроде описано все логично, но не работает. Я тоже с этим бился долго. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 25 ноября, 2019 Опубликовано 25 ноября, 2019 · Жалоба Продолжение темы. Похоже, ситуация безвыходная( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blackfin 25 25 ноября, 2019 Опубликовано 25 ноября, 2019 · Жалоба 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 "из коробки": Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 25 ноября, 2019 Опубликовано 25 ноября, 2019 · Жалоба Тут ключевой момент - наличие в банке IDELAYE2/3 (для них должен быть отдельный xdc-файл), у меня в HD банке блоки IDELAYE3 отсутствуют. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Avex 1 25 ноября, 2019 Опубликовано 25 ноября, 2019 · Жалоба doom13 Ключевой момент здесь фалзпасы. В первом посте констрейнты то правильные, но они задают пути с райза - на фолл приемного клока, через порты интерфейса RGMII. А это эквивалентно увеличению частоты в два раза; конечно, такой констрейнт никогда не выполнится, и нужно вводить фалзпасы. Как в посте blackfin , но я бы добавил еще ключ -through с именем портов GMII, для гарантии, что фалзпас будет наложен только на интерфейс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EgorT 0 26 ноября, 2019 Опубликовано 26 ноября, 2019 · Жалоба Так в следующем посте doom13 задал эти фалзпасы и опять пакеты терялись и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 26 ноября, 2019 Опубликовано 26 ноября, 2019 · Жалоба Может кто подскажет почему получаю разные результаты implementation? Это для двух проектов, один исходный - FPGA забита на процентов 50%, второй тестовый для экспериментов с ограничениями RGMII (Вопрос в том, как добиться одинакового результата для разводки? Что касается назначения пинов, то в обоих случаях они одинаковы): 1) 2) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться