非同期検証(clock domain crossing check)とは,異なるクロックで動く回路の間でデータを転送する際(以下,非同期データ転送)に,誤動作などの問題が起きるかどうかをチェックすることを言う。この検証には,非同期検証ツール(clock domain crossing checker)と呼ぶEDAツールを使うのが一般的である。
フリップフロップの出力が発振
位相関係の保障がないクロック領域間で,非同期にデータ転送すると,主に以下の三つの問題が発生する。
(1)メタ・ステーブル
フリップフロップ(FF)に入るクロックとデータが同時に変化するなどして,FFの出力が発振状態になる場合がある。これを「メタ・ステーブル」状態と呼ぶ(図1)。この状態では,FFの後段の回路が誤動作する恐れがある。メタ・ステーブルの状態は一定時間後に収束するが、その継続時間は使う半導体プロセスなどで異なる。
(2)リコンバージェンスによる問題
複数のパスで非同期のデータ転送をした後で,それらの値の論理演算を実行した(リコンバージェンスした)場合,転送パス間の遅延差によって,グリッジやデータのずれが生じる場合がある(図2)。このため,遅延を大まかに考慮したRTL(register transfer level)シミュレーションでは正常に動作していたのに,レイアウト後のシミュレーションや実デバイスで誤動作を起こすことがある。
(3)データの取りこぼし
非同期データ転送で,送信側FFのクロック周波数が受信側FFのクロック周波数より速い場合,必要なデータを取り込む前に送信側FFの値が変化してしまう。これで,受信側FFでデータの取りこぼしが起きる(図3)。
同期化回路を挿入
これらの問題の発生を防ぐには,非同期データ転送のパスに「同期化回路」を挿入する。よく使われる同期化回路の例を以下に挙げる(図4)。
(a)D-FFチェーン(1ビット対応)
受信側FFを多段のシフト・レジスタ構成にする。
(b)マルチプレクサ(多ビット対応)
受信側FFでマルチプレクサを使ったフィードバック回路を構成し,データが安定している期間のみデータを取り込む。
(c)ハンドシェーク
送信側と受信側でハンドシェーク動作を実施してから,データを転送する。
(d)FIFO(first-in first out)
FIFOメモリー経由して,データを転送する。
非同期間のデータ転送をチェック
非同期データ転送に問題が起きるかどうかをチェックするのが,非同期検証ツールである。具体的には,同期化回路が正しい場所に挿入されていて,かつ期待通りに動作するかを見る。これで,どのようなクロックの位相関係であっても,後段の回路に影響を与えないかを確認できる。
非同期検証ツールを使う際には,設計者は回路情報(RTLやネットリスト)とクロックの情報(クロック・ツリーの起点や周期等)を入力する。ツールは,非同期クロック領域間のデータ転送パスを自動的に抽出し,各パスに対して検証を実施する。
その検証内容は,「構造的チェック」と「機能的チェック」に分かれる。前者では,検証対象箇所の回路構造を見ながら,あらかじめ設定したルールに基づいて同期化回路が挿入されているかをチェックする。
一方,後者の機能的チェックでは,データの取りこぼしが発生しないかを検証する。この検証には,「フォーマル検証」技術を使う。フォーマル検証に使うプロパティは,ツールの内部で自動的に生成される。
ただし,現在のフォーマル検証技術では,あまり大規模な回路を扱えない。そこで論理シミュレーションを併用することもある。その際には,クロック生成にランダム性を持たせてクロック位相を変動させながら,論理シミュレーションする手法が有効である。