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

Прием данных с Marvell'a в режиме GMII

Вечер добрый. Не поделитесь опытом приема данных с Marvell'a. Суть проблемы в следующем. Персоналка подключается к плате на которой стоит Marvel в режиме 1Гбит (GMII).

В режиме GMII идет нестабильный прием данных, т.е. например с персоналки подаю пакет с MAK-адресом 122334455667, а на приемной стороне (сделал тестовое ФИФО в которое все пишу по RX_En) получаю 162334455667. Вообщем биты "вылетают" при приеме. Зависимость получается и от раскладки проекта (меняю тестовые сигналы - переназначаю, также меняется и положение вылетающих битов). Хотя весь проект сделан абсолютно синхронно от тактовой частоты приемопередатчика RX_CLK. Привязываю к ней и данные и соответствующие управляющие сигналы на входе и после этого начинаю их анализ, ну все как полагается.

 

Возникает несколько вопросов: необходимо ли вводить констрейны на входную шину данных? Двигали ли вы входную частоту по фазе относительного входной шины данных (где то уже по моему проскальзывало упоминание про нестабильный режим работы марвела)? Ну и какие могут быть еще подводные камни?

 

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


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

Вечер добрый. Не поделитесь опытом приема данных с Marvell'a. Суть проблемы в следующем. Персоналка подключается к плате на которой стоит Marvel в режиме 1Гбит (GMII).

В режиме GMII идет нестабильный прием данных, т.е. например с персоналки подаю пакет с MAK-адресом 122334455667, а на приемной стороне (сделал тестовое ФИФО в которое все пишу по RX_En) получаю 162334455667. Вообщем биты "вылетают" при приеме. Зависимость получается и от раскладки проекта (меняю тестовые сигналы - переназначаю, также меняется и положение вылетающих битов). Хотя весь проект сделан абсолютно синхронно от тактовой частоты приемопередатчика RX_CLK. Привязываю к ней и данные и соответствующие управляющие сигналы на входе и после этого начинаю их анализ, ну все как полагается.

 

Возникает несколько вопросов: необходимо ли вводить констрейны на входную шину данных? Двигали ли вы входную частоту по фазе относительного входной шины данных (где то уже по моему проскальзывало упоминание про нестабильный режим работы марвела)? Ну и какие могут быть еще подводные камни?

 

Смотрите даташит на марвелл. Ваша задача полностью обеспечить

требуемые времянки. Потом двигайтесь далее.

Про нестабильность работы марвела забудьте.

Лет 7 использую - проблем не было никогда.

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


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

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

 

В общем случае, на внешние шины нужно задавать констрейны серии OFFSET (Xilinx) для явного указания времен setup/hold согласно спецификации на внешнюю шину.

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


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

Смотрите даташит на марвелл. Ваша задача полностью обеспечить

требуемые времянки. Потом двигайтесь далее.

Про нестабильность работы марвела забудьте.

Лет 7 использую - проблем не было никогда.

 

На времянке минимальное время установки данных до начала тактового сигнала у Marvell'a (Tsu_gmii) - 2,5нсек. Возможно ПЛИСе не хватает этого времени для предустановки данных? Просто - полностью обеспечить требуемые времянки - не совсем понятно. Времянки обеспечивает марвел. На приеме я лишь захлопываю их по тактовой.

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


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

В общем случае, на внешние шины нужно задавать констрейны серии OFFSET (Xilinx) для явного указания времен setup/hold согласно спецификации на внешнюю шину.

 

Нашел доку UG138. В нем приводят пример подключения как раз marvell'a к спартану. Прописаны констрейны. Сейчас буду пробовать.

 

 

Опираясь на эту доку, прописал для своих сигналов (Phy_RxClk - тактовая; Phy_RxD[7:0], Phy_RxDv, Phy_RxEr - сигналы интерфейса GMII):

 

INST "Phy_RxD<?>" TNM = IN_GMII;

INST "Phy_RxDv" TNM = IN_GMII;

INST "Phy_RxEr" TNM = IN_GMII;

 

TIMEGRP "IN_GMII" OFFSET = IN 2 ns VALID 2 ns BEFORE "Phy_RxClk";

 

Компилятор выдал такое:

----------------------------------------------------------------------------------------------------------

Constraint | Check | Worst Case | Best Case | Timing | Timing

| | Slack | Achievable | Errors | Score

----------------------------------------------------------------------------------------------------------

TIMEGRP "IN_GMII" OFFSET = IN 2 ns VALID | SETUP | 0.081ns| 1.919ns | 0| 0

