Seite 1 von 1

Funktionelle Hazards

Verfasst: 29. Mär 2009 20:08
von Mojito Mix
Hallo,

im Skript heißt es, dass Funktionelle Hazards mittels Einführung zusätzlicher Variablen behoben werden können. Ich verstehe leider net genau wieso das funktioniert. Wär dankbar, wenn mir das mal jemand genauer erklären könnte. Es geht hierbei um die Folie 3-37.

danke

Re: Funktionelle Hazards

Verfasst: 31. Mär 2009 12:34
von jonas
Du hast eine beliebig komplexe Funktion - nennen wir sie G(A,B).
Du kannst diese Funktion (wie sie auch immer aussehen mag) so realisieren, dass sie Hazard frei ist WENN sich nur eine Variable auf einmal ändert.
Wenn du nun der Funktion erlaubst, dass sich mehrere Eingangs-Variablen zur selben Zeit ändern kannst du nicht (ohne weiteres) sicherstellen das kein Hazard auftritt.

Stell dir vor in der Realisierung der Funktion benötigt eine Änderung an Variable A 5ns bis sich die Veränderung am Ausgang bemerkbar macht.
Bei Variable B dauert es jedoch 10ns.
Man könnte zB sagen, dass die beiden Veränderungen verschieden viele Gatter durchlaufen.

Konkretes Beispiel: zB: G(A,B) = A und (nicht B).
Das Und-Gatter verzögert um 5ns, der Inverter vor B jedoch auch.
A = 0, B = 0 => Ausgang wäre 0
Änderst du A zu 1 kommt nach der Verzögerung vom Und-Gatter (zB 5ns) am Ausgang eine 1 raus.
A bleibt 1, nun änderst du auch B zu 1. Nach der Verzögerung vom Inverter (zB 5ns) liegt der "neue" Wert (also die 0) am Und-Gatter an und wird nach dessen Verzögerung zum Ausgang gegeben. Das heißt 10ns nach der Veränderung von B kommt am Ausgang die 0 raus.

So weit so gut - was passiert wenn du nun BEIDE Variablen gleichzeitig umschaltest?
(Anfangszustand: A = 0, B = 0; Ausgang=0)
Der Inverter braucht 5ns um auf die Veränderung zu reagieren.
In dieser Zeit liegt am Und-Gatter der veränderte A-Wert und der noch unveränderte Ausgang vom Inverter an.
Nach 5ns hat das Und-Gatter das verarbeitet und gibt als Ausgang 1 aus.
Gleichzeitig gibt der Inverter den veränderten Wert (also eine 0) aus - womit nun am Und-Gatter "A"=1 und "nicht B"=0 anliegen.
Nach weiteren 5ns hat das Und-Gatter darauf reagiert und gibt als Ausgang 0 aus.

---
so weit zum Problem der Funktionellen Hazards.
Die Lösung im Skript sagt, dass wir eine neue Variable einführen sollen.
Diese Variable muss (nach meinem Verständnis) so eingebaut werden, dass wenn sie "aktiv" ist, der Ausgang sich nicht verändert.
In meinem Beispiel oben könnte man sie so einbauen:
(A und (nicht B) und C
Solange man keine Eingänge verändern möchte legt man an C 1 an. Das Ergebnis aus unserem G(A,b) (also von: (A und (nicht B))) wird nicht beeinflusst.
Wenn ich nun mehrere Variablen verändern möchte lege ich zu erst 0 an C an.
Solange C auf 0 ist gibt die Gesamtfunktion auch 0 aus (irgendwas und 0 => 0).
Sobald C auf 0 ist kann ich beliebig viele Variablen umschalten - das Resultat der Schaltung ist und bleibt 0.
Sobald ich davon ausgehe, dass alle Veränderungen beachtet wurden schalte ich C wieder auf 1 - und voilà als Resultat der Funktion kommt das richtige Ergebnis.

So verstehe ich zumindest den Lösungsansatz im Skript.
Im Prinzip tauschst du das Problem des potentiellen funktionellen Hazards gegen die Gewissheit, dass solange die zusätzliche Variable verändert wurde ein vorher definiertes Ergebnis ausgegeben wird (zB 0) und wenn du (unter Beachtung des zeitlichen Abstands) die zusätzliche Variable wieder zurücksetzt erhältst du das richtige Ergebnis - ohne Hazard.

Ich schätze das als interessant zu wissen aber im Augenblick für unsere Implementierungen unwichtig ein.
Dazu gab es glaube ich auch keine Übung - ich werde mir für die Klausur merken "Hazard-Beseitigung mit K-Diagrammen hilft nur wenn sich eine(!) Eingangs-Variable auf einmal ändert - tun es mehrere kann es funktionelle Hazards geben."

Ich hoffe dir ist klar geworden was funktionelle Hazards sind - und wie man sie meiner Meinung nach beseitigt.
Sollte ich das falsch verstehen und die zusätzliche Variable muss anders eingeführt/-baut werden tuts mir Leid und ich wäre auch daran interessiert den korrekten Weg zu erfahren.