new123 0 Posted July 16, 2019 (edited) · Report post Форумчане привет. Имею 1) Altera FIFO 2) Скорость чтения и записи разные. Чтение быстрее. 3) Ширина шины 256 бит. 4) Фифо большой. На 512 слов. 5) В нем данные стараюсь не копить, вычитаю сразу же. За исключением некоторых моментов. С чем столкнулся. Доподлинно не известно, только гадаю по дампу полученной памяти. Имею проблему, что несколько раз подряд вычитал одни и те же 256 бит. Ситуация очень редко, но бывает. Бывает прогонишь одни и те же данные - нормально, а бывает раз и где то в концовке продублирует пару раз 256 бит. 6) Когда я ставлю флаг на чтение, я всегда проверяю, пустое ли FIFO со стороны чтения?. Если не пустое, ставлю флаг на чтение. 7) Это всегда происходит под концовку данных. То есть, когда FIFO уже близок или уже практически опустошен. 8) Ситуация плавающая. В Моделсиме я и так и сяк крутил данные, воспроизвести не могу, склоняюсь что проблема на железе, какой то не знаемый мною нюанс работы с памятью. В связи с этим вопрос. Может ли флаг fifo_emty выдавать неверный результат? Почему спрашиваю? Как то на форуме затронулось обсуждение, что с FIFO могут быть проблемы. Возможно я не правильно понял. И второй вопрос, который меня волнует еще больше. Я взвожу флаг read ровно на один такт. Может ли данные из фифо "выходить" не на следующем такте, а например через два. Это не шина Avalon, тут не проверить состояние запросов. Может кто сталкивался, как решали? Заранее спасибо. Edited July 16, 2019 by new123 Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
new123 0 Posted July 16, 2019 · Report post Вариант конечно сделать костыль. На вход записывать постоянно инвертирующийся бит, а на выходе проверять изменение. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Inanity 0 Posted July 17, 2019 (edited) · Report post 2 hours ago, new123 said: Может ли данные из фифо "выходить" не на следующем такте, а например через два. Это не шина Avalon, тут не проверить состояние запросов. Думаю, что это исключено. Задержка всегда одна и та же, если в FIFO есть данные, о чем явно указывает строб "не пусто" и вы хотите их прочитать. Другое дело, что от входа до выхода FIFO количество тактов может быть различным ввиду различного числа степеней синхронизации между портами и т.д. Иными словами, если вы записали в FIFO слово, то попадает оно в выходной порт с некоторой задержкой и не всегда детерминированной. Но если в FIFO есть слово, т.е. оно не пусто, то по стробу чтения данные должны выходить с оговоренной задержкой, иначе этим нереально было бы пользоваться. А вообще очень похоже на банальное нарушение таймингов. Строб пустоты не успевает остановить чтение, например. Edited July 17, 2019 by Inanity Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Bad0512 0 Posted July 17, 2019 · Report post У фифошек от Xilinx есть дополнительный флаг valid. Он гарантирует что вы читаете не из пустой фифошки. Я обычно разделяю логику запросов (fifo_rd = ~fifo_empty в самом простом случае) и логику записи из фифошки в следующий регистр (reg_we = fifo_valid). Таким образом, при попытке прочитать из пустой фифошки флаг валидности не будет выставлен. Будет нарушено количество чтений, но не целостность данных. Кроме того, данная схема позволяет не заморачиваться вопросом через сколько тактов после запроса на чтение на выходе появятся данные ( а тут могут быть разные варианты ) - всё регулируется флажком валидности. И ещё. Если вы защелкиваете флаг пустого фифо и из этого формируете строб чтения - так делать нельзя. Рано или поздно наступите на грабли чтения из пустого фифо. Можно только на комбинаторике fifo_rd = ~fifo_empty & _еще_какое_то_условие_если_это_нужно_; Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Nieve 0 Posted July 17, 2019 · Report post Попробуйте вывести все возможные флаги FIFO и ищите закономерномести при неправильном считывании. Все таки альторовские IP верифицированные, поэтому вряд ли глючит именно сам блок, скорее всего некая обвязка. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Кнкн 0 Posted July 17, 2019 · Report post 8 hours ago, new123 said: Имею 1) Altera FIFO Тактирование постоянно подается? Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
RobFPGA 1 Posted July 17, 2019 · Report post Приветствую! 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. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
new123 0 Posted July 17, 2019 (edited) · Report post 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 July 17, 2019 by new123 Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Bad0512 0 Posted July 17, 2019 · Report post 5 minutes ago, new123 said: флаг пустоты не гарантирует, что я точно смогу вычитать? Флаг пустоты работает как надо, но он показывает состояние на текущий такт. На следующий такт ситуация может поменяться и это необходимо учитывать. Полезно также мониторить флаги underflow и overflow. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
new123 0 Posted July 17, 2019 (edited) · Report post 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 July 17, 2019 by new123 Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
new123 0 Posted July 17, 2019 · Report post 1 hour ago, RobFPGA said: НО с учетом того что разрешение на чтение идет с задержкой на такт Не совсем понял. Я начинаю использовать вычитанные данные сразу после того, как rd_en выставляется в ноль. Правильно делаю? Т.е Такт 1: rd_en = 1 Такт 2: rd_en = 0, использую данные Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
RobFPGA 1 Posted July 17, 2019 · Report post Приветствую! Получается чтение в лучшем случае через такт. Но проблем не должно создавать. Ну и фактически rd_en_prev у вас работает как rd_data_valid. В таком случае скорее всего проблемы с времянками. Ну или вы на стороне записи 2 раза пишете одно и тоже . В 90% случаев удобнее использовать FIFO с FWFT режимом (show-ahead у Altera). В таком случае упрощается логика чтения со стороны пользователя. Удачи! Rob. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
new123 0 Posted July 17, 2019 · Report post 28 minutes ago, RobFPGA said: FIFO с FWFT режимом (show-ahead у Altera). Как раз таки начались проблемы, как переключился с этого режима на Normal. Но я вынужден так сделать. 31 minutes ago, RobFPGA said: Ну или вы на стороне записи 2 раза пишете одно и тоже Закралась мысль. Но елки палки до этого работало все стабильно недели три. Сейчас (5 дней назад) процедуру записи не менял, переписал чуть чуть процедуру чтения, в том числе и режим FIFO Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
new123 0 Posted July 17, 2019 (edited) · Report post Коллеги. Примерно 8 мес мучаюсь вопросом, похоже самое время его задать. А в понятиях ПЛИС, слово - это сколько? В контексте FIFO. Если у меня шина 256 бит. Слово это будет ровно 1 запись в 256 бит или нет? Если размер FIFO ставлю 1024 слов. Сколько это получается в байтах? В классическом программировании это бы значило 2 байта. (word = 2byte) Edited July 17, 2019 by new123 Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
svedach 0 Posted July 17, 2019 · Report post 8 hours ago, new123 said: Как раз таки начались проблемы, как переключился с этого режима на Normal. Но я вынужден так сделать. Закралась мысль. Но елки палки до этого работало все стабильно недели три. Сейчас (5 дней назад) процедуру записи не менял, переписал чуть чуть процедуру чтения, в том числе и режим FIFO Если до этого работало, логика не менялась, то возможно времянка... Проверьте, правильно ли заданы констрейны и выполняются ли они. 5 minutes ago, new123 said: Коллеги. Примерно 8 мес мучаюсь вопросом, похоже самое время его задать. А в понятиях ПЛИС, слово - это сколько? В контексте FIFO. Если у меня шина 256 бит. Слово это будет ровно 1 запись в 256 бит или нет? В понятиях ПЛИС такого термина думаю нет. Слово - это ширина шины, с которой Вы работаете. Если шина 15 бит, то слово, которое по ней передается равно 15-ти битам. Это понятие лучше относить к процессорным системам. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...