ハザード (論理回路)

ハザード（Hazard）は論理回路においてシステム内の欠陥もしくは外部の影響により引き起こされる、望まない影響のこと。
論理ハザードは、入力変数の変化が論理素子（NOT, AND, ORゲートなど）により引き起こされる何らかの遅延により出力が正しく変化しないという問題が現れたものである。この結果、論理が正しく機能しなくなる。最も一般的な3種類のハザードは通常、静的、動的、機能ハザードと呼ばれる。
ハザードは一時的な問題であり、論理回路は最終的には望む機能に落ち着く。よって、同期設計においては回路の出力を別のクロックドメインで使用する前に登録するか、システムから配線してハザードが問題にならないようにするのが標準的な方法である。しかし、そうでない場合は他の接続されたシステムに影響を及ぼす可能性があるため、ハザードを排除することが必須である。
静的ハザード.
静的ハザードは、1つの入力変数が変化したときに正しい値に安定する前に出力が瞬時に変化する状況である。2種類の静的ハザードが存在する。
積和表現に基づいて適切に作られた2レベルAND-OR論理回路では静的-0ハザードは生じないが、逆に、和積表現によるOR-ANDの実装では静的-1ハザードが存在しない。
静的ハザードを排除するために最もよく使われる方法は、冗長論理（論理式のコンセンサス項）を加えることである。
静的ハザードの例.
ANDゲートなどの遅延を受ける不完全な回路を考える。単純な回路は次のような関数を持つ。
f = X1 * X2 + X1' * X3
始めの図を見ると、遅延が発生しなければ回路が正常に動作することは明らかである。しかし、2つのゲートが全く同じように製造されることはない。この不完全性により、第1ANDゲートの遅延は、もう1つのものとわずかに異なる。よって入力が111から011に変化するとき、すなわちX1の状態が変わるときにエラーが発生する。
ハザードがどのように発生するかは大まかには分かっているが、この問題を解決するより明確な図と解決策のためにカルノー図を見ていく。2つのゲートは太線の輪で示され、ハザードは破線の輪の下に示される。ハフマンにより証明された定理は、冗長ループX2X3を加えることでハザードを排除できることを示している。
元の関数は次のようになる: f = X1 * X2 + X1' * X3 + X2 * X3
これにより、不完全な論理要素であっても、X1が状態を変える際にハザードの兆候は見られなくなる。この理論はあらゆる論理システムに当てはめることができる。コンピュータのプログラムではこの作業の大部分を処理しているが、簡単な例では手作業でデバッグを行うほうが早い。多くの入力変数（6やそれ以上）があるとき、カルノー図の上でエラーを「見る」ことは非常に難しくなる。
動的ハザード.
動的ハザードは、入力が1度変化した結果として出力が複数回変化する可能性のことであり、（入力から）出力までの経路が異なる大規模な論理回路でよく生じる。もし各経路が異なる遅延を持っている場合、要求する/期待される出力とは異なる出力に変化する可能性があることはすぐに明らかになる。例えば、論理回路は出力状態を1 から 0に変化することを意味しているが、そうではなく1 から 0 そして 1 に変化し、最終的に正しい値 0 に落ち着くときがあり、これを動的ハザードと呼ぶ。
一般的に、動的ハザードは解消するのがより複雑であるが、回路から全ての静的ハザードが取り除かれれば動的ハザードが発生することはない。
機能ハザード.
静的・動的ハザードとは対照的に、機能ハザードは複数の入力変更により生じるハザードである。排除するための特定の論理的解決はない。本当に信頼性の高い方法の1つは入力が同時に変化しないようにすることであるが、場合によっては適用できない。したがって、回路は各経路に等しい遅延を持つように慎重に設計する必要がある。