То, что вы видите здесь, называется синхронизатором двойного ранга. Как вы упомянули, это асинхронный FIFO. Это означает, что стороны чтения и записи FIFO не находятся в одном и том же часовом домене.
Как вы знаете, триггеры должны соответствовать требованиям по времени установки и удержания, чтобы функционировать должным образом. При подаче сигнала из одного тактового домена в другой в общем случае невозможно гарантировать соблюдение требований.
Когда вы нарушаете эти требования, FF переходят в так называемое «метастабильное» состояние, в котором на короткое время существуют неопределенности, а затем (более или менее) случайным образом переходят в 1 или 0. Однако они делают это (и это важно) менее чем за один такт.
Вот почему два слоя проваливаются здесь. У первого есть шанс стать метастабильным, но он должен вовремя разрешиться, чтобы быть чистым на втором наборе флопов.
Этого самого по себе недостаточно для передачи многобитового значения (адресного указателя) через домены часов. Если одновременно изменяется более одного бита, вы не можете быть уверены, что переход будет чистым на другой стороне. Итак, в таких ситуациях вы часто будете видеть, что указатели FIFO будут закодированы серым цветом. Это означает, что каждое приращение счетчика изменяется не более чем на один бит за раз.
например Вместо 00 -> 01 -> 10 -> 11 -> 00... будет 00 -> 01 -> 11 -> 10 -> 00...
Пересечение часовых доменов — глубокая и тонкая тема. Даже опытные дизайнеры очень часто путают их, не задумываясь.
Кстати, обычные симуляции Verilog ничего не покажут о том, что я только что описал в симуляции с нулевой задержкой. Вам необходимо выполнить аннотированное моделирование SDF с реальными временными моделями.
person
Brian Magnuson
schedule
12.04.2013