Многие начинающие разработчики часто недооценивают влияние асинхронности на работу цифровых схем. В проектах с одним тактовым генератором сложностей не возникает: схема полностью синхронна, и от разработчика требуется только соблюдать требования Setup и Hold. Но как только в системе появляется второй тактовый генератор, возникает проблема CDC – Clock Domains Crossing, связанная с асинхронностью работы участков схемы, работающих от независимых (асинхронных) генераторов. На практике эта проблема выливается в усложнение маршрута проектирования, связанное с особенностями статического временного анализа в САПР, а в железе проявляется в виде такого эффекта как метастабильность, и аномальное поведение триггеров. Собственно, о метастабильности здесь уже писали, но я предлагаю чуть глубже разобраться в проблеме.

В начале несколько вводных слов. О таких критичных для работы параметрах триггера как setup и hold подробно написано здесь. В двух словах, вблизи момента прихода тактового сигнала на вход триггера существует некий минимальный интервал времени, внутри которого сигнал на информационном входе должен оставаться стабильным. Если изменение сигнала происходит за пределами этого интервала, триггер срабатывает правильно. Это минимальные требования, которые должен соблюдать разработчик, проектируя схему с одним тактовым генератором. И даже если в проекте используется несколько кратных частот, полученных из одной опорной, схема также считается синхронной, а максимум, о чем следует заботиться при проектировании, это соблюдение Setup и Hold.

Теперь представим, что в проекте используются два независимых источника тактирования. Все триггеры в схеме разделяются на два домена, по принципу управления от одной или другой опорной частоты. Между этими асинхронными друг другу доменами проходит граница в виде сигналов, сформированных на одной опорной частоте, и заходящих на информационные входы триггеров, работающих на другой частоте. Фактически, сигнал на входах триггеров оказывается асинхронен их тактовому импульсу, что означает, что требуемые времена Setup и Hold не могут быть выдержаны. В результате, в работе триггеров на границе двух доменов изредка возникают аномалии (фактически — сбои), которые на временном моделировании обычно обозначается как неопределенное состояние триггера X, и раскрашиваются на вейвформе красным цветом. В реальной схеме это аномальное состояние триггера может оказаться просто затянувшимся срабатыванием, поскольку для попадания триггера в область метастабильности, входной сигнал должен измениться в гораздо более узком отрезке времени, чем ts + th:


На рисунке показаны: tc – абсолютное время прихода фронта тактового импульса, являющееся нулевым отсчетом для оси Hold (направлена от ноля вправо), и оси Setup. Ось Setup направлена влево, поскольку время установки отсчитывается в отрицательном направлении от момента прихода фронта клока. Далее, ts и th – параметры Setup и Hold триггера: между отметками ts и th сигнал на информационном входе триггера обязан быть стабильным (красная область рисунка). Вне окна ts + th сигнал может меняться произвольно (синяя область рисунка). При изменении сигнала внутри окна ts + th, переключение триггера может сильно затянуться. Последний элемент рисунка – область метастабильности, выделена оранжевым цветом. Это некий интервал времени, при попадании в который поведение выходов триггера становится непредсказуемым, о чем будет подробно рассказано ниже. На практике, время th часто бывает отрицательным (окно ts + th по той или иной причине оказывается сдвинуто влево относительно нулевой отметки), а ширина области метастабильности должна определяться индивидуально для каждой схемы триггера и параметров транзисторов – экспериментально, либо с помощью спайс-моделирования.

Рассмотрим устройство классической схемы D-триггера и составляющей его RS-защелки:



Представим, что на вход R (Reset) защелки приходит короткий импульс с активным нулем, а на входе S (Set) – пассивный сигнал (лог. 1). Если импульс совсем короткий, то защелка может не переключиться. А если увеличить длительность импульса? Проведем серию экспериментов, подавая на вход защелки импульсы разной длительности. Следующий рисунок позаимствован из статьи Л.Р. Марино General Theory of Metastable Operation:


На рисунке обозначены две оси – напряжение на X и Y выходах RS-защелки. Отметки V0 и V1 – напряжение лог. 1 и лог. 0 выходов триггера, а Vm – напряжение, равное ? Uпитания. На рисунке так же показано, что начальное состояние (Initial state) находится в точке плоскости {X=V1, Y=V0} — выходы триггера {X, Y} приняли логические значения {1,0}. На вход защелки S (Set) подан высокий потенциал (пассивное значение), а на вход R (Reset) подается импульс с активным нулем разной длительности (6-самый короткий, 1-самый длинный – изображено внизу рисунка). В соответствии с номером импульса на входе R, на рисунке показаны 6 траекторий переключения потенциалов пары выходов {Y,X}: для импульсов 1-3 происходит полное переключение триггера, для импульсов 5-6 триггер не переключится, а траектория 4 приводит триггер в центр зоны метастабильности (точка {Vm,Vm}), находящийся посередине между порогами лог. 1 и лог. 0.

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

