インテル® Quartus® Prime プロ・エディションのユーザーガイド: デザインの推奨事項

ID 683082
日付 8/03/2023
Public
ドキュメント目次

2.3.1.2. 非同期リセットの使用

非同期リセットは、回路設計において最も一般的で、実装が最も簡単なリセットの形式です。通常は、非同期リセットをデバイスに挿入し、グローバルバッファーをオンにして、デバイス内の各レジスターの非同期リセットピンに接続します。

この方法は特定の状況でのみ有利になります。レジスターを常にリセットする必要はありません。同期リセットとは異なり、非同期リセットはデータパスに挿入されず、レジスター間のデータ到着時間に悪影響をおよぼしません。リセットはすぐに有効になり、レジスターでリセットパルスを受信すると、レジスターはすぐにリセットされます。非同期リセットはクロックに依存しません。

ただし、リセットがデアサートされ、リカバリー時間 (µtSU) またはリムーバル時間 (µtH) のチェック (タイミング・アナライザーのリカバリーおよびリムーバル解析では両方の時間を確認します) に合格しない場合、エッジはメタスタビリティー・ゾーンに入っていると考えられます。正しい状態を決定するには追加時間が必要になりますが、この遅延が原因でセットアップ時間がダウンストリームのレジスターで不合格となり、システム障害が発生する可能性があります。これを回避するには、非同期リセットを備えるレジスターの後にいくつかの追従レジスターを追加し、これらのレジスターの出力をデザインで使用します。追従レジスターを使用してデータをクロックに同期し、メタスタビリティーの問題を取り除きます。これらのレジスターはデバイス内で相互に近付けて配置し、配線遅延を最小限に抑える必要があります。これにより、データ到着時間が短縮し、MTBFが大きくなります。この追従レジスター自体はリセットするのではなく、現在の状態または初期の状態を「フラッシュアウト」することにより、数クロックサイクルの期間で初期化されるようにします。

図 21. 追従レジスターを備える非同期リセット

次の例では、同等のVerilog HDLコードを示しています。リセットのアクティブエッジがプロシージャー・ブロックのセンシティビティー・リストにあり、追従レジスターのクロックイネーブルが推論されます。また、リセット信号の逆数がクロックイネーブルに結び付けられています。示されているように、追従レジスターはノンブロッキング割り当てを使用して異なるプロシージャー・ブロックに含める必要があります。

追従レジスターを備える非同期リセットに対応するVerilog HDLコード

module async_reset (
        input   clock,
        input   reset_n,
        input   data_a,
        output   out_a,
        );
reg     reg1, reg2, reg3;
assign  out_a  = reg3;
always @ (posedge clock, negedge reset_n)
begin
    if (!reset_n)
        reg1    <= 1’b0;
    else
        reg1    <= data_a;
end
always @ (posedge clock)
begin
    reg2    <= reg1;
    reg3    <= reg2;
end
endmodule  //  async_reset

非同期リセットは簡単に制約することができます。定義に基づくと、非同期リセットはリセットするレジスターのクロックドメインと非決定的な関係にあります。よって、これらのリセットのスタティック・タイミング解析は不可能です。set_false_path コマンドを使用して、このパスをタイミング解析から除外することができます。レジスターにおけるクロックに対するリセットの関係は不明なため、このパスに対してタイミング・アナライザーのリカバリーおよびリムーバル解析を実行することはできません。フォルスパス・ステートメントなしで解析を試みても、リカバリーとリムーバルにパスは報告されません。

非同期リセットに向けたSDC制約

# Input clock - 100 MHz
create_clock [get_ports {clock}] \
        -name {clock} \
        -period 10.0 \
        -waveform {0.0 5.0}
# Input constraints on data
set_input_delay 7.0 \
        -max \
        -clock [get_clocks {clock}]\
        [get_ports {data_a}]
set_input_delay 1.0 \
        -min \
        -clock [get_clocks {clock}] \
        [get_ports {data_a}]
# Cut the asynchronous reset input
set_false_path \
        -from [get_ports {reset_n}] \
        -to [all_registers]

非同期リセットはノイズの影響を受けやすく、ノイズの多い非同期リセットは意図しないリセットを引き起こす可能性があります。非同期リセットがデバウンスおよびフィルタリングされていることを確認します。リセットは非同期で簡単に開始することができますが、非同期でリセットを解除すると、潜在的なメタスタビリティーの問題が発生する可能性があります (「リセットのリムーバル」とも呼ばれます)。これには、フィードバックを備える同期回路で望ましくない状況に陥る危険性などがあります。