2 ns BEFORE COMP "Phy_RxClk" | HOLD | 0.117ns| | 0| 0

----------------------------------------------------------------------------------------------------------

 

Вроде все констрейны прошли.

 

 

 

 

 

Хотя вот тут нашел еще один пример:

 

"We must tell the ISE tools that the Data input has a setup time of 8 ns and a hold time of 7 ns with the following syntax:

NET "Data" OFFSET = IN 8ns VALID 15 ns BEFORE "Clk" HIGH;"

 

Для нашего случая: setup - 2,5ns и hold - 0,5ns, получаем

NET "Data" OFFSET = IN 2500 ps VALID 500 ps BEFORE "Clk" HIGH;

 

Вроде так.

 

Попробовал ввести констрейны с помощью оператора OFFSET.

 

ISE выдал следующее:

 

----------------------------------------------------------------------------------------------------------

Constraint | Check | Worst Case | Best Case | Timing | Timing

| | Slack | Achievable | Errors | Score

----------------------------------------------------------------------------------------------------------

* COMP "Phy_RxD<4>" OFFSET = IN 2.5 ns VALI | SETUP | 0.901ns| 1.599ns| 0| 0

D 0.5 ns BEFORE COMP "Phy_RxClk" | HOLD | -1.187ns| | 1| 1187

HIGH | | | | |

----------------------------------------------------------------------------------------------------------

* COMP "Phy_RxD<7>" OFFSET = IN 2.5 ns VALI | SETUP | 0.763ns| 1.737ns| 0| 0

D 0.5 ns BEFORE COMP "Phy_RxClk" | HOLD | -1.112ns| | 1| 1112

HIGH | | | | |

----------------------------------------------------------------------------------------------------------

* COMP "Phy_RxEr" OFFSET = IN 2.5 ns VALID | SETUP | 0.776ns| 1.724ns| 0| 0

0.5 ns BEFORE COMP "Phy_RxClk" HIGH | HOLD | -1.102ns| | 1| 1102

----------------------------------------------------------------------------------------------------------

* COMP "Phy_RxDv" OFFSET = IN 2.5 ns VALID | SETUP | 0.835ns| 1.665ns| 0| 0

0.5 ns BEFORE COMP "Phy_RxClk" HIGH | HOLD | -1.090ns| | 1| 1090

----------------------------------------------------------------------------------------------------------

* COMP "Phy_RxD<0>" OFFSET = IN 2.5 ns VALI | SETUP | 0.702ns| 1.798ns| 0| 0

D 0.5 ns BEFORE COMP "Phy_RxClk" | HOLD | -1.030ns| | 1| 1030

HIGH | | | | |

----------------------------------------------------------------------------------------------------------

* COMP "Phy_RxD<1>" OFFSET = IN 2.5 ns VALI | SETUP | 0.686ns| 1.814ns| 0| 0

D 0.5 ns BEFORE COMP "Phy_RxClk" | HOLD | -1.013ns| | 1| 1013

HIGH | | | | |

----------------------------------------------------------------------------------------------------------

* COMP "Phy_RxD<5>" OFFSET = IN 2.5 ns VALI | SETUP | 0.393ns| 2.107ns| 0| 0

D 0.5 ns BEFORE COMP "Phy_RxClk" | HOLD | -0.886ns| | 1| 886

HIGH | | | | |

----------------------------------------------------------------------------------------------------------

* COMP "Phy_RxD<3>" OFFSET = IN 2.5 ns VALI | SETUP | 0.391ns| 2.109ns| 0| 0

D 0.5 ns BEFORE COMP "Phy_RxClk" | HOLD | -0.883ns| | 1| 883

HIGH | | | | |

----------------------------------------------------------------------------------------------------------

* COMP "Phy_RxD<6>" OFFSET = IN 2.5 ns VALI | SETUP | 0.400ns| 2.100ns| 0| 0

D 0.5 ns BEFORE COMP "Phy_RxClk" | HOLD | -0.882ns| | 1| 882

HIGH | | | | |

----------------------------------------------------------------------------------------------------------

* COMP "Phy_RxD<2>" OFFSET = IN 2.5 ns VALI | SETUP | 0.434ns| 2.066ns| 0| 0

D 0.5 ns BEFORE COMP "Phy_RxClk" | HOLD | -0.848ns| | 1| 848

HIGH | | | | |

----------------------------------------------------------------------------------------------------------

 

Т.е. по всем 10-ти сигналам есть предупреждение по HOLD. А что означает отрицательное время удержания?

 

 

Немного ошибся в записи. Вроде как нужно записать так:

 

