2.3.1.2. 非同期リセットの使用
この方法は特定の状況でのみ有利になります。レジスターを常にリセットする必要はありません。同期リセットとは異なり、非同期リセットはデータパスに挿入されず、レジスター間のデータ到着時間に悪影響をおよぼしません。リセットはすぐに有効になり、レジスターでリセットパルスを受信すると、レジスターはすぐにリセットされます。非同期リセットはクロックに依存しません。
ただし、リセットがデアサートされ、リカバリー時間 (µtSU) またはリムーバル時間 (µtH) のチェック (タイミング・アナライザーのリカバリーおよびリムーバル解析では両方の時間を確認します) に合格しない場合、エッジはメタスタビリティー・ゾーンに入っていると考えられます。正しい状態を決定するには追加時間が必要になりますが、この遅延が原因でセットアップ時間がダウンストリームのレジスターで不合格となり、システム障害が発生する可能性があります。これを回避するには、非同期リセットを備えるレジスターの後にいくつかの追従レジスターを追加し、これらのレジスターの出力をデザインで使用します。追従レジスターを使用してデータをクロックに同期し、メタスタビリティーの問題を取り除きます。これらのレジスターはデバイス内で相互に近付けて配置し、配線遅延を最小限に抑える必要があります。これにより、データ到着時間が短縮し、MTBFが大きくなります。この追従レジスター自体はリセットするのではなく、現在の状態または初期の状態を「フラッシュアウト」することにより、数クロックサイクルの期間で初期化されるようにします。
追従レジスターを備える非同期リセットに対応する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]
非同期リセットはノイズの影響を受けやすく、ノイズの多い非同期リセットは意図しないリセットを引き起こす可能性があります。非同期リセットがデバウンスおよびフィルタリングされていることを確認します。リセットは非同期で簡単に開始することができますが、非同期でリセットを解除すると、潜在的なメタスタビリティーの問題が発生する可能性があります (「リセットのリムーバル」とも呼ばれます)。これには、フィードバックを備える同期回路で望ましくない状況に陥る危険性などがあります。