# Hazard (Logikschaltungen)

Der Begriff Hazard stammt aus dem englischen Sprachraum und beschreibt eine mögliche Ursache für Schadensereignisse. In dem hier beschriebenen Stoffgebiet der Logikschaltungen, deren mathematische Beschreibung auf der von Claude Shannon entwickelten Schaltalgebra, aufbauend auf der booleschen Algebra, beruht, gibt es ebenfalls Hazards. Dies sind Eigenschaften der Schaltfunktionen (boolesche Funktionen), die unter ungünstigen Umständen zu fehlerhaften Ausgabesignalen bei Änderung von Eingabesignalen führen können. Dies beruht darauf, dass die Ausbreitungsgeschwindigkeit von Signaländerungen auf Signalleitungen endlich ist und die Umschaltvorgänge in Logikbausteinen, die die Schaltfunktionen realisieren, nicht wie idealerweise angenommen instantan erfolgen, sondern Verzögerungszeiten beinhalten. Dies führt auf kritischen Signalpfaden zu Wettläufen sich ändernder Signale (englisch „critical race“), die am Schaltungsausgang zu fehlerhaften Impulsen oder Glitches führen können. Der Hazard ist eine Eigenschaft eines Schaltnetzes, die keine hinreichende Bedingung für das Auftreten von Fehlern bei Änderung der Eingangssignale eines entsprechenden realen Schaltkreises darstellt.
Man unterscheidet zwischen strukturellen Hazards (Logikhazards) und funktionalen Hazards (Funktionshazards). Ein Glitch kann das kurzzeitige, vom logischen Entwurf der Schaltfunktion abweichende Auftreten eines logischen „1“-Signals (0-Hazard) am Schaltungsausgang während eines Eingangssignalwechsels sein, oder der kurzzeitige Zusammenbruch eines logischen „1-Signals“ (1-Hazard) auf den logischen Wert „0“. Außerdem unterscheidet man zwischen statischen und dynamischen Hazards. Statisch heißt ein Hazard, wenn die logischen Pegel des Ausgangs vor und nach der Änderung der Eingangssignale gleich sein sollen und dynamisch, wenn der logische Ausgangspegel sich ändern soll.
In rein kombinatorischen asynchronen Schaltnetzen können Glitches aufgrund von Hazards zu keinen dauerhaften Störungen führen. In sequentiellen Schaltungen (Schaltwerk), die Speicher wie Flip-Flops beinhalten, können diese fehlerhaften Impulse jedoch gespeichert werden und dadurch das Schaltwerk dauerhaft fehlsteuern. Dies ist ein Problem in allen Arten von Digitalrechnern oder Prozesssteuerungen, so dass dort in der Regel alle Eingangssignalwechsel synchronisiert werden (synchrone Schaltwerke). Es wird dabei ein Taktsignal (englisch „Clock“) verwendet, das eine Änderung von Ausgangssignalwechseln bis zum Abklingen der kritischen Wettläufe der Eingangsvariablen verzögert. Dadurch wird die Arbeitsgeschwindigkeit eines synchronen Schaltnetzes gegenüber der eines asynchronen Schaltnetzes herabgesetzt. Dies hat man bei Digitalrechnern in der Vergangenheit durch ständige Verringerung der Schaltverzögerungen von Logikschaltungen bei gleichzeitiger Erhöhung der Taktraten der Prozessoren deutlich verbessern können. So verwendete der Prozessor des Intel 8080A im Jahr 1973 eine Taktfrequenz von 2 MHz, im Jahr 2024 arbeitet der Intel Core i9 mit einer Taktfrequenz von 3–5,8 GHz, einer Steigerung um das mehr als Tausendfache.

## Hazardursachen