NET "Phy_RxD[7]" OFFSET = IN 2500 ps VALID 3000 ps BEFORE "Phy_RxClk" HIGH;

 

Надо к 2500 (setup) прибавить 500 псек (hold).

 

А не подскажите в чем разница описания констрейнов и какой способ лучше (1-ый это через TNM, а 2-ой через OFFSET)?

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


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

"Зависимость получается и от раскладки проекта" - В первую очередь установите триггеры захвата данных в "лапы"!!! Тогда точно не будет изменений при переразводке проекта. Дам 90% что это поможет. У вас, скорее всего, данные до захвата идут по кристаллу неизвестно сколько..

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


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

"Зависимость получается и от раскладки проекта" - В первую очередь установите триггеры захвата данных в "лапы"!!! Тогда точно не будет изменений при переразводке проекта. Дам 90% что это поможет. У вас, скорее всего, данные до захвата идут по кристаллу неизвестно сколько..

 

В данный момент как раз и разбираюсь с этими констрейнами (из UG138):

 

GMII IOB Constraints

The following constraints target the flip-flops that are inferred in the top-level HDL file for

the example design; constraints are set to ensure that these are placed in IOBs.

INST "*gmii_txd_reg*" IOB = true;

INST "*gmii_tx_en_reg" IOB = true;

INST "*gmii_tx_er_reg" IOB = true;

INST "*rxd_to_mac*" IOB = true;

INST "*rx_dv_to_mac" IOB = true;

INST "*rx_er_to_mac" IOB = true;

 

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


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

"Зависимость получается и от раскладки проекта" - В первую очередь установите триггеры захвата данных в "лапы"!!! Тогда точно не будет изменений при переразводке проекта. Дам 90% что это поможет. У вас, скорее всего, данные до захвата идут по кристаллу неизвестно сколько..

 

Что то у меня после добавления констрейнов на размещение триггеров захвата в IOB'ы:

INST "U9/GM_TxD*" IOB = true ;

INST "U9/GM_TxEn" IOB = true ;

 

INST "U7/GM_RxD*" IOB = true ;

INST "U7/GM_RxDv" IOB = true ;

INST "U7/GM_RxEr" IOB = true ;

 

перестал выполняться временной констрейн (хотя до размещения триггеров все проходило по времянке):

TIMEGRP "IN_GMII" OFFSET = IN 2.5 ns VALID 3 ns BEFORE "Phy_RxClk";

 

Вообщем не совсем понятно. В доке UG138 дополнительно используется элемент IODELAY. Кто его использовал при приеме данных с marvell'a?

 

 

 

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


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

Из сообщений компилятора:

 

TIMEGRP "IN_GMII" OFFSET = IN 2.5 ns VALID 3 ns BEFORE COMP "Phy_RxClk";

Worst Case Data Window 1.574; Ideal Clock Offset To Actual Clock -2.024;

------------------+------------+------------+------------+------------+---------+---------+-------------+

| | Process | | Process | Setup | Hold |Source Offset|

Source | Setup | Corner | Hold | Corner | Slack | Slack | To Center |

------------------+------------+------------+------------+------------+---------+---------+-------------+

Phy_RxD<0> | -0.288®| FAST | 1.739®| SLOW | 2.788| -1.239| 2.014|

Phy_RxD<1> | -0.259®| FAST | 1.751®| SLOW | 2.759| -1.251| 2.005|

Phy_RxD<2> | -0.238®| FAST | 1.730®| SLOW | 2.738| -1.230| 1.984|

Phy_RxD<3> | -0.319®| FAST | 1.811®| SLOW | 2.819| -1.311| 2.065|

Phy_RxD<4> | -0.265®| FAST | 1.716®| SLOW | 2.765| -1.216| 1.991|

Phy_RxD<5> | -0.267®| FAST | 1.718®| SLOW | 2.767| -1.218| 1.993|

Phy_RxD<6> | -0.298®| FAST | 1.790®| SLOW | 2.798| -1.290| 2.044|

Phy_RxD<7> | -0.296®| FAST | 1.788®| SLOW | 2.796| -1.288| 2.042|

Phy_RxDv | -0.237®| FAST | 1.729®| SLOW | 2.737| -1.229| 1.983|

Phy_RxEr | -0.257®| FAST | 1.749®| SLOW | 2.757| -1.249| 2.003|

------------------+------------+------------+------------+------------+---------+---------+-------------+

Worst Case Summary| -0.237| - | 1.811| - | 2.737| -1.311| |

------------------+------------+------------+------------+------------+---------+---------+-------------+

 

 

Timing summary:

---------------

 

