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

Приветствую.
В проекте для XCKU3P используется AXI Ethernet. Т.к. PHY прикручен к HD банку. AXI Ethernet пришлось немного подправить и сделать внешний преобразователь GMII в RGMII.
Для приёма выглядит так:

 

rgmii_rx_adapter_rtl_clock.png

Проблема в том, что приёмник теряет пакеты.
Попытался обозначить ему констрейны:

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:

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

На всё это ругается, говорит, что не успевает:

 

Screenshot from 2019-11-18 09-15-02.png

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

Может что-то неправильно обозначил и как победить проблему? Напрашивается поставиль PLL и накрутить фазу для LAN_RXC

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


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

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) работает с ошибками и возникает вопрос: почему?

 

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


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

Есть вот такой хороший документ. Я брал за основу и запуска 100/1G ethernet - все было ОК.

https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/an/an477.pdf

Вендор другой, но сути дела не меняет)

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


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

4 hours ago, EgorT said:

Попробуйте написать так:

create_clock -period 8.000 -name LAN_RXC -waveform {2.000 6.000} [get_ports LAN_RXC]

Не помогает.

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


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

Судя по схеме, вы там клок для RGMII сдвинутый на 90гр сами генерите (gtx_clk_90), а не ehternet чип. Я бы его клок тоже описал.

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


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

15 hours ago, new123 said:

Судя по схеме, вы там клок для RGMII сдвинутый на 90гр сами генерите (gtx_clk_90), а не ehternet чип. Я бы его клок тоже описал.

На передачу, да, в соответствии с докой. Проблема с приёмом и LAN_RXC (он же RX_CLK согласно доке на PHY).

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


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

1 hour ago, doom13 said:

Проблема с приёмом и LAN_RX

эта ситуация доказана достоверно? Ведь может и отправлять криво. Я правда RX никогда не делал, только TX. По началу, когда проект маленький был, работало все без констрейнов нормально. Принимал обычной сетевой картой через wireshark. Как проект начал расти, все поплыло. Пока констрейны не описал, особенно клоки. Тоже генерил 90 phase сам (не внутри phy).

Изменено пользователем new123

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


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

Извиняюсь что вклиниваюсь в переписку. Мне на глаза попался один AN815. В нем на последней странице приведен пример расчета пригодности применения ПЛИС STRATIX V Для реализации GE (Gigabit Ethernet). Возможно здесь аналогичная закладка формируется. У меня был вопрос другой в связи с прочтением этой AN. Попробую сделать новую тему.

IDT_AN815_APN_20140424.pdf

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


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

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

Напрашивается поставиль PLL и накрутить фазу для LAN_RXC

Если подобрать фазу при помощи PLL для RGMII RX_CLK, приёмник начинает работать.

Остался вопрос с констрейнами, что неправильно было сделано из того, что приводил выше?

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


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

А какую фазу подобрали?

В квартусе, если юзается pll, то он сам создает констрейны для него, если указать команду. Напрашивается в вашем случае, что из за pll автоматом правильно описался клок rx.

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


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

В соответствии с данными рекомендациями

сделал так:

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

в результате развелось криво, пакеты теряет, на пути ругается

Screenshot from 2019-11-20 16-40-46.png

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


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

10 minutes ago, doom13 said:

В соответствии с данными рекомендациями

сделал так:

в результате развелось криво, пакеты теряет, на пути ругается

 

А вы проверьте, какие автоматические констрейны задало PLL. В визарде омжно увидеть. И сравните с Вашими

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


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

7 minutes ago, Nick_K said:

А вы проверьте, какие автоматические констрейны задало PLL. В визарде омжно увидеть. И сравните с Вашими

Так а при чём тут PLL? Его я уже убрал, пытаюсь заставить развести на основе констрейнов (вопрос в их правильности).

 

Про PLL:

С ним на пути аналогично ругается, только значения слаков другие. Просто в случае с PLL есть возможность после кривой сборки программно докрутить фазу приёмного клока (из доки на PHY - RX_CLK) так, чтоб он совпадал с центром окна принимаемых данных (ну или почти центром).

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


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

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

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


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

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

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

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

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

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

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

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

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

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