реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Прием данных с Marvell'a в режиме GMII
ovs_pavel
сообщение Sep 26 2012, 17:56
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 275
Регистрация: 19-05-06
Пользователь №: 17 249



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

Возникает несколько вопросов: необходимо ли вводить констрейны на входную шину данных? Двигали ли вы входную частоту по фазе относительного входной шины данных (где то уже по моему проскальзывало упоминание про нестабильный режим работы марвела)? Ну и какие могут быть еще подводные камни?
Go to the top of the page
 
+Quote Post
Victor®
сообщение Sep 26 2012, 18:56
Сообщение #2


Lazy
******

Группа: Свой
Сообщений: 2 070
Регистрация: 21-06-04
Из: Ukraine
Пользователь №: 76



Цитата(ovs_pavel @ Sep 26 2012, 20:56) *
Вечер добрый. Не поделитесь опытом приема данных с Marvell'a. Суть проблемы в следующем. Персоналка подключается к плате на которой стоит Marvel в режиме 1Гбит (GMII).
В режиме GMII идет нестабильный прием данных, т.е. например с персоналки подаю пакет с MAK-адресом 122334455667, а на приемной стороне (сделал тестовое ФИФО в которое все пишу по RX_En) получаю 162334455667. Вообщем биты "вылетают" при приеме. Зависимость получается и от раскладки проекта (меняю тестовые сигналы - переназначаю, также меняется и положение вылетающих битов). Хотя весь проект сделан абсолютно синхронно от тактовой частоты приемопередатчика RX_CLK. Привязываю к ней и данные и соответствующие управляющие сигналы на входе и после этого начинаю их анализ, ну все как полагается.

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


Смотрите даташит на марвелл. Ваша задача полностью обеспечить
требуемые времянки. Потом двигайтесь далее.
Про нестабильность работы марвела забудьте.
Лет 7 использую - проблем не было никогда.


--------------------
"Everything should be made as simple as possible, but not simpler." - Albert Einstein
Go to the top of the page
 
+Quote Post
Flood
сообщение Sep 26 2012, 21:28
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 702
Регистрация: 8-06-06
Пользователь №: 17 871



Цитата(ovs_pavel @ Sep 26 2012, 21:56) *
Возникает несколько вопросов: необходимо ли вводить констрейны на входную шину данных?


В общем случае, на внешние шины нужно задавать констрейны серии OFFSET (Xilinx) для явного указания времен setup/hold согласно спецификации на внешнюю шину.
Go to the top of the page
 
+Quote Post
ovs_pavel
сообщение Sep 27 2012, 04:14
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 275
Регистрация: 19-05-06
Пользователь №: 17 249



Цитата(Victor® @ Sep 26 2012, 22:56) *
Смотрите даташит на марвелл. Ваша задача полностью обеспечить
требуемые времянки. Потом двигайтесь далее.
Про нестабильность работы марвела забудьте.
Лет 7 использую - проблем не было никогда.


На времянке минимальное время установки данных до начала тактового сигнала у Marvell'a (Tsu_gmii) - 2,5нсек. Возможно ПЛИСе не хватает этого времени для предустановки данных? Просто - полностью обеспечить требуемые времянки - не совсем понятно. Времянки обеспечивает марвел. На приеме я лишь захлопываю их по тактовой.
Go to the top of the page
 
+Quote Post
ovs_pavel
сообщение Sep 27 2012, 07:05
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 275
Регистрация: 19-05-06
Пользователь №: 17 249



Цитата(Flood @ Sep 27 2012, 01:28) *
В общем случае, на внешние шины нужно задавать констрейны серии 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)?
Go to the top of the page
 
+Quote Post
TRILLER
сообщение Sep 27 2012, 07:28
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 180
Регистрация: 17-02-09
Из: Санкт-Петербург
Пользователь №: 45 001



"Зависимость получается и от раскладки проекта" - В первую очередь установите триггеры захвата данных в "лапы"!!! Тогда точно не будет изменений при переразводке проекта. Дам 90% что это поможет. У вас, скорее всего, данные до захвата идут по кристаллу неизвестно сколько..
Go to the top of the page
 
+Quote Post
ovs_pavel
сообщение Sep 27 2012, 07:59
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 275
Регистрация: 19-05-06
Пользователь №: 17 249



Цитата(TRILLER @ Sep 27 2012, 11:28) *
"Зависимость получается и от раскладки проекта" - В первую очередь установите триггеры захвата данных в "лапы"!!! Тогда точно не будет изменений при переразводке проекта. Дам 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;
Go to the top of the page
 
+Quote Post
ovs_pavel
сообщение Sep 27 2012, 10:44
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 275
Регистрация: 19-05-06
Пользователь №: 17 249



Цитата(TRILLER @ Sep 27 2012, 11:28) *
"Зависимость получается и от раскладки проекта" - В первую очередь установите триггеры захвата данных в "лапы"!!! Тогда точно не будет изменений при переразводке проекта. Дам 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?


Go to the top of the page
 
+Quote Post
ovs_pavel
сообщение Sep 27 2012, 11:52
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 275
Регистрация: 19-05-06
Пользователь №: 17 249



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

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;" необходимо либо сдвинуть тактовую, либо всю шину данных?
Go to the top of the page
 
+Quote Post
TRILLER
сообщение Sep 27 2012, 15:19
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 180
Регистрация: 17-02-09
Из: Санкт-Петербург
Пользователь №: 45 001



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

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.gif
Надо выбрать что-либо одно)
Go to the top of the page
 
+Quote Post
ovs_pavel
сообщение Sep 27 2012, 17:32
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 275
Регистрация: 19-05-06
Пользователь №: 17 249



Цитата(TRILLER @ Sep 27 2012, 19:19) *
Не усложняйте себе жизнь.

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.gif
Надо выбрать что-либо одно)


Так изначально у меня и были ограничения только по частоте и пинам, за исключением 1-ой строчки: NET "rx_clk" CLOCK_DEDICATED_ROUTE = FALSE; - этого не было, т.к. я тактовую завел сразу на глобальный пин. Все остальное было также. Режим работы GMII. И при приеме возникали ошибки. Поэтому и начал вводить констейны по времянке (setup и hold time), как рекомендуют в доке UG138. Если бы не ошибки, я бы и не углублялся в изучение данного вопроса. Но ограничений по одной лишь частоте не хватает.
А вы же рекомендовали сделать констрейны по пинам, ну т.е. использовать конструкцию
INST "U9/GM_TxD*" IOB = true ;
или я что то не так понял?
Go to the top of the page
 
+Quote Post
VladimirB
сообщение Sep 27 2012, 20:14
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 614
Регистрация: 12-06-09
Из: рядом с Москвой
Пользователь №: 50 219



Ставьте триггеры в ИОБы, а остальные добавленные ОФФСЕТ констреинты убирайте - ругань ИСЕ сразу пропадёт, а приём данных стабилизируется.
Go to the top of the page
 
+Quote Post
TRILLER
сообщение Sep 28 2012, 07:55
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 180
Регистрация: 17-02-09
Из: Санкт-Петербург
Пользователь №: 45 001



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

Сообщение отредактировал TRILLER - Sep 28 2012, 08:00
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01774 секунд с 7
ELECTRONIX ©2004-2016