Timing errors: 10 Score: 12521 (Setup/Max: 0, Hold: 12521)

 

Получается, согласно этой фразе " Ideal Clock Offset To Actual Clock -2.024;" необходимо либо сдвинуть тактовую, либо всю шину данных?

 

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


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

Не усложняйте себе жизнь.

 

NET "rx_clk" CLOCK_DEDICATED_ROUTE = FALSE;

NET "rx_clk" TNM_NET = rx_clk;

TIMESPEC TS_rx_clk = PERIOD "rx_clk" 8 ns HIGH 50%;

NET "rx_clk" LOC = "AP11" ;

 

NET "rx_dv" LOC = "AM13";

INST "rx_dv_reg" LOC = ILOGIC_X2Y48;

NET "rx_data(0)" LOC = "AN13";

NET "rx_data(1)" LOC = "AF14";

NET "rx_data(2)" LOC = "AE14";

NET "rx_data(3)" LOC = "AN12";

NET "rx_data(4)" LOC = "AM12";

NET "rx_data(5)" LOC = "AD11";

NET "rx_data(6)" LOC = "AC12";

NET "rx_data(7)" LOC = "AC13";

 

Это все констрейны, которые я описывал для RX. Плюс ещё rx_data заводил на IDDR, для того, чтобы явно не указывать на лапы(к тому же, предполагается использовать RGMII). Всё чётко работает.

Вы же своим INST "*gmii_tx_er_reg" IOB = true; явно указываете имплементатору на расположение триггеров, а потом ещё пытаетесь его заставит выполнить свои пожелания TIMEGRP "IN_GMII" OFFSET = IN 2.5 ns VALID 3 ns BEFORE COMP "Phy_RxClk"; :rolleyes:

Надо выбрать что-либо одно)

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


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

Не усложняйте себе жизнь.

 

NET "rx_clk" CLOCK_DEDICATED_ROUTE = FALSE;

NET "rx_clk" TNM_NET = rx_clk;

TIMESPEC TS_rx_clk = PERIOD "rx_clk" 8 ns HIGH 50%;

NET "rx_clk" LOC = "AP11" ;

 

NET "rx_dv" LOC = "AM13";

INST "rx_dv_reg" LOC = ILOGIC_X2Y48;

NET "rx_data(0)" LOC = "AN13";

NET "rx_data(1)" LOC = "AF14";

NET "rx_data(2)" LOC = "AE14";

NET "rx_data(3)" LOC = "AN12";

NET "rx_data(4)" LOC = "AM12";

NET "rx_data(5)" LOC = "AD11";

NET "rx_data(6)" LOC = "AC12";

NET "rx_data(7)" LOC = "AC13";

 

Это все констрейны, которые я описывал для RX. Плюс ещё rx_data заводил на IDDR, для того, чтобы явно не указывать на лапы(к тому же, предполагается использовать RGMII). Всё чётко работает.

Вы же своим INST "*gmii_tx_er_reg" IOB = true; явно указываете имплементатору на расположение триггеров, а потом ещё пытаетесь его заставит выполнить свои пожелания TIMEGRP "IN_GMII" OFFSET = IN 2.5 ns VALID 3 ns BEFORE COMP "Phy_RxClk"; :rolleyes:

Надо выбрать что-либо одно)

 

Так изначально у меня и были ограничения только по частоте и пинам, за исключением 1-ой строчки: NET "rx_clk" CLOCK_DEDICATED_ROUTE = FALSE; - этого не было, т.к. я тактовую завел сразу на глобальный пин. Все остальное было также. Режим работы GMII. И при приеме возникали ошибки. Поэтому и начал вводить констейны по времянке (setup и hold time), как рекомендуют в доке UG138. Если бы не ошибки, я бы и не углублялся в изучение данного вопроса. Но ограничений по одной лишь частоте не хватает.

А вы же рекомендовали сделать констрейны по пинам, ну т.е. использовать конструкцию

INST "U9/GM_TxD*" IOB = true ;

или я что то не так понял?

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


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

Ставьте триггеры в ИОБы, а остальные добавленные ОФФСЕТ констреинты убирайте - ругань ИСЕ сразу пропадёт, а приём данных стабилизируется.

 

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


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

"А вы же рекомендовали сделать констрейны по пинам, ну т.е. использовать конструкцию

INST "U9/GM_TxD*" IOB = true ;" - я написал, что использую примитив IDDR, а они находятся ТОЛЬКО в "лапах". Вы IDDR не используете, значит обязательно надо жёстко прописывать INST "U9/GM_TxD*" IOB = true. И уберите OFFSET )

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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