In elektrotechnischen Realisierungen von Schaltfunktionen werden kontaktlose Logikgatter oder kontaktbehaftete mechanische Schalteinrichtungen wie Relais oder Schütze verwendet. Wegen der sehr unterschiedlichen Schaltzeiten solcher technischer Bauelemente besitzen diese ein stark voneinander abweichendes Verzögerungsverhalten. Der Vorteil digitaler gegenüber analoger Signalverarbeitung ist ja, dass es nur zwei deutlich voneinander verschiedene Signalzustände mit den Werten „0“ und „1“ gibt, was die Anfälligkeit für Signalstörungen stark reduziert. Bei einer den booleschen Gesetzen gehorchenden Schaltfunktion sind die Beziehungen zwischen Ein- und Ausgangsgrößen statisch; die in der Dynamik bestimmende Größe Zeit t spielt keine Rolle und Signalübergänge finden idealisiert ohne Verzögerung statt.
Bei realen Bauelementen, die solche Schaltfunktionen technisch realisieren, ist das zeitliche Verhalten aber anders. Im Bild ist ein Schaltfolgediagramm eines Signalwechsels dargestellt. Ein Schaltfolgediagramm beschreibt den Wechsel digitaler Signale zwischen den unterschiedlichen Logikpegeln in Abhängigkeit von der Zeit t. In Teilbild a) ist ein ideales, digitales Signal dargestellt, das anfangs vom Signalpegel „0“ auf den Signalpegel „1“ springt und später wieder zurückspringt. Im Teilbild b) ist das Schaltverhalten eines realen elektronischen Bauelementes dargestellt. Der logische Wert „0“ wird hier von einem Signalpegel kleiner als U$_{0max}$ und der logische Wert „1“ von einem Signalpegel größer U$_{1min}$ repräsentiert. Spannungspegel dazwischen werden als „verbotener Bereich“ bezeichnet, was bedeutet, dass für Eingangspegel in diesem Bereich der Ausgangspegel eines Logikbausteins nicht definiert ist. Die ansteigende und die abfallende Flanke eines realen Signalwechsels sind mit Verzögerungszeiten t$_{ein}$ und t$_{aus}$ verbunden, deren Dauer (Gatterlaufzeit) von der verwendeten Halbleitertechnologie des Logikbausteins abhängt. Während eines Signalwechsels durchläuft der Spannungspegel am Eingang den verbotenen Bereich und der Wechsel am Ausgang wird dadurch um ein bestimmtes Zeitintervall verzögert. Wann der Flankenwechsel an einem nachfolgenden Logikgatter erfolgt, ist wie in Teilbild c) dargestellt, variabel und relativ unbestimmt. Neben den Verzögerungszeiten der Logikgatter spielen auch die Laufzeiten auf den verbindenden Signalleitungen zwischen Logikbausteinen eine Rolle.
Während die Schaltverzögerungen von Logikgattern in Schottky-TTL-Technik im Bereich von 3 ns liegen, haben Relais durchaus Schaltverzögerungen im Bereich von 100 ms und mehr. Hier sind die Gefahren von Hazards von hoher Bedeutung.

## Logische Hazards

Logische Hazards beruhen auf einem fehlerhaften Logikentwurf für eine Schaltfunktion. Aufgrund dessen kommt es in der Regel zu einem kritischen Wettlauf zwischen einer Eingangsvariablen $x_{i}$ und ihrem Komplement ${\bar {x}}_{i}$. Ein Beispiel für einen solchen kritischen Wettlauf ist im nachfolgenden Bild für die Schaltfunktion $z=(x_{1}\land x_{2})\lor ({\bar {x}}_{2}\land x_{3})$ dargestellt. Links befindet sich das zur Schaltfunktion gehörende Karnaugh-Veitch-Diagramm (KV-Diagramm) für die drei Eingangsvariablen x$_1$, x$_2$ und x$_3$. Es enthält in den Feldern die Werte der Ausgangsgröße z für alle möglichen Kombinationen des Eingangsvektors ${\vec {x}}=(x_{1},x_{2},x_{3})$. Zur Kennzeichnung der Felder des Diagramms ist jeweils in der linken oberen Ecke jedes Feldes als rote Zahl das sogenannte „Dezimaläquivalent“ der Eingangsvariablen dargestellt. Dies erhält man, wenn man die Belegung der Eingangsvariablen als Dualzahl interpretiert und diese in eine Dezimalzahl wandelt. Um beispielsweise das Dezimaläquivalent „5“ zu erhalten, muss der Eingangsvektor wie folgt belegt sein: ${\vec {x}}{\widehat {=}}(x_{1}\cdot 2^{0},x_{2}\cdot 2^{1},x_{3}\cdot 2^{2})=(1\cdot 1,0\cdot 2,1\cdot 4)=101_{Dual}=5_{Dezimal}$. Ebenfalls im KV-Diagramm sind zwei Schleifen für die beiden Minterme der Schaltfunktion durch blaue Umrandung markiert.
Rechts daneben ist das zugehörige Schaltnetz mit Logikgattern dargestellt, wobei die vier Logikbausteine mit g$_1$, ..., g$_4$ nummeriert sind.
Den statischen logischen 1-Hazard der Schaltfunktion erkennt man im KV-Diagramm daran, dass der Übergang bei einem Eingangssignalwechsel zwischen zwei benachbarten Belegungen mit dem Ausgangswert z = 1 von keinem Primimplikanten überdeckt wird. Benachbart bedeutet dabei, dass die Belegungen des Eingangsvektors sich in genau einer Komponente (hier x$_2$) unterscheiden. Ein solcher Hazard-Übergang ist der zwischen den Belegungen mit den Dezimaläquivalenten 5 und 7. Aufgrund dieses Hazards kann am Ausgang der Schaltungsrealisierung (Logikgatter g$_4$) beim entsprechenden Übergang ein fehlerhafter Einbruch des 1-Signals (Glitch) auftreten. Liegt nämlich am Eingang der Schaltung die Belegung ${\vec {x}}=(x_{1},x_{2},x_{3})=(1,1,1)\ {\widehat {=}}\ 7$ und wechselt man die Belegung auf ${\vec {x}}=(x_{1},x_{2},x_{3})=(1,0,1)\ {\widehat {=}}\ 5$, so ändert die Variable x$_2$ ihren Wert. Die Schaltgatter g$_1$ - g$_4$ verzögern jede Änderung einer Variablen um ein bestimmtes Zeitintervall Δt, das hier vereinfachend für alle Gatter als gleich angenommen wird. Im nebenstehenden Schaltfolgediagramm ist die Schaltfolge an den Eingängen, den Logikgattern und dem Ausgang beim Übergang des Eingangsvektors $(1,1,1)\rightarrow (1,0,1)\ {\widehat {=}}\ 7\rightarrow 5$ dargestellt. Der Inverter g$_3$ zur Negierung von x$_2$ verzögert den Wechsel des Signals um Δt, wodurch der Ausgang des Und-Gatters g$_2$ den Wert „1“ erst um Δt nach dem Wechsel des Gatterausgangs von g$_1$ übernimmt. Dadurch liegt für einen Zeitraum Δt an beiden Eingängen des Oder-Gatters g$_4$ der Wert „0“ an, was einen Ausgang z = 0 zur Folge hat. Dieser kurzzeitige Impuls ist ein Glitch.
Betrachtet man den entgegengesetzten Übergang $5\rightarrow 7$, so tritt durch die Verzögerung des Inverters an den Eingängen des Gatters g$_4$ kurzzeitig die Belegung $(g_{1},g_{2})=(1,1)$ auf, die den Ausgangswert z = 1 zur Folge hat. Dies entspricht dem statischen Funktionswert zu Anfang und Ende des Übergangs. Trotz des logischen Hazards in der Schaltfunktion läuft also der Übergang der Eingangsbelegung fehlerfrei ohne Glitch ab. Das fehlerhafte Verhalten des Schaltnetzes beim Vorhandensein eines logischen Hazards beruht demnach auf dem Wettlauf einer Variablenänderung mit der gegensinnigen Änderung ihres Komplementes auf zwei verschiedenen Signalpfaden. Verschiedene Signalpfade liegen dann vor, wenn von einem Divergenzpunkt A (fan-out point) aus ein Eingangssignal verschiedenen Gattern eines Schaltnetzes zugeführt wird. Von da aus laufen Signaländerungen auf verschiedenen Signalpfaden, die in der Regel auch verschiedene Verzögerungszeiten verursachen, zu einem Konvergenzpunkt (fan-in-point), an dem sie wieder zusammengefasst werden. Im Beispiel ist dies das Oder-Gatter g$_4$ mit dem Ausgang z. Verläuft ein Wettlauf so, dass zeitweilig am Konvergenzpunkt Signale anstehen können, deren logische Verknüpfung einen vom statischen Wert des Ausgangssignals abweichenden Wert erzeugen können, so wird dieser Wettlauf als „kritisch“ (critical race) bezeichnet. Nur wenn ein Variablenwettlauf kritisch ausfallen kann, liegt im Schaltnetz ein Hazard vor.
Ein logischer Hazard einer Schaltfunktion kann jedoch durch einen geänderten logischen Entwurf beseitigt werden, was die Gefahr kritischer Wettläufe eliminiert. Im gezeigten Beispiel enthält die Schaltfunktion einen logischen 1-Hazard, da der Übergang $5\leftarrow \rightarrow 7$ von keinem Primimplikanten überdeckt wird. Fügt man den Minterm $x_{1}\land x_{3}$ disjunktiv zur Schaltfunktion hinzu, so hält das realisierende Und-Gatter das 1-Signal während des Übergangs $5\leftarrow \rightarrow 7$ statisch beim Wert 1. Ein Variablenwettlauf von x$_2$ mit seinem Komplement kann dann in keinem Fall kritisch sein und der Hazard ist dadurch beseitigt.