Теперь обратимся к современной схеме D-триггера из библиотеки для 65нм, использующейся при проектировании ASIC:


На схеме по информационному входу D стоит ключ GD, первая защелка изображена в виде двух инверторов во встречном включении I1 и G1, проходной ключ SW разделяет защелки, а вторая защелка строится так же на двух инверторах во встречном включении I2 и G2. Выход для повышения скорости берется с левого плеча второй защелки. Триггер работает следующим образом: при CK=0 входной ключ пропускает сигнал на первую защелку с отключенной обратной связью G1, ключ между защелками закрыт, а вторая защелка находится в хранении, поскольку активна обратная связь G2. При CK=1 первая защелка отсекается от входа D, у нее активизируется обратная связь G1, отпирается ключ между защелками, а у второй защелки выключается обратная связь – данные из первой защелки переписываются во вторую. Если сигнал D снимается раньше прихода переднего фронта CK, мы получаем на входе первой защелки импульс с активным нулем, чья длительность зависит только от соотношения фронтов CK и D. Таким образом, ситуация аналогична рассмотренной с RS-защелкой: энергия импульса на одном из плеч может переключить защелку, не переключить, либо — ввести защелку в состояние метастабильности. В статье Л.Р. Марино математически доказано, что выходы абсолютно любого триггера, независимо от его конструкции, могут принимать метастабильное состояние.

Попробуем рассмотреть все возможные состояния выходов защелки; для этого построим еще один график с двумя осями-потенциалами выходов. График позаимствован из лекций по логическому проектированию д.т.н., профессора В.Б. Мараховского:


График почти такой же, как и в статье Л.Р. Марино, но стрелками изображены траектории возможного поведения выходов защелки. Двигаясь по траекториям, выходы защелки в конечном счете переключатся в устойчивое логическое состояние {1,0} или {0,1}, соответствующее состоянию на входах (состояние входа защелкнется). Но при попадании потенциала выходов в некую область по центру графика, предсказать конечное состояние выходов невозможно. Это область неустойчивого равновесия (метастабильности), на выход из которой могут влиять только случайные факторы, такие как тепловой шум. Конечное состояние выходов защелки при завершении метастабильности заранее неизвестно – оно может быть любым ({1,0} или {0,1}). Размер области метастабильности измеряется экспериментально, либо вычисляется с помощью спайс-моделирования. Следует отметить, что на практике метастабильность проявляется не только в виде статичного потенциала, равного ? Uпитания, но также и в виде слабых пульсаций вблизи этой точки. Другим важным свойством метастабильности является непредсказуемость времени установления защелки в стабильное состояние. Как известно, время выхода защелки из метастабильного состояния описывается распределением Пуассона, и в теории может быть бесконечно долгим. Таким образом, нельзя заранее предсказать не только конечное состояние триггера после выхода из метастабильности, но и продолжительность метастабильного состояния во времени. Впрочем, если сигнал на входе триггера не меняется и в следующем такте, то максимальная продолжительность метастабильного состояния выходов триггера на границе двух доменов не превышает длительности тактового импульса.

Формулы и методики расчета размеров области метастабильности и частоты сбоев можно посмотреть в статье Variability in Multistage Synchronizers. Приведу лишь результаты расчетов частоты сбоев из этой статьи. В качестве синхронизатора использовались схемы последовательного соединения 2х, 3х и 4х триггеров, работающих от импульса с периодом 800пс, и диапазоном частот входного сигнала от 600пс до 2нс.


На графике по вертикальной оси отложен MTBF в годах – срок между сбоями (попадание в метастабильное состояние — сбой) при использовании разных синхронизаторов на входе в домен, работающий от такта с периодом 800пс. По горизонтали отложен период тактового импульса домена – источника сигнала. Как видно из рисунка, чем больше триггеров в цепочке синхронизатора, тем реже происходят сбои.

Выводы


1. Время переключения триггера целиком и полностью зависит от длительности управляющего импульса на входе первой защелки, который получается сдвигом фазы прихода сигнала к тактовому импульсу на входах триггера. При переключении сигнала за границами интервала ts + th, триггер переключается правильно, и за заранее известное время. Но, если входной сигнал поменялся внутри этого интервала, то стабильного состояния триггер достигает тем дольше, чем ближе к зоне метастабильности он оказался. Если же выходы триггера оказались внутри зоны метастабильности, их конечное логическое состояние и время срабатывания не могут быть предсказаны.

