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

Altera DCFIFO, проблемы при высокой нагрузке

Форумчане, добрый день.

Имею проблемы в проекте, на железе, в симуляторе такое не воспроизводится. Путем многих тестов понял, что все ноги растут от различных 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, бывало ли у кого такое же и что с этим делали, если да? Пока напрашивается ответ накидать свое.

 

Заранее спасибо.

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


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

Скорее всего некорректно работаете с флагами empty, full.

 

Попробуйте работать с ними так:

wr_en = !full && ...

rd_en = !empty && ...

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


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

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 половить действительно.

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


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

Еще кстати: ЕМНИП, на Стратиксе 10 для FIFO требовался ОБЯЗАТЕЛЬНЫЙ сброс, иначе они работали некорректно. Может и для вашего девайса существует аналогичное требование.

А full/empty проверять надо всегда. Вне зависимости от размеров FIFO. На таких частотах моргнул - и оно уже забито :)

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


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

Приветствую!

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.

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


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

5 minutes ago, novartis said:

Чтение и запись на одной частоте идут или на двух?

в целом на разных (dcfifo).

Было даже так, есть fifo, который подвергается сильной нагрузке, но разово, не постоянно, работал на одной частоте. И я решил стабилизировать его работу и сделал его асинхронное dcfifo, выставил ему параметры по метастабильность (sync_stage = 3) и стало работать нормально, при этом и чтение и запись на одной частоте.

Но в целом, те что сбоят, они работают на разных. При этом у них у всех чтение сразу же, когда !empty на read стороне. Специфика заполняемости и разность частот таково, что ну никак full не может быть, но сейчас решил все таки этот момент поисследовать

1 hour ago, DimaG said:

на Стратиксе 10 для FIFO требовался ОБЯЗАТЕЛЬНЫЙ сброс

спасибо запомню, так как на него тоже буду мигрировать

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


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

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

 

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


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

4 часа назад, DimaG сказал:

Скорее всего некорректно работаете с флагами empty, full.

 

Попробуйте работать с ними так:

wr_en = !full && ...

rd_en = !empty && ...

Это делается внутри FIFO. Делать это ещё раз снаружи смысла никакого.

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


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

Мда.. форумчане убедили меня проверить full, а оно там очень часто оказалось. Буду разбираться, что за беда такая. Временно всем спасибо =). Получается флаги надо тщательнее смотреть

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


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

6 minutes ago, new123 said:

убедили меня проверить full, а оно там очень часто оказалось. Буду разбираться, что за беда такая

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

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


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

Приветствую!

1 minute ago, Yuri124 said:

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

Вообще то для этого FULL и предназначен  - этот сигнал как раз и говорить о том что FIFO  "сыто по горло вашими данными" - зачем еще какой то wait? 

 

Удачи! Rob.

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


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

 

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 забивается. Буду выяснять. Может пишет более быстро, придется частоты проверить.

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


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

1 hour ago, new123 said:

источник внешний =) я ему не указ

ИМХО тут как раз Вы не правы. Если есть система, которая зависит от приходящих данных, то Вы и являетесь указом сколько и чего можно принять. Но если есть подозрение, что отправитель пишет больше положенного,, то должен либо стоять менеджер, либо что-то не так с приёмом. А контролировать сколько и что принимать может именно система! Даже если без обратных связей

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


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

6 hours ago, DimaG said:

ЕМНИП, на Стратиксе 10 для FIFO требовался ОБЯЗАТЕЛЬНЫЙ сброс, иначе они работали некорректно.

надо же какая штука. Как только у себя подключил сброс (в симуляторе сделал общий сброс первые 10 тактов), то симулировать начало нормально, со всеми переполнениями и всеми вытекающими, все как в реале

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

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


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

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

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

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

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

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

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

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

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

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