## Funktionshazards

Hat man in obiger Beispielfunktion den logischen Hazard eliminiert, indem man die Schaltfunktion auf $z=(x_{1}\land x_{2})\lor ({\bar {x}}_{2}\land x_{3})\lor (x_{1}\land x_{3})$ ändert, so können bei anderen Übergängen weitere Glitches auftreten, obwohl das Schaltnetz frei von logischen Hazards ist. Betrachtet man den Übergang $4\leftarrow \rightarrow 7$, so sieht man, dass sich die zwei voneinander unabhängigen Variablen x$_1$ und x$_2$ gleichzeitig ändern müssen. Dabei kann es ebenfalls zu einem kritischen Wettlauf kommen, da ein tatsächlich gleichzeitiger mehrfacher Signalwechsel kaum möglich ist. Ändert sich beim doppelten Signalwechsel für den Übergang $4\rightarrow 7$ zuerst x$_2$ und dann x$_1$, so liegt kurzzeitig am Eingang des Schaltnetzes die Belegung mit dem Dezimaläquivalent „6“ an, die den Ausgangswert z = 0 zur Folge hat. Obwohl der Ausgangswert zu Anfang und Ende des Übergangs den logischen Wert „1“ haben soll, kann daher kurzzeitig ein Zusammenbruch des Ausgangssignals (Glitch) auf den Wert „0“ stattfinden. Erfolgt jedoch zuerst die Änderung von x$_1$ und dann die von x$_2$, so liegt kurzzeitig die Belegung mit dem Dezimaläquivalent „5“ am Eingang des Schaltnetzes an, welche den Funktionswert z = 1 zur Folge hat, was dem statischen Funktionswert zu Anfang und Ende des Übergangs entspricht. Bei dem Übergang $4\rightarrow 7$ enthält die Schaltfunktion einen Funktionshazard, der die Gefahr beinhaltet, das ein Variablenwettlauf unabhängiger Eingangsvariablen kritisch verlaufen kann. Ein solcher Funktionshazard ist an das gewünschte logische Verhalten des Schaltnetzes geknüpft und kann nicht durch eine Maßnahme wie beim logischen Hazard beseitigt werden. Eine Beseitigung wäre nur durch Änderung des logischen Verhaltens der Schaltfunktion möglich, was aber die Aufgabenstellung für das Schaltnetz ändern würde.
Schon die elementaren logischen Grundfunktionen wie die Und-Funktion (Konjunktion) enthalten Funktionshazards. Bei gleichzeitigem Signalwechsel der Eingangsvariablen eines Und-Gatters können bei einem kritischen Wettlauf 1-Glitche am Ausgang auftreten, wenn der Signalwechsel nicht absolut gleichzeitig erfolgt. In wird eine Methode beschrieben, wie man die Fehlertoleranz bei Funktionshazards erhöhen kann, ohne gleichzeitig die logische Funktion ändern zu müssen. Die Methode beseitigt die Funktionshazards nicht, sondern verringert die Wahrscheinlichkeit des Auftretens kritischer Wettläufe. Im Bild wurde mit Hilfe des Simulationssystems 20-sim das dynamische Verhalten eines Und-Gatters (AND) und einer logisch äquivalenten Schaltfunktion aus drei Und-Gattern beim doppelten Signalwechsel der beiden Eingangssignale dargestellt. Diese topologische Anordnung von drei Und-Gattern (AND_1, AND_2, AND_3) hat als statische Logikfunktion die der Und-Funktion (AND). Durch die räumliche Anordnung wird die Eingangsvariable x$_1$ zweimal und x$_2$ einmal zugeführt. Dabei entsteht eine gestaffelte Verzögerungskette, in der der Wechsel von x$_1$ für den Zeitpunkt des Wechsels von x$_2$ um eine Gatterverzögerung Δt vorher (t-Δt) und nachher (t+Δt) versetzt wird. Erfolgt daher der „gleichzeitige“ Flankenwechsel der Signale x$_1$ und x$_2$ um weniger als Δt gegeneinander versetzt, so bewirkt der Funktionshazard in besagtem Übergang keinen kritischen Wettlauf. Dies ist im Schaltfolgediagramm als simulierte Schaltfolge für ein „einfaches“ und ein wie beschrieben gestaffeltes „Und“ im Bild dargestellt. Beim gleichzeitigen Wechsel von x$_1$ ($1\rightarrow 0$) und x$_2$ ($0\rightarrow 1$) entsteht bei einem einfachen „Und“ am Ausgang z ein 1-Glitch aufgrund des vorhandenen Funktionshazards. Die dreifache Und-Gatter-Kombination arbeitet unter gleichen Bedingungen bei diesem Variablenwechsel fehlerfrei und zeigt auch sonst äquivalentes logisches Verhalten.
Fällt der Flankenwechsel der Eingangsvariablen um mehr als die Gatterverzögerung Δt auseinander, so bewirkt der Funktionshazard wiederum einen kritischen Wettlauf und der Glitch tritt auch hier auf. Man kann die Fehlertoleranz aber weiter erhöhen, indem man in die Signalpfade größere Verzögerungszeiten Δt einbaut.

## Synchronisation

Während Funktionshazards in asynchronen Schaltnetzen aufgrund von Glitches nur kurzzeitige Fehlfunktionen erzeugen, können solche Fehlerimpulse in asynchronen Schaltwerken zu dauerhaftem Fehlverhalten führen. Da Schaltwerke Speicher enthalten, die Schaltwerkszustände in der Vergangenheit speichern, kann auch ein fehlerhafter Impuls dauerhaft gespeichert werden und dadurch dem Schaltwerk einen falschen Zustand vortäuschen. Ein typisches Beispiel für ein solches Schaltwerk ist die arithmetisch-logische Einheit (ALU) eines Digitalrechners. Aufgrund der großen Wortbreite (16-Bit,..., 64-Bit) finden hier sehr viele mehrfache Signalwechsel an den Eingängen statt, die unweigerlich eine Vielzahl von Glitchen hervorrufen würden. Deswegen wurden schon in den ersten Digitalrechnern diese Schaltwerke nicht asynchron, sondern durch ein Taktsignal synchronisiert betrieben.
Im Bild ist eine kombinatorische Kette von logischen Verknüpfungsstufen dargestellt. Würde der Eingangsvektor ${\vec {x}}$ mit einer Wortbreite von 8,...,64 Bit sich in mehreren Komponenten gleichzeitig ändern, so würden an den Ausgängen aufgrund von Funktionshazards eine Vielzahl von Glitchen auftreten, die in nachgeschalteten Speicherelementen dauerhaft Fehler hinterlassen würden. Hier ist den Ausgängen eine entsprechende Anzahl taktgesteuerter Flip-Flops nachgeschaltet, die Änderungen an den Ausgängen von K$_1$,...,K$_n$ erst dann übernehmen, wenn das Taktsignal eintrifft. Dies erfolgt nach einer Verzögerungszeit die sicherstellt, dass alle Eingangssignaländerungen stattgefunden haben und die Signalverzögerungen auf kritischen Signalpfaden abgelaufen sind. Gesteuert durch das Taktsignal werden dann die Ausgangswerte des Vektors ${\vec {z}}$ weitergeschaltet und der nächsten Verarbeitungsstufe zugeführt. Dies findet in den Recheneinheiten von Digitalrechnern mehrfach hintereinander statt, was die Arbeitsgeschwindigkeit gegenüber der asynchronen Arbeitsweise deutlich herabsetzt, aber auch durch klar voneinander abgegrenzte Schritte das Laufzeitgeschehen überschaubar macht.