Wir betrachten das Zeitverhalten folgender Funktion:
'(a|b)&(~b|c )'
Zunächst wandeln wir den Ausdruck in Präfix-Notation:
binexpr2prefix( '(a|b)&(~b|c )' )
Für das Gattermodell weisen wir in der Reihenfolge des Auftretens der Verknüpfungen im schaltalgebraischen Ausdruck der Funktion diesen Verknüpfungen je eine Verzögerung zu, z.B.
dly = [1 1 2]
Dann ergibt sich für ein zufälliges Inputmuster die rot dargestellte Ausgabe der Funktion:
drawdelay( ... % Aufruf der Darstellungsfunktion '(a|b)&(~b|c )' , ... % schaltalgebraischer Ausdruck [1 1 2] , ... % Verzögerungen [ nfach(randb(50),10) ;... % Inputsignal für a nfach(randb(50),10) ;... % Inputsignal für b nfach(randb(50),10) ]); % Inputsignal für c
Wiederholen Sie dies mehrfach!
Die Ausgabe zeigt an einigen Stellen ein besonderes Verhalten. Welches ?
Geben Sie die Bedingung an, unter der dies auftritt.
Wir tauschen die Werte der Verzögerungen der beiden ODER-Glieder und erhalten:
drawdelay( ... % Aufruf der Darstellungsfunktion '(a|b)&(~b|c )' , ... % schaltalgebraischer Ausdruck [1 2 1] , ... % Verzögerungen [ nfach(randb(50),10) ;... % Inputsignal für a nfach(randb(50),10) ;... % Inputsignal für b nfach(randb(50),10) ]); % Inputsignal für c
Das merkwürdige Verhalten tritt nun an anderer Stelle auf. Wann ?
Wir benutzen jetzt das einfachste Signal, bei dem der Effekt auftritt:
drawdelay( ... % Aufruf der Darstellungsfunktion '(a|b)&(~b|c )' , ... % schaltalgebraischer Ausdruck [1 1 2] , ... % Verzögerungen [ zeros(1,20) ;... % Inputsignal für a identisch 0 zeros(1,8) ones(1,12) ;... % Inputsignal für b zeros(1,20) ]); % Inputsignal für c identisch 0
Wir definieren:
Ein Hasard ist die Eigenschaft einer Schaltfunktion bei bestimmten Kombinationen der individuellen Verzögerungen ihrer Verknüpfungsglieder ein Fehlverhalten zu zeigen.
Ein Hasardfehler ist das aktuelle Fehlverhalten einer realisierten Schaltfunktion aufgrund eines Hasards.
Klassifikation von Hasards
(1) nach der Erscheinungsform am Ausgang:
(1a) statisch: eigentlich soll sich gar nichts ändern
(1b) dynamisch: es soll eigentlich genau eine Flanke geben
(2) nach den Bedingungen am Eingang, unter denen sie auftreten:
(2a) Ein Strukturhasard ist ein Hasard, der durch die Flanke einer einzigen Eingangsvariablen auftritt.
(2b) Ein Funktionshasard ist ein Hasard, der erst bei zwei gleichzeitigen Flanken von wenigstens zwei Eingangsvariablen auftritt.
Nachfolgend sind die Erscheinungsformen abgebildet
(auch hier sind die Signale als Funktionen vordefiniert):
drawbinsigs(static1hasard,'statischer 1-Hasard',{'korrektes Signal';'Hasard'})
drawbinsigs(static0hasard,'statischer 0-Hasard',{'korrektes Signal';'Hasard'})
drawbinsigs(dynamic0hasard,'dynamischer 0-Hasard',{'korrektes Signal';'Hasard'})
drawbinsigs(dynamic1hasard,'dynamischer 1-Hasard',{'korrektes Signal';'Hasard'})
Strukturhasards treten schon bei einschrittigen Änderungen des Inputsignals auf. Diese einschrittigen Änderungen entsprechen den Nachbarschafts-Schritten im KV-Diagramm. Schleifen sind als je ein Gatter realisiert. Ein Schritt innerhalb einer Schleife ändert also an keinem Gatterausgang etwas. Für einen Schritt außerhalb von Schleifen gilt das selbe. Ein Schritt von einer Schleife zu einer benachbarten Schleife ist kritisch. Wenn nämlich das Gatter, welches zunächst die 1 liefert, bei der Inputänderung schneller auf 0 schaltet als das für den neuen Input zuständige Gatter auf 1, dann geht die Ausgabe für die kurze Übergangszeit auf Null. Dadurch entsteht also ein statischer Hasard.
Die Situation ist für ein Beispiel nachfolgend dargestellt:
kvdiagram('(a&~b)|(b&c)',{'a';'b';'c'},[0 0],{[6 5] [4 8]},1)
Zwischen den Inputwerten [a b c] = [1 0 1] ↔ [1 1 1] liegt ein Hasard vor. Wir prüfen dies, indem wir die Ausgabe bei diesem kritischen Übergang für 30 zufällige Kombinationen der Verzögerungen berechnen und die Bilder dann im schnellen Wechsel anschauen:
hasarddemo2( '(a&~b)|(b&c)' );
Da es sich bei dem kritischen Übergang um den Übergang zwischen benachbarten Einsen im KV-Diagramm handelt, kann man den Hasard beseitigen durch eine zusätzliche Schleife:
kvdiagram('(a&~b)|(b&c)|(a&c)',{'a';'b';'c'},[0 0],{[6 5] [4 8] [6 8]},3)
Tatsächlich tritt kein Hasardfehler mehr auf:
hasarddemo2( '(a&~b)|(b&c)|(a&c)' );
Dieser Typ von Hasard heißt Struktur-Hasard, weil er durch strukturelle Maßnahmen bei der Realisierung beseitigt werden kann. Die Funktionshasards, die bei nicht-einschrittigen Übergängen auftreten, sind dagegen unvermeidlich.