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

Форумчане привет. 

Имею
1) Altera FIFO
2) Скорость чтения и записи разные.  Чтение быстрее.
3) Ширина шины 256 бит.
4) Фифо большой. На 512 слов.
5) В нем данные стараюсь не копить, вычитаю сразу же. За исключением некоторых моментов.

 

С чем столкнулся. Доподлинно не известно, только гадаю по дампу полученной памяти. Имею проблему, что несколько раз подряд вычитал одни и те же 256 бит. Ситуация очень редко, но бывает. Бывает прогонишь одни и те же данные - нормально, а бывает раз и где то в концовке продублирует пару раз 256 бит.

6) Когда я ставлю флаг на чтение, я всегда проверяю, пустое ли FIFO со стороны чтения?. Если не пустое, ставлю флаг на чтение.
7) Это всегда происходит под концовку данных. То есть, когда FIFO уже близок или уже практически опустошен.
8) Ситуация плавающая. В Моделсиме я и так и сяк крутил данные, воспроизвести не могу, склоняюсь что проблема на железе, какой то не знаемый мною нюанс работы с памятью.

 

В связи с этим вопрос. Может ли флаг fifo_emty выдавать неверный результат? Почему спрашиваю? Как то на форуме затронулось обсуждение, что с FIFO могут быть проблемы. Возможно я не правильно понял.
И второй вопрос, который меня волнует еще больше. Я взвожу флаг read ровно на один такт. Может ли данные из фифо "выходить" не на следующем такте, а например через два. Это не шина Avalon, тут не проверить состояние запросов.

 

Может кто сталкивался, как решали?
Заранее спасибо.

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

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


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

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

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


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

2 hours ago, new123 said:

Может ли данные из фифо "выходить" не на следующем такте, а например через два. Это не шина Avalon, тут не проверить состояние запросов.

Думаю, что это исключено. Задержка всегда одна и та же, если в FIFO есть данные, о чем явно указывает строб "не пусто" и вы хотите их прочитать. Другое дело, что от входа до выхода FIFO количество тактов может быть различным ввиду различного числа степеней синхронизации между портами и т.д. Иными словами, если вы записали в FIFO слово, то попадает оно в выходной порт с некоторой задержкой и не всегда детерминированной. Но если в FIFO есть слово, т.е. оно не пусто, то по стробу чтения данные должны выходить с оговоренной задержкой, иначе этим нереально было бы пользоваться.

 

А вообще очень похоже на банальное нарушение таймингов. Строб пустоты не успевает остановить чтение, например.

 

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

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


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

У фифошек от Xilinx есть дополнительный флаг valid. Он гарантирует что вы читаете не из пустой фифошки. Я обычно разделяю логику запросов (fifo_rd = ~fifo_empty в самом простом случае) и логику записи из фифошки в следующий регистр (reg_we = fifo_valid).

Таким образом, при попытке прочитать из пустой фифошки флаг валидности не будет выставлен. Будет нарушено количество чтений, но не целостность данных. Кроме того, данная схема позволяет не заморачиваться вопросом через сколько тактов после запроса на чтение на выходе появятся данные ( а тут могут быть разные варианты ) - всё регулируется флажком валидности.

 

И ещё. Если вы защелкиваете флаг пустого фифо и из этого формируете строб чтения - так делать нельзя. Рано или поздно наступите на грабли чтения из пустого фифо. Можно только на комбинаторике fifo_rd = ~fifo_empty & _еще_какое_то_условие_если_это_нужно_;

 

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


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

Попробуйте вывести все возможные флаги FIFO и ищите закономерномести при неправильном считывании. Все таки альторовские IP верифицированные, поэтому вряд ли глючит именно сам блок, скорее всего некая обвязка.

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


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

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

8 hours ago, new123 said:

В связи с этим вопрос. Может ли флаг fifo_emty выдавать неверный результат?

Нет,  не может. -  Флаги (full, empty) отображают актуальную информацию о состоянии FIFO с соответствующей стороны (write, read).  

8 hours ago, new123 said:

6) Когда я ставлю флаг на чтение, я всегда проверяю, пустое ли FIFO со стороны чтения?. Если не пустое, ставлю флаг на чтение.

А как снимаете разрешение чтения?  Может вы на такт случайно задерживаете снятие вот и получается 2-е чтение из пустого FIFO.  

4 hours ago, Bad0512 said:

И ещё. Если вы защелкиваете флаг пустого фифо и из этого формируете строб чтения - так делать нельзя. Рано или поздно наступите на грабли чтения из пустого фифо. Можно только на комбинаторике fifo_rd = ~fifo_empty & _еще_какое_то_условие_если_это_нужно_;

Это еще почему нельзя? Можно и защелкивать, НО с учетом того что разрешение на чтение идет с задержкой на такт. 

Ищите причину в логике своего дизайна или проблемы с времянкой.   

Удачи! Rob.

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


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

5 hours ago, Bad0512 said:

Если вы защелкиваете флаг пустого фифо и из этого формируете строб чтения - так делать нельзя. Рано или поздно наступите на грабли чтения из пустого фифо.

Примерно именно так я и делаю.

Грубо говоря, примитивно:

assign rd_en = (!rd_empty)? 1'b1: 1'b0

флаг пустоты не гарантирует, что я точно смогу вычитать?

 

Quote

Можно только на комбинаторике fifo_rd = ~fifo_empty & _еще_какое_то_условие_если_это_нужно_;

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

 

1 hour ago, Кнкн said:

Тактирование постоянно подается?

100%. Затактировал с выходных клоков Альтеровских  IP core, специально для этого предназначенных. Их же я тактирую с внешней pll. Если бы где то пропал сигнал, я бы в дампе увидел гигантские потери.

4 hours ago, Nieve said:

Попробуйте вывести все возможные флаги FIFO и ищите закономерномести при неправильном считывании.

решил так с утра и попробовать, в свой дамп закидывать состояние флагов. Будем посмотреть

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

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


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

5 minutes ago, new123 said:

флаг пустоты не гарантирует, что я точно смогу вычитать?

 
Флаг пустоты работает как надо, но он показывает состояние на текущий такт. На следующий такт ситуация может поменяться и это необходимо учитывать.
Полезно также мониторить флаги underflow и overflow.

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


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

1 hour ago, RobFPGA said:

А как снимаете разрешение чтения?  Может вы на такт случайно задерживаете снятие вот и получается 2-е чтение из пустого FIFO.  

Примерно вот так 

assign rd_en = (!rd_empty && !rd_en_prev)? 1'b1: 1'b0

  always @ (posedge clk) begin
    if (reset) begin
    end
    else begin
        rd_en_prev <= rd_en;
    end
  end

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

8 minutes ago, Bad0512 said:

Полезно также мониторить флаги underflow и overflow.

Вариант, не подумал уже ночью =)

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

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


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

1 hour ago, RobFPGA said:

НО с учетом того что разрешение на чтение идет с задержкой на такт

Не совсем понял. 
Я начинаю использовать вычитанные данные сразу после того, как rd_en выставляется в ноль. Правильно делаю? Т.е
 

Такт 1: rd_en = 1
Такт 2: rd_en = 0, использую данные

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


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

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

Получается чтение в лучшем случае через такт.  Но проблем не должно создавать. Ну и фактически rd_en_prev у вас работает как rd_data_valid

В таком случае скорее всего проблемы с времянками. Ну или вы на стороне записи 2 раза пишете одно и тоже :unknw:.

В 90% случаев удобнее использовать FIFO с FWFT режимом  (show-ahead у Altera). В таком случае упрощается логика чтения со стороны пользователя.  

Удачи! Rob.

 

  

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


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

28 minutes ago, RobFPGA said:

FIFO с FWFT режимом  (show-ahead у Altera).

Как раз таки начались проблемы, как переключился с этого режима на Normal. Но я вынужден так сделать.

31 minutes ago, RobFPGA said:

Ну или вы на стороне записи 2 раза пишете одно и тоже

Закралась мысль. Но елки палки до этого работало все стабильно недели три. Сейчас (5 дней назад) процедуру записи не менял, переписал чуть чуть процедуру чтения, в том числе и режим FIFO

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


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

Коллеги. Примерно 8 мес мучаюсь вопросом, похоже самое время его задать.

А в понятиях ПЛИС, слово - это сколько? В контексте FIFO.

Если у меня шина 256 бит. Слово это будет ровно 1 запись в 256 бит или нет? 

 

Если размер FIFO ставлю 1024 слов. Сколько это получается в байтах?

 

В классическом программировании это бы значило 2 байта. (word = 2byte)

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

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


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

8 hours ago, new123 said:

Как раз таки начались проблемы, как переключился с этого режима на Normal. Но я вынужден так сделать.

Закралась мысль. Но елки палки до этого работало все стабильно недели три. Сейчас (5 дней назад) процедуру записи не менял, переписал чуть чуть процедуру чтения, в том числе и режим FIFO

Если до этого работало, логика не менялась, то возможно времянка... Проверьте, правильно ли заданы констрейны и выполняются ли они.

5 minutes ago, new123 said:

Коллеги. Примерно 8 мес мучаюсь вопросом, похоже самое время его задать.

А в понятиях ПЛИС, слово - это сколько? В контексте FIFO.

Если у меня шина 256 бит. Слово это будет ровно 1 запись в 256 бит или нет? 

В понятиях ПЛИС такого термина думаю нет. Слово - это ширина шины, с которой Вы работаете. Если шина 15 бит, то слово, которое по ней передается равно 15-ти битам. Это понятие лучше относить к процессорным системам.

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


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

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

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

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

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

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

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

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

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

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