2. Метастабильность выходов триггера выглядит на осциллографе как уровень потенциала выходов, равный ? Uпитания, либо как слабые пульсации вблизи этого уровня. При этом в инверторах схемы триггера течет сквозной ток между шинами земли и питания. Но поскольку сопротивление открытого канала в n- и p- транзисторах измеряется килоОмами, то сквозной ток не оказывает заметного влияния на такие явления как общее потребление схемы, просадка питания (IR drop), и электромиграция.

3. На частотах около гигагерца сбой (вследствие метастабильности) в триггере на границе двух доменов происходит раз в несколько секунд. Бороться с метастабильностью помогает использование в качестве синхронизатора двух и более последовательно включенных триггеров. При использовании двух триггеров, сбой на выходе синхронизатора случается уже раз в год; трех триггеров – раз в тысячу лет; четырех триггеров – раз в 10 миллиардов лет. Снижение рабочей частоты влияет на частоту сбоев экспоненциально: при использовании синхронизатора из двух триггеров и частоте около 500МГц, интервал сбоев увеличится на несколько порядков – до одного сбоя в миллион лет. Поэтому, если Вы проектируете схему с частотами под гигагерц, постарайтесь использовать как можно меньше асинхронных доменов, либо увеличивайте число последовательно включенных триггеров в синхронизаторах до трех.

4. На частоту сбоев сильно влияют паразитные емкости выходов первой и второй защелок (составляющих триггер), которые зависят от параметров используемых транзисторов и от схемы триггера. Другими словами, меняя параметры транзисторов и схему триггера, можно косвенно влиять и на периодичность возникновения метастабильности на выходах этого триггера. Рецепт годится, только если Вы проектируете собственную библиотеку элементов.

5. С точки зрения статического временного анализа, все пути между асинхронными доменами должны быть описаны sdc констрейнтами set_false_path.

Метастабильность триггеров в России никем не изучается (поправьте, если не прав), но на практике разработчику достаточно следовать тем простым рекомендациям, что даны выше; надеюсь, это кому-нибудь окажется полезным.
Поделиться с друзьями
-->

Комментарии (18)


  1. de1m
    13.12.2016 19:16

    А можно пару примеров, где такое встречается? И происходит ли это случайно или где-то разные частоты требуются?


    1. JerleShannara
      13.12.2016 20:07
      +3

      Если вы работаете с ПЛИС то с метастабильностью вы встретитесь как только начнёте принимать данные со входов. Как правило на курсах упоминают то, что все входные сигналы необходимо пропустить через триггер/регистр, даже если у вас вся логика обрабатывает 100% ошибок. Глюки от «да нафиг мне это триггер, яж такт потеряю один!» бывают совершенно разные, самый забавный — это улетевший в XXXX конечный автомат в середине цепочки, хотя он описан весьма качественно и «да он же имеет строчку вида default: next_state <= #5 error;»


      1. Uint32
        14.12.2016 00:43
        +2

        Как правило на курсах упоминают то, что все входные сигналы необходимо пропустить через триггер/регистр,

        И не через один, а через несколько последовательно, для получения приемлемой вероятности возникновения метастабильности.
        Для параллельных шин это обстоятельство фактически делает архисложным переход из одного клокового домена в другой без полноценного асинхронного fifo.


        1. JerleShannara
          16.12.2016 17:40

          Ну благо dual clock fifo есть и у altera и у xilinx, причём (у альтеры, с xilinx я мало работаю) простым пинком задаётся кол-во тактов между появлением данных на входе и доступностью оных на выходе (и какраз 3 Cycles, for best metastability там есть)


    1. Khort
      13.12.2016 20:16

      При создании констрейнтов все клоки (clock) в схеме разделяются на асинхронные группы так, чтобы внутри каждой группы клоки были строго синхронны друг другу. Сбои будут случайно возникать в синхронизаторах на границе доменов (clock domains), относящихся к разным группам.
      Пример:
      Клоки из группы А: С внешнего генератора через вывод микросхемы внутрь поступает опорная частота 25МГц, из которой с помощью PLL получается частота 50 МГц для APB, 100 МГц для AHB и 500 для AXI.
      Клоки из группы Б: у контроллера UART приемопередатчик PHY работает на частоте 24 МГц, работающей от другого внешнего генератора.
      Все клоки внутри группы А синхронны друг другу, но асинхронны клокам из группы Б. Поэтому в приемопередающей части контроллера UART должна производиться синхронизация из домена 50 МГц (APB) в 24 МГц (UART-PHY) и обратно. Сбои (ввиду метастабильности) будут наиболее часто возникать в первом триггере каждого синхронизатора, и на порядки реже — во втором, но исключительно редко могут возникать и дальше по схеме — в 4м, 5м и т.д. триггерах. Регулярность этих сбоев можно рассчитать, но для таких низких частот как в этом примере она будет маленькая — раз в несколько лет для первого триггера каждого синхронизатора. Если бы контроллер UART работал не на APB, а на AXI, то периодичность сбоев была бы на порядки выше.


    1. Uint32
      13.12.2016 21:00
      +2

      Такое встречается всегда при переходе из одного клокового домена в другой, например.


  1. Uint32
    13.12.2016 19:53
    +1

    Спасибо, добавлю ссылку на статью
    VARIABILITY OF MULTISTAGE SYNCHRONIZERS


  1. nerudo
    13.12.2016 22:32

    Интересно бы было погонять триггерную схему в каком-нибудь доступном аналоговом симуляторе. Ни у кого нет модельки готовой?


    1. Khort
      13.12.2016 22:59
      +1

      Вот ссылка на модели транзисторов, а вот ссылка на спайс модели библиотеки стандартных элементов из FreePDK 45нм. Все остальное найдете там же. Сам не проверял, но должно работать — на этом FreePDK учат студентов в универе Северной Каролины (США).


  1. old_bear
    13.12.2016 23:37
    +2

    Спасибо за статью. Особенно за то, что для тех, кто [пока] не может осилить теорию, есть простые рекомендации поставить нужное количество промежуточных регистров и молиться.
    Возможно, стоит для совсем полных начинающих на всякий случай ещё добавить в явном виде мысль, что одиночный импульс так просто не пересинхронизировать — нужно делать схему установки-сброса. А для последовательности импульсов нужно ещё и накопление городить.


    1. nckma
      14.12.2016 08:55

      Не всегда пара последовательных регистров спасает ситуацию.
      Например, если нужно шину данных перевести из одного домена в другой, то последовательные регистры не помогут.
      Вот так делать не надо (verilog):

      reg [7:0]data; //register in 1st domain
      
      always @(posedge clk1)
         data <= input_data;
      
      //cross domain...
      reg [7:0]d0;
      reg [7:0]data_out;
      
      always @(posedge clk2)
         d0 <= data; // fix in first synchronizer
      
      always @(posedge clk2)
         data_out <= d0;  // fix in second synchronizer
      
      


      Если нужно шину провести из одного домена в другой, то скорее всего правильное решение — это FIFO с разными тактовыми частотами на запись и чтение.


      1. Khort
        14.12.2016 09:10

        Действительно, для синхронизации шины не обязательно синхронизировать каждый разряд. Есть более простое решение — синхронизировать только сигнал валидности данных на этой шине.

        Использование FIFO на двупортовой памяти хорошо только в случае блочных (burst) передач, поскольку занимает много площади на кристалле. В остальных случаях достаточно синхронизировать только интерфейсный хендшейк (сигналы запроса и ответа передачи). И, к слову, управление двупортовой памятью все равно придется синхронизировать в обе стороны.


        1. nckma
          14.12.2016 09:17

          Согласен.


      1. old_bear
        14.12.2016 13:00

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


  1. potan
    14.12.2016 13:40

    А как на метастабильность будут влиять шумы? В частности, тепловой шум?


    1. Khort
      14.12.2016 14:09

      Если посмотреть на предпоследний рисунок (Фазовый портрет), то при некоторой энергии управляющего импульса, состояние выходов триггера (изображающая точка на фазовом портрете) окажется в зоне метастабильности.
      Далее, если исключить все абсолютно шумы (идеальный случай), то триггер будет выходить из этого состояния по Пуассону — от бесконечно долго до каких то вменяемых временных интервалов. Если же имеет место шум, то изображающая точка начинает хаотично перемещаться в зоне метастабильности (а-ля броуновское движение), пока случайно не выпадет из этой зоны. В какую сторону выпадет -в сторону лог. 1 или лог. 0 — заранее неизвестно, но зато — состояние метастабильности закончится досрочно, не по Пуассону.
      Что касается именно теплового шума — это может быть электрон, оторвавшийся от кристаллической решетки (wiki). Важно то, что это некий случайный процесс, влияющий на замкнутую систему.


  1. VaalKIA
    17.12.2016 09:46

    Как-то резко проскочили решение проблемы наращиванием тригерров уже по выводу в конце статьи, для меня. к примеру. не очевидо что это должно сработать и в статье никак не объясняется почему это работает, а тупо долбят статистикой.


    1. jok40
      17.12.2016 10:09

      Дело в том, что решение проблемы метастабильности с помощью цепочки триггеров очень подробно рассматривалось в этой статье от уважаемого nerudo, линк на которую приведён в самом первом абзаце данной статьи. Полагаю, поэтому и не стали повторять уже сказанное.