new123 0 7 сентября, 2020 Опубликовано 7 сентября, 2020 · Жалоба Форумчане, добрый день. Имею проблемы в проекте, на железе, в симуляторе такое не воспроизводится. Путем многих тестов понял, что все ноги растут от различных FIFO. 1) Частая проблема - пропуски записываемых слов. То есть пишу много слов в FIFO, вычитываю, а там есть пропуски. 2) Еще одна проблема. count_fifo > 0, empty = false. Начинаю читать, а от туда (из fifo) ничего не выходит. Проблема вылезают только тогда, когда даешь этой фифо сильную нагрузку. Ну например, писать каждый такт неограниченное число раз. Что делал для решения: 1) Пытаюсь снять нагрузку. Удается даже записать без проблем 4000 тактов подряд. 2) Экспериментирую с параметрами. Помог частями в одном месте параметр sync_stage >= 3 Задним умом понимаю, что проблема возможно лежит в области памяти. Но в мануале по Stratix V написано, что память (M20K) легко переваривает до 600Mhz (Я работаю от 150 до 280Mhz). Так же в мануале написано, что скорость работы - 1 такт. Я бы с удовольствием бы приглядывал за каким нибудь флагом wait, как это распространено у альтеры, но тут такого нет. Собственно вопрос, что делать, я наверное не задаю. Хотелось бы подтвердить свои сомнения насчет FIFO, бывало ли у кого такое же и что с этим делали, если да? Пока напрашивается ответ накидать свое. Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DimaG 0 7 сентября, 2020 Опубликовано 7 сентября, 2020 · Жалоба Скорее всего некорректно работаете с флагами empty, full. Попробуйте работать с ними так: wr_en = !full && ... rd_en = !empty && ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 7 сентября, 2020 Опубликовано 7 сентября, 2020 · Жалоба 2 minutes ago, DimaG said: rd_en = !empty && ... так и делаю, грубо говоря вот так sync_fifo sync_fifo ( .rdclk (), .rdreq ((!wire_sync_empty)? 1'b1: 1'b0), .q (), .rdempty (wire_sync_empty), .wrclk (), .wrreq (), .data () ); full не проверял, пробовал делать огромные fifo, чтобы точно переполнений не было, еще приглядываю в сигналтапе за заполнением (кол-ом слов), момент сбоя конечно не удается записать, но fifo всегда практически свободные. Попробую может full половить действительно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DimaG 0 7 сентября, 2020 Опубликовано 7 сентября, 2020 · Жалоба Еще кстати: ЕМНИП, на Стратиксе 10 для FIFO требовался ОБЯЗАТЕЛЬНЫЙ сброс, иначе они работали некорректно. Может и для вашего девайса существует аналогичное требование. А full/empty проверять надо всегда. Вне зависимости от размеров FIFO. На таких частотах моргнул - и оно уже забито :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 7 сентября, 2020 Опубликовано 7 сентября, 2020 · Жалоба Приветствую! 2 hours ago, new123 said: Имею проблемы в проекте, на железе, в симуляторе такое не воспроизводится. Путем многих тестов понял, что все ноги растут от различных FIFO. 1) Частая проблема - пропуски записываемых слов. То есть пишу много слов в FIFO, вычитываю, а там есть пропуски. 2) Еще одна проблема. count_fifo > 0, empty = false. Начинаю читать, а от туда (из fifo) ничего не выходит. Все проблемы с FIFO (стандартных) обычно возникают из за неправильного понимания особенностей их работы. Из возможных проблем - некорректный сброс FIFO - Для некоторых типов требуется сброс не менее заданного числа тактов, некорректная работа с флагами и счетчиками данных - Стандартные FIFO что у Xilinx что у Intel обычно гарантируют корректное состояние такт-в такт лишь для флагов. FULL на стороне записи, EMPTY на стороне чтения. Счетчики слов обычно могут задержаны на такт (или даже больше) от состояния флагов. Из физических проблем - некорректное задание констрейнов приводящая к отсутствию контроля задержек между регистрами gray-code синхронизатора. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novartis 0 7 сентября, 2020 Опубликовано 7 сентября, 2020 · Жалоба Чтение и запись на одной частоте идут или на двух? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 7 сентября, 2020 Опубликовано 7 сентября, 2020 · Жалоба 5 minutes ago, novartis said: Чтение и запись на одной частоте идут или на двух? в целом на разных (dcfifo). Было даже так, есть fifo, который подвергается сильной нагрузке, но разово, не постоянно, работал на одной частоте. И я решил стабилизировать его работу и сделал его асинхронное dcfifo, выставил ему параметры по метастабильность (sync_stage = 3) и стало работать нормально, при этом и чтение и запись на одной частоте. Но в целом, те что сбоят, они работают на разных. При этом у них у всех чтение сразу же, когда !empty на read стороне. Специфика заполняемости и разность частот таково, что ну никак full не может быть, но сейчас решил все таки этот момент поисследовать 1 hour ago, DimaG said: на Стратиксе 10 для FIFO требовался ОБЯЗАТЕЛЬНЫЙ сброс спасибо запомню, так как на него тоже буду мигрировать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DimaG 0 7 сентября, 2020 Опубликовано 7 сентября, 2020 · Жалоба 17 minutes ago, new123 said: спасибо запомню, так как на него тоже буду мигрировать На всякий случай пруф: https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/hb/stratix-10/ug-s10-memory.pdf стр. 82 Quote Note: For Intel Stratix 10 devices, you must assert either aclr or sclr upon power-up to guarantee correct functionality Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 7 сентября, 2020 Опубликовано 7 сентября, 2020 · Жалоба 4 часа назад, DimaG сказал: Скорее всего некорректно работаете с флагами empty, full. Попробуйте работать с ними так: wr_en = !full && ... rd_en = !empty && ... Это делается внутри FIFO. Делать это ещё раз снаружи смысла никакого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 7 сентября, 2020 Опубликовано 7 сентября, 2020 · Жалоба Мда.. форумчане убедили меня проверить full, а оно там очень часто оказалось. Буду разбираться, что за беда такая. Временно всем спасибо =). Получается флаги надо тщательнее смотреть Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 7 сентября, 2020 Опубликовано 7 сентября, 2020 · Жалоба 6 minutes ago, new123 said: убедили меня проверить full, а оно там очень часто оказалось. Буду разбираться, что за беда такая А если в настройках fifo указать, чтобы оно не принимало больше того, что может принять. Тогда должен появиться сигнал wait со входной стороны. Ну и источник данных должен уметь притормозить по этому сигналу... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 7 сентября, 2020 Опубликовано 7 сентября, 2020 · Жалоба Приветствую! 1 minute ago, Yuri124 said: А если в настройках fifo указать, чтобы оно не принимало больше того, что может принять. Тогда должен появиться сигнал wait со входной стороны. Ну и источник данных должен уметь притормозить по этому сигналу... Вообще то для этого FULL и предназначен - этот сигнал как раз и говорить о том что FIFO "сыто по горло вашими данными" - зачем еще какой то wait? Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 7 сентября, 2020 Опубликовано 7 сентября, 2020 · Жалоба 7 minutes ago, Yuri124 said: А если в настройках fifo указать, чтобы оно не принимало больше того, что может принять ага, я эту настройку не отключаю, там галочка за это отвечает. Встроенная проверка на overflow и на empty. Но wait нет. Я вообще про wait имел ввиду, чтобы подождать при чтении. 8 minutes ago, Yuri124 said: Тогда должен появиться сигнал wait со входной стороны я помню, вы как то писали нечто подобное, но про fifo в qsys platform (не знаю как правильно обозвать), я после этого глянул, там действительно сигналов было побольше. А у меня сейчас простой altera fifo megafunction 4 minutes ago, RobFPGA said: Ну и источник данных должен уметь притормозить по этому сигналу источник внешний =) я ему не указ. Вообще соотношение частот wr/rd и частота записи такова, что fifo не должен забиваться больше 4, что и демонстрирует даже симулятор. На деле у меня даже 32xxx забивается. Буду выяснять. Может пишет более быстро, придется частоты проверить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 7 сентября, 2020 Опубликовано 7 сентября, 2020 · Жалоба 1 hour ago, new123 said: источник внешний =) я ему не указ ИМХО тут как раз Вы не правы. Если есть система, которая зависит от приходящих данных, то Вы и являетесь указом сколько и чего можно принять. Но если есть подозрение, что отправитель пишет больше положенного,, то должен либо стоять менеджер, либо что-то не так с приёмом. А контролировать сколько и что принимать может именно система! Даже если без обратных связей Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 7 сентября, 2020 Опубликовано 7 сентября, 2020 (изменено) · Жалоба 6 hours ago, DimaG said: ЕМНИП, на Стратиксе 10 для FIFO требовался ОБЯЗАТЕЛЬНЫЙ сброс, иначе они работали некорректно. надо же какая штука. Как только у себя подключил сброс (в симуляторе сделал общий сброс первые 10 тактов), то симулировать начало нормально, со всеми переполнениями и всеми вытекающими, все как в реале Изменено 7 сентября, 2020 пользователем new123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться