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

DDR4 работает со сбоями но калибровка проходит

Использую Kintex UltraScale XCKU-040 и -060. На обоих наблюдается проблема, которую я раньше не видел, то есть повреждение памяти физически я пока что исключаю. На обоих платах 64 битная память DDR4 которую я пытаюсь использовать на частоте 625, 666 и 800 МГц, стараюсь брать поменьше частоту.

 

Наблюдаю следующую проблему. Пишу некий паттерн (счетчик) из 32 битных слов, сама шина контроллера памяти wdf (использую native интерфейс) - 512 бит. Слова такие 32'h0016_0000 .. 32'h0016_000F, для следующих 512 бит уже 32'h0017_0000 .. 32'h0017_000F, то есть вижу четко что писал и могу понять верно ли оно просто по адресу.

 

Проблема: как пишется не знаю, но читается не всегда верно, причем из 512 бит шины контроллера native, может быть несколько слов иметь практически всегда ошибочные данные, а некоторые части этих 512 бит имеют наоборот очень низкое число ошибок, но никогда не нулевое.

 

Пробовал не записывать а просто читать записанное, то есть записал 1 раз и далее читать по несколько раз. Удивительно, при повторных чтениях число ошибок может даже уменьшаться, но при чтении результаты в целом повторяются, большинство сбоев локализованы в одних и тех же местах. Вероятно чтение неверное. Документация четко говорит - данные валидны только при app_rd_data_valid - приходит строб и я беру данные по нему. Ошибок таймингов в прошивке нет.

 

Что я пробовал: 1) делать тест с отдельным модулем MIG и простым конечным автоматом читать-писать в цикле и выводом в UART 2) пробовал ставить другие совместимые компоненты памяти не 075 а например 083 и 107 спид грейдом 3) пробовал режимы no dm без маски 4) пробовал понижать частоту памяти 5) пробовал задавать побольше тайминги DDR 6) создал проект на базе microblaze и block design чтобы работать с памятью из microblaze по шине AXI - вдруг причина была в этом 7) пробовал играть с резетами - может это и причина но я упустил что то?

Что еще можно попробовать, как устранить проблему что чтение идет со сбоями? Калибровка то проходит успешно, значит явно я делаю что то не так, но я уже несколько недель с этим борюсь и не понимаю почему "раньше я умел" а сейчас талант работы с DDR покинул меня...

 

Тайминги - вручную не баловался не менял, всё через FIFO или XPM_CDC.

 

Планирую еще раз запустить моделирование (давно делал). Посмотреть что с app_wdf_end сигналом - я ставлю 1 при каждой записи - корректно же? Пишу ведь рывками, единичными по 512 бит и не более того.

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


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

35 минут назад, 1891ВМ12Я сказал:

Ошибок таймингов в прошивке нет.

А в топологии платы их точно нет? Что это за плата, насколько проверена её топология (дурят отдельные экземпляры или все подряд)?

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


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

А тайминги 100% верные? С поправкой на нагрев? У меня были случаи, когда DDR3 прекрасно проходила все тесты "на холодную". И вставала клином при хорошем нагрева FPGA и памяти. 

Ну или топология остается. 

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


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

On 12/31/2023 at 5:13 PM, makc said:

А в топологии платы их точно нет? Что это за плата, насколько проверена её топология (дурят отдельные экземпляры или все подряд)?

+1

Плату с DDR4 полезно проверить:

- все сигналы DDR4 имеют хороший опорный слой

- тайминги (длины + встроенные длины для byte-lane, ADDR/CMD приходят одновременно на каждую м/с)

- могут быть резонансы по питанию на рабочих частотах, пару раз сталкивался лично

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


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

5 hours ago, _Sergey_ said:

- могут быть резонансы по питанию на рабочих частотах, пару раз сталкивался лично

поясните пожалуйста

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


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

6 minutes ago, Maverick_ said:

поясните пожалуйста

На какой-то частоте Power Delivery Network увеличивает свое сопротивление. Напряжение питания на микросхеме уменьшается, выходя из допустимых пределов.

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


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

On 1/1/2024 at 12:40 AM, DanilinS said:

А тайминги 100% верные? С поправкой на нагрев? У меня были случаи, когда DDR3 прекрасно проходила все тесты "на холодную". И вставала клином при хорошем нагрева FPGA и памяти. 

Ну или топология остается. 

Делаю тест для двух плат. Первая - отладочная плата HTG-800 трофейная http://www.hitechglobal.com/boards/kintex-ultrascale.htm Вторая плата - уже самодельная. Тоже на Kintex UltraScale

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

 

Трагизм ситуации в том, что я не могу понять что я делаю не так, когда переделываю проект заново. Я все уже перебрал варианты. Вижу что записав раз, а потом только читая, я вижу что иногда число ошибок снижается. Значит я точно теряю на чтении.

 

Я нашел что в тестовом примере применяется промежуточный регистр для данных и строба валид - только что проверил с точно таким же дополнительным шагом без дополнительных условий и это не помогло.

 

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

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


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

Уточните, все же есть комбинация платы и проекта Vivado, на которых DDR4 работает хорошо (например, та же HTG-800 с примером от HiTech Global)? А то из ваших постов это неясно.

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


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

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

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


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

14 hours ago, Raven said:

Уточните, все же есть комбинация платы и проекта Vivado, на которых DDR4 работает хорошо (например, та же HTG-800 с примером от HiTech Global)? А то из ваших постов это неясно.

Да, такая комбинация существовала, и для HTG-800 и для самодельной платы, то есть комбинация на которой работало. И я не понимаю почему сейчас перестало, как я подозреваю, читать память без ошибок. Не верю что сразу две платы сломались - это нереально.

 

Пробовал еще сейчас натравить XDC на ddr example сгенерированный - код писали умные люди, а он не заработал на HTG-800 и показал read corrupted на светодиоде. Пробовал делать Block Design с AXI интерфейсом к контроллеру - мало ли я неверно как то работал. Снова не так. Пробовал понижать частоту на самый минимум до 625/633 МГц - не помогло.

 

У меня была еще плата на Kintex 7 официальная, так там была битая память и явно не проходила калибровку - дело ясное. Но у меня сейчас обе платы и HTG-800 и самопальная - обе калибровку проходят. Значит интерфейс верный и рабочий. Тайминги все идеальные, использую FIFO и XPM-CDC а значит задано верно всё везде.

 

Может что то в XDC нужно указать иначе? Попробую тактовый сигнал иной указать как источник для DDR - есть второй генератор 200 на плате. Установил Vivado 2023.1 и его попробую - может вивадо со сбоем что то генерить стала, но я пробовал и вивадо 2018.2/3 на которых когда то работало...

 

Если решу проблему - обязательно тут напишу. Но смущает одно - калибровка то проходит! Где тогда не так, если официальный экзампл даже валится при всей его проходимости калибровке (вижу на светодиоде).

 

P.S. Важно, что на самодельной плате, и 512 бит, максимум ошибок приходится на первые 32 бит в остальные ошибки около нуля - самодельная даже лучше работает если это можно назвать работает. На HTG-800 выбито чуть больше половины шины данных, но в начале и по краям ошибки минимальны. Сколько я ни пытался разводить прошивок - локализация сохраняется. Может надо как то дополнительно навернуть каких то XDC правил?

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


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

2 hours ago, 1891ВМ12Я said:

Да, такая комбинация существовала, и для HTG-800 и для самодельной платы, то есть комбинация на которой работало. И я не понимаю почему сейчас перестало, как я подозреваю, читать память без ошибок. Не верю что сразу две платы сломались - это нереально.

И где теперь эти рабочие проекты и их битстримы? Или теперь уже и ровно те самые проекты/битстримы перестали работать?

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


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

4 hours ago, 1891ВМ12Я said:

Да, такая комбинация существовала, и для HTG-800 и для самодельной платы, то есть комбинация на которой работало. И я не понимаю почему сейчас перестало, как я подозреваю, читать память без ошибок. Не верю что сразу две платы сломались - это нереально.

К работающей прошивке что-то добавлялось?

Типа сначала было задействовано 30%, а сейчас 80%..

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


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

On 1/4/2024 at 9:10 PM, _Sergey_ said:

К работающей прошивке что-то добавлялось?

Типа сначала было задействовано 30%, а сейчас 80%..

Сейчас я пытаюсь работать с максимально облегченным проектом. И тогда и сейчас стандартный ddr example (генерируется ядром) берет не более 5% ресурсов. Я заметил что если оставить стандартные для теста 100 итераций или даже сделать 500 итераций (вижу что там есть лимит счетчика, его легко можно расширить до 32 бит) - вот 100 и 500 итераций - тест проходит. Заливаю заново - снова тест прошел.

 

Проблема начинается тогда когда итераций несколько тысяч, при том что в симуляции мой тест может успешно пройти все эти, скажем 125 тысяч итераций, стало быть логика верна, а реальная память такой тест не проходит. Даже если делать 16 битный интерфейс (чипы по 16 бит), похоже все микросхемы DDR4 памяти ведут себя одинаково.

 

Понижение частоты не помогает, тайминги и так занижены до невозможности, задержки не помогают.

 

Вот мысль - корректно ли создать свои параметры для памяти? Custom, я уже изучал их формат это CSV файлы. Что если задать больше задержки и больше паузы? Или память не примет что либо, выходящее за ее рамки, заданные в даташитах?

 

On 1/4/2024 at 7:17 PM, Raven said:

И где теперь эти рабочие проекты и их битстримы? Или теперь уже и ровно те самые проекты/битстримы перестали работать?

Очень боюсь внести путаницу, отладочная плата HTG-800 проверялась только стандартным тестом - калибровка проходила и малое число итераций не выдает ошибки, проблема когда итераций много, значит стандартный тест ложный, не выдерживает буквально несколько тысяч чтений (а мне надо миллиарды). Впрочем и сейчас, даже в штатном проекте, когда мало итераций - все записи и чтения могут быть без ошибок. Вся беда в стабильности работы. Тесты - они быстрее пересобираются, и выявляют те же проблемы.

 

Попробую собрать старый проект и вернуть программную часть. Однако в рабочем проекте по этой части ничего не менялось. И боюсь что проблема проекта уже в PCI - там тоже проблема с которой я бьюсь, на новом процессорном модуле стал шалить PCI и я не могу работать по старому и не могу работать со старым битстримом. Самодельной платы у меня нет, ее забрали как раз. Проверить старое рабочее это правильная идея, но и она проблематична из за других сбоев и из за сбоев аналогичных в памяти. Я не могу там UART попросить подключить для отладки - там невозможно. Плохо...

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


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

Моя мысль простая - задействовано больше ресурсов, увеличилось потребление, просело питание.

Там есть допуски по 50мВ.

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


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

On 1/6/2024 at 10:05 AM, _Sergey_ said:

Моя мысль простая - задействовано больше ресурсов, увеличилось потребление, просело питание.

Там есть допуски по 50мВ.

Температура низкая - ниже 40 градусов, проект заполнен на 5%, беру от мощного источника питания где 6-pin разъем для видеокарты - он превышает потребность отладочной платы при ее максимальной загрузке.

 

Я обнаружил парадоксальную вещь в тесте ddr (стандартный), я его уже обложил светодиодами и UARTами, как только число итераций теста превосходит 740 и становится 750 - всё, идет сбой теста.

 

У меня возникает подозрение что несмотря на опору на ready сигналы, случается рефреш и всё валится. Пробовал ставить manual refresh и соотвественно тест управляет этим сам. Завтра попробую изменить хотя бы немного, сделать это чаще, найти место где управляется manual refresh через специальный порт. Я всегда полагался что рефреш делается сам, и когда оно занято этим, то я просто не получаю свои рэдики и всё становится на паузу пока не отрефрешится. Ранее меня это не подводило, но я уже подозреваю именно рефреш, очень подозрительно точная граница числа тестов с ошибками и без, но радует что все эти 740 транзакций проходят без сбоев, а там много циклов по 512 бит полных. Хоть 20 хоть 30 раз делаю сброс - оно калибруется и запускает тест заново - все 30 раз оно пройдет тест с 740 циклами. А например 750 уже нет хоть 20-30 раз сбрасывать. Вероятно существует плавающая граница между 740 и 750 числом итераций теста.

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


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

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

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

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

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

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

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

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

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

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