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