doom13 0 18 ноября, 2019 Опубликовано 18 ноября, 2019 · Жалоба Приветствую. В проекте для XCKU3P используется AXI Ethernet. Т.к. PHY прикручен к HD банку. AXI Ethernet пришлось немного подправить и сделать внешний преобразователь GMII в RGMII. Для приёма выглядит так: Проблема в том, что приёмник теряет пакеты. Попытался обозначить ему констрейны: create_clock -period 8.000 -name LAN_RXC -waveform {0.000 4.000} [get_ports LAN_RXC] # RGMII input delay # For this constraint set PHY register 20.7 to 1 in software driver # # Center-Aligned Double Data Rate Source Synchronous Inputs # # For a center-aligned Source Synchronous interface, the clock # transition is aligned with the center of the data valid window. # The same clock edge is used for launching and capturing the # data. The constraints below rely on the default timing # analysis (setup = 1/2 cycle, hold = 0 cycle). # # input ____________________ # clock _____________| |_____________ # | | # dv_bre | dv_are dv_bfe | dv_afe # <------>|<------> <------>|<------> # _ ________|________ ________|________ _ # data _XXXX____Rise_Data____XXXX____Fall_Data____XXXX_ # set rgmiirx_rxc LAN_RXC; # Name of input clock set rgmiirx_rxc_period 8.000; # Period of input clock (full-period) set rgmiirx_dv_bre 1.200; # Data valid before the rising clock edge set rgmiirx_dv_are 1.200; # Data valid after the rising clock edge set rgmiirx_dv_bfe 1.200; # Data valid before the falling clock edge set rgmiirx_dv_afe 1.200; # Data valid after the falling clock edge # Input Delay Constraint set_input_delay -clock $rgmiirx_rxc -max [expr $rgmiirx_rxc_period/2 - $rgmiirx_dv_bfe] [get_ports {LAN_RXD[0]}]; set_input_delay -clock $rgmiirx_rxc -min $rgmiirx_dv_are [get_ports {LAN_RXD[0]}]; set_input_delay -clock $rgmiirx_rxc -max [expr $rgmiirx_rxc_period/2 - $rgmiirx_dv_bre] [get_ports {LAN_RXD[0]}] -clock_fall -add_delay; set_input_delay -clock $rgmiirx_rxc -min $rgmiirx_dv_afe [get_ports {LAN_RXD[0]}] -clock_fall -add_delay; set_input_delay -clock $rgmiirx_rxc -max [expr $rgmiirx_rxc_period/2 - $rgmiirx_dv_bfe] [get_ports {LAN_RXD[1]}]; set_input_delay -clock $rgmiirx_rxc -min $rgmiirx_dv_are [get_ports {LAN_RXD[1]}]; set_input_delay -clock $rgmiirx_rxc -max [expr $rgmiirx_rxc_period/2 - $rgmiirx_dv_bre] [get_ports {LAN_RXD[1]}] -clock_fall -add_delay; set_input_delay -clock $rgmiirx_rxc -min $rgmiirx_dv_afe [get_ports {LAN_RXD[1]}] -clock_fall -add_delay; set_input_delay -clock $rgmiirx_rxc -max [expr $rgmiirx_rxc_period/2 - $rgmiirx_dv_bfe] [get_ports {LAN_RXD[2]}]; set_input_delay -clock $rgmiirx_rxc -min $rgmiirx_dv_are [get_ports {LAN_RXD[2]}]; set_input_delay -clock $rgmiirx_rxc -max [expr $rgmiirx_rxc_period/2 - $rgmiirx_dv_bre] [get_ports {LAN_RXD[2]}] -clock_fall -add_delay; set_input_delay -clock $rgmiirx_rxc -min $rgmiirx_dv_afe [get_ports {LAN_RXD[2]}] -clock_fall -add_delay; set_input_delay -clock $rgmiirx_rxc -max [expr $rgmiirx_rxc_period/2 - $rgmiirx_dv_bfe] [get_ports {LAN_RXD[3]}]; set_input_delay -clock $rgmiirx_rxc -min $rgmiirx_dv_are [get_ports {LAN_RXD[3]}]; set_input_delay -clock $rgmiirx_rxc -max [expr $rgmiirx_rxc_period/2 - $rgmiirx_dv_bre] [get_ports {LAN_RXD[3]}] -clock_fall -add_delay; set_input_delay -clock $rgmiirx_rxc -min $rgmiirx_dv_afe [get_ports {LAN_RXD[3]}] -clock_fall -add_delay; set_input_delay -clock $rgmiirx_rxc -max [expr $rgmiirx_rxc_period/2 - $rgmiirx_dv_bfe] [get_ports LAN_RX_CTL]; set_input_delay -clock $rgmiirx_rxc -min $rgmiirx_dv_are [get_ports LAN_RX_CTL]; set_input_delay -clock $rgmiirx_rxc -max [expr $rgmiirx_rxc_period/2 - $rgmiirx_dv_bre] [get_ports LAN_RX_CTL] -clock_fall -add_delay; set_input_delay -clock $rgmiirx_rxc -min $rgmiirx_dv_afe [get_ports LAN_RX_CTL] -clock_fall -add_delay; Значения для dv_bre, dv_are, dv_bfe, dv_afe взял из доки на PHY: На всё это ругается, говорит, что не успевает: На предыдущем этапе всё работало и без обозначения входных задержек. Но после определённых изменений в дизайне, приёмник отвалился полностью. Тогда обозначил входные задержки для приёмной части RGMII и стало лучше, но пакеты теряет. Может что-то неправильно обозначил и как победить проблему? Напрашивается поставиль PLL и накрутить фазу для LAN_RXC Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EgorT 0 18 ноября, 2019 Опубликовано 18 ноября, 2019 · Жалоба 2 hours ago, doom13 said: create_clock -period 8.000 -name LAN_RXC -waveform {0.000 4.000} [get_ports LAN_RXC] Попробуйте написать так: create_clock -period 8.000 -name LAN_RXC -waveform {2.000 6.000} [get_ports LAN_RXC] А вообще, у меня уже давно появляется сомнение в том, что констрейны для RGMII работают. Много раз было такое, что не прописываешь констрейны и интерфейс отлично работает, а когда прописываешь - появляются ошибки. Даже в официальных отладочных платах с референс дизайном, где прописаны все констрейны и т.д. сетевой интерфейс (RGMII) работает с ошибками и возникает вопрос: почему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 3 18 ноября, 2019 Опубликовано 18 ноября, 2019 · Жалоба Есть вот такой хороший документ. Я брал за основу и запуска 100/1G ethernet - все было ОК. https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/an/an477.pdf Вендор другой, но сути дела не меняет) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 18 ноября, 2019 Опубликовано 18 ноября, 2019 · Жалоба 4 hours ago, EgorT said: Попробуйте написать так: create_clock -period 8.000 -name LAN_RXC -waveform {2.000 6.000} [get_ports LAN_RXC] Не помогает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 18 ноября, 2019 Опубликовано 18 ноября, 2019 · Жалоба Судя по схеме, вы там клок для RGMII сдвинутый на 90гр сами генерите (gtx_clk_90), а не ehternet чип. Я бы его клок тоже описал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 19 ноября, 2019 Опубликовано 19 ноября, 2019 · Жалоба 15 hours ago, new123 said: Судя по схеме, вы там клок для RGMII сдвинутый на 90гр сами генерите (gtx_clk_90), а не ehternet чип. Я бы его клок тоже описал. На передачу, да, в соответствии с докой. Проблема с приёмом и LAN_RXC (он же RX_CLK согласно доке на PHY). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 19 ноября, 2019 Опубликовано 19 ноября, 2019 (изменено) · Жалоба 1 hour ago, doom13 said: Проблема с приёмом и LAN_RX эта ситуация доказана достоверно? Ведь может и отправлять криво. Я правда RX никогда не делал, только TX. По началу, когда проект маленький был, работало все без констрейнов нормально. Принимал обычной сетевой картой через wireshark. Как проект начал расти, все поплыло. Пока констрейны не описал, особенно клоки. Тоже генерил 90 phase сам (не внутри phy). Изменено 19 ноября, 2019 пользователем new123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 19 ноября, 2019 Опубликовано 19 ноября, 2019 · Жалоба 1 hour ago, new123 said: Ведь может и отправлять криво Криво принимает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ermilovd 0 19 ноября, 2019 Опубликовано 19 ноября, 2019 · Жалоба Извиняюсь что вклиниваюсь в переписку. Мне на глаза попался один AN815. В нем на последней странице приведен пример расчета пригодности применения ПЛИС STRATIX V Для реализации GE (Gigabit Ethernet). Возможно здесь аналогичная закладка формируется. У меня был вопрос другой в связи с прочтением этой AN. Попробую сделать новую тему. IDT_AN815_APN_20140424.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 20 ноября, 2019 Опубликовано 20 ноября, 2019 · Жалоба On 11/18/2019 at 9:19 AM, doom13 said: Напрашивается поставиль PLL и накрутить фазу для LAN_RXC Если подобрать фазу при помощи PLL для RGMII RX_CLK, приёмник начинает работать. Остался вопрос с констрейнами, что неправильно было сделано из того, что приводил выше? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 20 ноября, 2019 Опубликовано 20 ноября, 2019 · Жалоба А какую фазу подобрали? В квартусе, если юзается pll, то он сам создает констрейны для него, если указать команду. Напрашивается в вашем случае, что из за pll автоматом правильно описался клок rx. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 21 ноября, 2019 Опубликовано 21 ноября, 2019 · Жалоба В соответствии с данными рекомендациями сделал так: create_clock -period 8.000 -name LAN_RXC -waveform {0.000 4.000} [get_ports LAN_RXC] create_clock -period 8.000 -name lan_rxc_virtual set rgmii_rx_clk lan_rxc_virtual; set rx_clk LAN_RXC; set_input_delay -clock $rgmii_rx_clk -max -1.2 [get_ports $input_ports] -add_delay; set_input_delay -clock $rgmii_rx_clk -min -2.8 [get_ports $input_ports] -add_delay; set_input_delay -clock $rgmii_rx_clk -max -1.2 [get_ports $input_ports] -clock_fall -add_delay; set_input_delay -clock $rgmii_rx_clk -min -2.8 [get_ports $input_ports] -clock_fall -add_delay; set_false_path -rise_from [get_clocks $rgmii_rx_clk] -fall_to $rx_clk -setup set_false_path -fall_from [get_clocks $rgmii_rx_clk] -rise_to $rx_clk -setup set_false_path -rise_from [get_clocks $rgmii_rx_clk] -rise_to $rx_clk -hold set_false_path -fall_from [get_clocks $rgmii_rx_clk] -fall_to $rx_clk -hold set_multicycle_path -from [get_clocks $rgmii_rx_clk] -to $rx_clk -setup 0 set_multicycle_path -from [get_clocks $rgmii_rx_clk] -to $rx_clk -hold -1 в результате развелось криво, пакеты теряет, на пути ругается Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 21 ноября, 2019 Опубликовано 21 ноября, 2019 · Жалоба 10 minutes ago, doom13 said: В соответствии с данными рекомендациями сделал так: в результате развелось криво, пакеты теряет, на пути ругается А вы проверьте, какие автоматические констрейны задало PLL. В визарде омжно увидеть. И сравните с Вашими Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 21 ноября, 2019 Опубликовано 21 ноября, 2019 · Жалоба 7 minutes ago, Nick_K said: А вы проверьте, какие автоматические констрейны задало PLL. В визарде омжно увидеть. И сравните с Вашими Так а при чём тут PLL? Его я уже убрал, пытаюсь заставить развести на основе констрейнов (вопрос в их правильности). Про PLL: С ним на пути аналогично ругается, только значения слаков другие. Просто в случае с PLL есть возможность после кривой сборки программно докрутить фазу приёмного клока (из доки на PHY - RX_CLK) так, чтоб он совпадал с центром окна принимаемых данных (ну или почти центром). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 21 ноября, 2019 Опубликовано 21 ноября, 2019 · Жалоба А пардон, я тогда недопонял проблему. Но в любом случае можно посмотреть констрейны, когда была PLL. Возможно там указаны какие-то значения, которые позволят улучшить проект без оного (PLL). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться