非同期リセットの解除タイミング
ここまで非同期リセット信号には触れなかったが、これもクロックと非同期な信号なので注意しなければならない。といっても注意するのは、リセット値と入力値が異なっているFFだけである。このようなFFはリセット解除とクロックエッジのどちらが先かで0,1どちらになるか決まるので、ほぼ同時に起きたときはスキュー依存つまり不確定になってしまう。(なお、非同期リセットをアサートするタイミングは気にしなくてよい)
例1) 非同期リセットが解除されるとすぐに動きだすone-hot回路
非同期リセットrst_nのスキューによりFF1のリセット解除がFF0のリセット解除より遅れればFF1出力もFF0出力も両方0になり1が失われてしまう。またFF1のリセット解除がFF0のリセット解除より早ければFF1出力もFF0出力も両方1になり1が2個になってしまう。
例2) バイナリカウンタでも、0からカウントアップする場合はリセット解除後の動作が000→001と過渡値が存在しないので問題ないが、例えば初期値001からカウントアップする場合は、001→010の過渡値011になる可能性があるので不都合である。
一般に、リセット解除後に複数のビットが同時に変化するカウンタは、過渡値になる可能性がある。
例3) カウンタ単体では過渡値が生じない場合でも、もし複数のカウンタが同時にスタートすることを期待して設計している場合は、スタートが1クロックずれたら誤動作する。
◇
このようなFFの存在はツールでは検出できないので、もし見逃していると、何度かON/OFFしているとたまに誤動作をする不具合になる。そこで、非同期リセットrst_nの解除をclkに同期化したリセットsrst_nを使えばよい。ここで1段目FFの出力はメタステーブルになるかもしれないので2段目FFの出力を使う。
このとき、タイミング解析でsrst_nのリカバリタイム、リムーバルタイム(D端子のセットアップタイム、ホールドタイムと同じ)をチェックする必要がある。(Quartus,Vivadoではクロック周期の制約を与えておけばチェックしてくれる)