デジタルロジック では、ハザードとは、同期回路と非同期回路の両方において、システムの欠陥または外部からの影響によって引き起こされる望ましくない効果のことです。[ 1 ]: 43ロジックハザードは、ロジック要素( NOT、AND、ORゲートなど)によって引き起こされる何らかの遅延のために、入力変数の変化が出力を正しく変化させないという問題の現れです。この結果、ロジックは機能を正しく実行しません。最も一般的な3種類のハザードは、通常、静的ハザード、動的ハザード、および機能ハザードと呼ばれます。
ハザードは一時的な問題であり、論理回路はいずれ目的の機能に落ち着きます。そのため、同期回路設計では、回路の出力を別のクロックドメインで使用したり、システムから外部に配線したりする前に、その出力をレジスタに登録してハザードによる問題を回避するのが標準的な手順です。しかし、そうでない場合は、ハザードが他の接続システムに影響を与える可能性があるため、ハザードを排除することが不可欠です。
静的ハザードとは、信号が一定であると想定されるときに、信号の状態が2回連続して変化することです。[ 1 ]: 48入力信号が1つ変化すると、出力は正しい値に安定する前に一時的に変化します。静的ハザードには2種類あります。
積和式に基づく適切に構成された2レベルのAND-OR論理回路では、静的0ハザードは発生しません(ただし、静的1ハザードは発生する可能性があります)。逆に、積和式のOR-AND実装では、静的1ハザードは発生しません(ただし、静的0ハザードは発生する可能性があります)。
静的ハザードを排除するために最も一般的に用いられる方法は、冗長なロジック(ロジック式における合意項)を追加することである。
物理的な論理素子(ANDゲートなど)に遅延が生じる不完全な回路を考えてみましょう。
この単純な回路は、以下の機能を実行します。
回路図を見ると、遅延が発生しなければ回路は正常に動作することがわかります。しかし、ゲートは完全に同じように製造されることはありません。この不完全性のため、最初のANDゲートの遅延は、対応するゲートの遅延とわずかに異なります。したがって、入力が111から011に変化するとき、つまりAの状態が変化するときにエラーが発生します。
これで危険がどのように発生しているかおおよそわかりましたが、より明確な状況把握とこの問題を解決するための解決策については、カルノー図を参照します。
ハフマン[ 2 ]によって証明された定理によれば、冗長なループ「BC」を追加することでハザードは解消される。
修正後の関数は以下のとおりです。
これで、論理素子が不完全であっても、Aの状態が変化しても、この例では危険の兆候は現れないことがわかります。この理論は、あらゆる論理システムに適用できます。現在では、コンピュータプログラムがこうした作業のほとんどを処理していますが、単純な例では、デバッグを手作業で行う方が速いです。入力変数が多い場合(例えば6個以上)、カルノー図上でエラーを「視覚的に確認」するのは非常に困難になります。
動的ハザードとは、信号の状態が一度だけ変化すると予想されるときに、信号の状態が連続して複数回変化する一連の現象です。[ 1 ]: 48動的ハザードとは、単一の入力変化の結果として出力が複数回変化する可能性のことです。
動的ハザードは、入力から出力への経路が複数存在する大規模な論理回路でよく発生します。各経路の遅延が異なる場合、要求される出力値や期待される出力値とは異なる出力値が発生する可能性があることがすぐに明らかになります。
例えば、論理回路の出力状態が1から0に変化するはずなのに、実際には1から0 、そして1へと変化し、最終的に正しい値である0で停止してしまう場合、これは動的ハザードです。
一般的に、動的ハザードは解決がより複雑ですが、回路からすべての静的ハザードが排除されていれば、動的ハザードは発生しないことに注意してください。
静的ハザードや動的ハザードとは対照的に、機能ハザードは複数の入力に変化が加わることによって発生するハザードです。これらを排除するための特定の論理的な解決策はありません。非常に確実な方法の一つは、入力が同時に変化しないようにすることですが、これは場合によっては適用できません。そのため、回路は各パスで遅延が等しくなるように慎重に設計する必要があります。[ 3 ]