ovs_pavel 0 26 сентября, 2012 Опубликовано 26 сентября, 2012 · Жалоба Вечер добрый. Не поделитесь опытом приема данных с Marvell'a. Суть проблемы в следующем. Персоналка подключается к плате на которой стоит Marvel в режиме 1Гбит (GMII). В режиме GMII идет нестабильный прием данных, т.е. например с персоналки подаю пакет с MAK-адресом 122334455667, а на приемной стороне (сделал тестовое ФИФО в которое все пишу по RX_En) получаю 162334455667. Вообщем биты "вылетают" при приеме. Зависимость получается и от раскладки проекта (меняю тестовые сигналы - переназначаю, также меняется и положение вылетающих битов). Хотя весь проект сделан абсолютно синхронно от тактовой частоты приемопередатчика RX_CLK. Привязываю к ней и данные и соответствующие управляющие сигналы на входе и после этого начинаю их анализ, ну все как полагается. Возникает несколько вопросов: необходимо ли вводить констрейны на входную шину данных? Двигали ли вы входную частоту по фазе относительного входной шины данных (где то уже по моему проскальзывало упоминание про нестабильный режим работы марвела)? Ну и какие могут быть еще подводные камни? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LV26 0 26 сентября, 2012 Опубликовано 26 сентября, 2012 · Жалоба Вечер добрый. Не поделитесь опытом приема данных с Marvell'a. Суть проблемы в следующем. Персоналка подключается к плате на которой стоит Marvel в режиме 1Гбит (GMII). В режиме GMII идет нестабильный прием данных, т.е. например с персоналки подаю пакет с MAK-адресом 122334455667, а на приемной стороне (сделал тестовое ФИФО в которое все пишу по RX_En) получаю 162334455667. Вообщем биты "вылетают" при приеме. Зависимость получается и от раскладки проекта (меняю тестовые сигналы - переназначаю, также меняется и положение вылетающих битов). Хотя весь проект сделан абсолютно синхронно от тактовой частоты приемопередатчика RX_CLK. Привязываю к ней и данные и соответствующие управляющие сигналы на входе и после этого начинаю их анализ, ну все как полагается. Возникает несколько вопросов: необходимо ли вводить констрейны на входную шину данных? Двигали ли вы входную частоту по фазе относительного входной шины данных (где то уже по моему проскальзывало упоминание про нестабильный режим работы марвела)? Ну и какие могут быть еще подводные камни? Смотрите даташит на марвелл. Ваша задача полностью обеспечить требуемые времянки. Потом двигайтесь далее. Про нестабильность работы марвела забудьте. Лет 7 использую - проблем не было никогда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flood 13 26 сентября, 2012 Опубликовано 26 сентября, 2012 · Жалоба Возникает несколько вопросов: необходимо ли вводить констрейны на входную шину данных? В общем случае, на внешние шины нужно задавать констрейны серии OFFSET (Xilinx) для явного указания времен setup/hold согласно спецификации на внешнюю шину. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ovs_pavel 0 27 сентября, 2012 Опубликовано 27 сентября, 2012 · Жалоба Смотрите даташит на марвелл. Ваша задача полностью обеспечить требуемые времянки. Потом двигайтесь далее. Про нестабильность работы марвела забудьте. Лет 7 использую - проблем не было никогда. На времянке минимальное время установки данных до начала тактового сигнала у Marvell'a (Tsu_gmii) - 2,5нсек. Возможно ПЛИСе не хватает этого времени для предустановки данных? Просто - полностью обеспечить требуемые времянки - не совсем понятно. Времянки обеспечивает марвел. На приеме я лишь захлопываю их по тактовой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ovs_pavel 0 27 сентября, 2012 Опубликовано 27 сентября, 2012 · Жалоба В общем случае, на внешние шины нужно задавать констрейны серии 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)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 27 сентября, 2012 Опубликовано 27 сентября, 2012 · Жалоба "Зависимость получается и от раскладки проекта" - В первую очередь установите триггеры захвата данных в "лапы"!!! Тогда точно не будет изменений при переразводке проекта. Дам 90% что это поможет. У вас, скорее всего, данные до захвата идут по кристаллу неизвестно сколько.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ovs_pavel 0 27 сентября, 2012 Опубликовано 27 сентября, 2012 · Жалоба "Зависимость получается и от раскладки проекта" - В первую очередь установите триггеры захвата данных в "лапы"!!! Тогда точно не будет изменений при переразводке проекта. Дам 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ovs_pavel 0 27 сентября, 2012 Опубликовано 27 сентября, 2012 · Жалоба "Зависимость получается и от раскладки проекта" - В первую очередь установите триггеры захвата данных в "лапы"!!! Тогда точно не будет изменений при переразводке проекта. Дам 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ovs_pavel 0 27 сентября, 2012 Опубликовано 27 сентября, 2012 · Жалоба Из сообщений компилятора: 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;" необходимо либо сдвинуть тактовую, либо всю шину данных? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 27 сентября, 2012 Опубликовано 27 сентября, 2012 · Жалоба Не усложняйте себе жизнь. 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: Надо выбрать что-либо одно) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ovs_pavel 0 27 сентября, 2012 Опубликовано 27 сентября, 2012 · Жалоба Не усложняйте себе жизнь. 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 ; или я что то не так понял? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirB 1 27 сентября, 2012 Опубликовано 27 сентября, 2012 · Жалоба Ставьте триггеры в ИОБы, а остальные добавленные ОФФСЕТ констреинты убирайте - ругань ИСЕ сразу пропадёт, а приём данных стабилизируется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 28 сентября, 2012 Опубликовано 28 сентября, 2012 (изменено) · Жалоба "А вы же рекомендовали сделать констрейны по пинам, ну т.е. использовать конструкцию INST "U9/GM_TxD*" IOB = true ;" - я написал, что использую примитив IDDR, а они находятся ТОЛЬКО в "лапах". Вы IDDR не используете, значит обязательно надо жёстко прописывать INST "U9/GM_TxD*" IOB = true. И уберите OFFSET ) Изменено 28 сентября, 2012 пользователем TRILLER Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться