Verilogゲート遅延の理解:信頼性の高いデジタル設計のための正確なタイミング
デジタル要素はバイナリエンティティであり、0と1の2値のみを保持できます。しかし、0から1、1から0への遷移には過渡遅延があり、各ゲート要素も入力から出力への値の伝播に遅延があります。
例えば、2入力ANDゲートは、両入力が1になれば出力を1に切り替え、いずれかの入力が0になれば出力を0に戻す必要があります。これらのゲート遅延とピン間遅延は、ロジックプリミティブをインスタンス化する際にVerilogで指定できます。
立ち上がり、立ち下がり、ターンオフ遅延
ゲートの出力がある値から1に変化するのにかかる時間を立ち上がり遅延と呼びます。ゲートの出力がある値から0に変化するのにかかる時間を立ち下がり遅延と呼びます。ゲートの出力がある値からハイインピーダンスに変化するのにかかる時間をターンオフ遅延と呼びます。
これらの遅延は実際にはすべての信号に適用可能です。すべての信号は実回路ではいつでも立ち上がりまたは立ち下がりうるため、ゲート出力に制限されるものではありません。ゲート遅延を表現するには3つの方法があり、出力がハイインピーダンスに遷移しないほとんどのプリミティブには2遅延形式を適用できます。例えば、ANDゲートには3遅延形式を適用できません。なぜなら、いかなる入力組み合わせでも出力がZになることはないからです。
// 単一遅延指定 - 3種類の遷移遅延すべてに同じ値を使用
or #(<delay>) o1 (out, a, b);
// 2遅延指定 - 立ち上がりと立ち下がり遷移に使用
or #(<rise>, <fall>) o1 (out, a, b);
// 3遅延指定 - 立ち上がり、立ち下がり、ターンオフ遷移に使用
or #(<rise>, <fall>, <turn_off>) o1 (out, a, b);
単一の遅延のみ指定された場合、すべての3種類の遅延に同じ値が使用されます。2つの遅延が指定された場合、最初が立ち上がり、2番目が立ち下がり遅延を表します。3つの遅延が指定された場合、それぞれ立ち上がり、立ち下がり、ターンオフ遅延を表します。
1遅延形式
module des (
input a, b,
output out1, out2
);
// ANDゲートに2時間単位のゲート遅延
and #(2) o1 (out1, a, b);
// BUFIF0ゲートに3時間単位のゲート遅延
bufif0 #(3) b1 (out2, a, b);
endmodule
module tb;
reg a, b;
wire out1, out2;
des d0 (.out1(out1), .out2(out2), .a(a), .b(b));
initial begin
{a, b} <= 0;
$monitor ("T=%0t a=%0b b=%0b and=%0b bufif0=%0b", $time, a, b, out1, out2);
#10 a <= 1;
#10 b <= 1;
#10 a <= 0;
#10 b <= 0;
end
endmodule
ANDゲートの出力が、入力のいずれかが変化してから2時間単位後に変化することがわかります。例えば、aがすでに1の状態でbがT=20で1になります。しかし出力が1になるのはT=22です。同様に、aがT=30で0に戻り、出力が新しい値を得るのはT=32です。
BUFIF0のゲート遅延は3時間単位と指定されているため、aがすでに1の状態でbが0から1に変化すると、出力が更新されてZになるまで3時間単位かかり、最終的にT=23でそうなります。
ncsim> run T=0 a=0 b=0 and=x bufif0=x T=2 a=0 b=0 and=0 bufif0=x T=3 a=0 b=0 and=0 bufif0=0 T=10 a=1 b=0 and=0 bufif0=0 T=13 a=1 b=0 and=0 bufif0=1 T=20 a=1 b=1 and=0 bufif0=1 T=22 a=1 b=1 and=1 bufif0=1 T=23 a=1 b=1 and=1 bufif0=z T=30 a=0 b=1 and=1 bufif0=z T=32 a=0 b=1 and=0 bufif0=z T=40 a=0 b=0 and=0 bufif0=z T=43 a=0 b=0 and=0 bufif0=0 ncsim: *W,RNQUIE: Simulation is complete.
2遅延形式
上記と同じテストベンチを、以下の異なるVerilogモデルに適用してみます。ここでは立ち上がりと立ち下がり遅延が明示的に指定されています。
module des (
input a, b,
output out1, out2
);
and #(2, 3) o1 (out1, a, b);
bufif0 #(4, 5) b1 (out2, a, b);
endmodule
ncsim> run T=0 a=0 b=0 and=x bufif0=x T=3 a=0 b=0 and=0 bufif0=x T=5 a=0 b=0 and=0 bufif0=0 T=10 a=1 b=0 and=0 bufif0=0 T=14 a=1 b=0 and=0 bufif0=1 T=20 a=1 b=1 and=0 bufif0=1 T=22 a=1 b=1 and=1 bufif0=1 T=24 a=1 b=1 and=1 bufif0=z T=30 a=0 b=1 and=1 bufif0=z T=33 a=0 b=1 and=0 bufif0=z T=40 a=0 b=0 and=0 bufif0=z T=45 a=0 b=0 and=0 bufif0=0 ncsim: *W,RNQUIE: Simulation is complete.
3遅延形式
module des (
input a, b,
output out1, out2
);
and #(2, 3) o1 (out1, a, b);
bufif0 #(5, 6, 7) b1 (out2, a, b);
endmodule
ncsim> run T=0 a=0 b=0 and=x bufif0=x T=3 a=0 b=0 and=0 bufif0=x T=6 a=0 b=0 and=0 bufif0=0 T=10 a=1 b=0 and=0 bufif0=0 T=15 a=1 b=0 and=0 bufif0=1 T=20 a=1 b=1 and=0 bufif0=1 T=22 a=1 b=1 and=1 bufif0=1 T=27 a=1 b=1 and=1 bufif0=z T=30 a=0 b=1 and=1 bufif0=z T=33 a=0 b=1 and=0 bufif0=z T=40 a=0 b=0 and=0 bufif0=z T=46 a=0 b=0 and=0 bufif0=0 ncsim: *W,RNQUIE: Simulation is complete.
Min/Typ/Max遅延
遅延は、チップの異なる部分で同じではなく、温度や他の変動でも同じではありません。そのため、Verilogでは上記の各遅延タイプに対してさらなる制御レベルを提供しています。すべてのデジタルゲートとトランジスタセルには、プロセスノードに基づく最小、典型、最大遅延が指定されており、通常はファブリケーションファウンドリから提供されるライブラリに含まれています。
遅延の各タイプ(立ち上がり、立ち下がり、ターンオフ)に対して、min、typ、maxの3つの値を指定でき、それぞれ最小、典型、最大遅延を表します。
module des (
input a, b,
output out1, out2
);
and #(2:3:4, 3:4:5) o1 (out1, a, b);
bufif0 #(5:6:7, 6:7:8, 7:8:9) b1 (out2, a, b);
endmodule
ncsim> run T=0 a=0 b=0 and=x bufif0=x T=4 a=0 b=0 and=0 bufif0=x T=7 a=0 b=0 and=0 bufif0=0 T=10 a=1 b=0 and=0 bufif0=0 T=16 a=1 b=0 and=0 bufif0=1 T=20 a=1 b=1 and=0 bufif0=1 T=23 a=1 b=1 and=1 bufif0=1 T=28 a=1 b=1 and=1 bufif0=z T=30 a=0 b=1 and=1 bufif0=z T=34 a=0 b=1 and=0 bufif0=z T=40 a=0 b=0 and=0 bufif0=z T=47 a=0 b=0 and=0 bufif0=0 ncsim: *W,RNQUIE: Simulation is complete.
Verilog
- Verilogマスター:デジタル回路設計のための完全チュートリアル
- Verilog連結マスター:実践ガイド
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
- Verilog遅延制御の理解:タイミング技術とベストプラクティス
- Verilogインターバル遅延とイントラ代入遅延の理解
- ゲートレベルモデリング:ハードウェア回路図からVerilogコードへ
- 実践Verilogゲートレベル設計:AND/OR/NOTゲートと2×1マルチプレクサ
- Verilogクロックジェネレータ:設計と実装ガイド
- Verilog数学関数のマスター:効率的なハードウェア設計のために
- Verilog $timeformatのマスター:精度と表示制御