Jump to content

    

Altera FIFO, вычитывание

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

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

 

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

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

 

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

 

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

Edited by new123

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
2 hours ago, new123 said:

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

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

 

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

 

Edited by Inanity

Share this post


Link to post
Share on other sites

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

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

 

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
8 hours ago, new123 said:

Имею
1) Altera FIFO

 

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

Share this post


Link to post
Share on other sites

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

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.

Share this post


Link to post
Share on other sites
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 и ищите закономерномести при неправильном считывании.

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

Edited by new123

Share this post


Link to post
Share on other sites
5 minutes ago, new123 said:

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

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

Share this post


Link to post
Share on other sites
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.

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

Edited by new123

Share this post


Link to post
Share on other sites
1 hour ago, RobFPGA said:

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Удачи! Rob.

 

  

Share this post


Link to post
Share on other sites
28 minutes ago, RobFPGA said:

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

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

31 minutes ago, RobFPGA said:

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

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

Share this post


Link to post
Share on other sites

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

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

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

 

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

 

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

Edited by new123

Share this post


Link to post
Share on other sites
8 hours ago, new123 said:

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

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

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

5 minutes ago, new123 said:

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

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this