01.03.2014 Aufrufe

Functional hardware description in Lava

Functional hardware description in Lava

Functional hardware description in Lava

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Verifikation<br />

Da man nun aber nicht für jede Schaltung alle E<strong>in</strong>gangsbelegungen (bei Schaltwerken<br />

sogar alle Folgen von Belegungen) durchprobieren möchte um zu überprüfen ob e<strong>in</strong>e<br />

Aussage wahr oder falsch ist, bietet <strong>Lava</strong> an die Schaltung an e<strong>in</strong> externes<br />

Verifikationstool zu übergeben. Dazu muss man zuerst e<strong>in</strong>e Funktion schreiben, die die<br />

Eigenschaft der Schaltung beschreibt, die man überprüfen möchte:<br />

prop_HalfAddOutputNeverBothHigh :: (Signal Bool, Signal Bool) -> Signal Bool<br />

prop_HalfAddOutputNeverBothHigh (a,b) = ok<br />

where<br />

(sum, carryOut) = halfAdd(a,b)<br />

ok<br />

= nand2(sum, carryOut)<br />

Diese Beschreibung sieht selbst aus wie e<strong>in</strong>e Schaltung und gibt High zurück wenn die<br />

zu überprüfende Eigenschaft zutrifft. (Hier wird beispielsweise überprüft ob bei e<strong>in</strong>em<br />

Halbaddierer die beiden Ausgänge niemals zusammen High se<strong>in</strong> können.)<br />

Wenn man jetzt dem Aufruf des Verifikationstools diese Eigenschaftsdef<strong>in</strong>ition<br />

übergibt kann dieses überprüfen ob diese Eigenschaft immer erfüllt ist:<br />

> smv prop_HalfAddOutputNeverBothHigh<br />

Smv:...Valid.<br />

Dabei ist wichtig, dass die Verifikation nicht daraus besteht alle Varianten durch zu<br />

probieren. Sondern die Schaltung wird <strong>in</strong> e<strong>in</strong>en mathematischen Ausdruck<br />

umgewandelt und dann von dem externen Tool überprüft. So kann sowohl die<br />

Wahrheit als auch der Gegenbeweis relativ schnell festgestellt werden. Versucht man<br />

den oberen Beweis, statt mit dem Halbaddierer mit dem Volladdierer durchzuführen,<br />

ergibt dies folgendes:<br />

> smv prop_FullAddOutputNeverBothHigh<br />

Smv:...Falsifiable.<br />

E<strong>in</strong>en Spezialfall bei der Verifikation stellen die <strong>Lava</strong>def<strong>in</strong>itionen dar, die als Parameter<br />

e<strong>in</strong>e Liste erwarten. Bei diesen Def<strong>in</strong>itionen wird erst durch die konkrete Belegung der<br />

E<strong>in</strong>gänge entscheiden was für e<strong>in</strong>e Schaltung entsteht. Daher ist e<strong>in</strong>e e<strong>in</strong>fach<br />

Def<strong>in</strong>ition der Eigenschaft wie folgt nicht ausreichend:<br />

prop_AdderCommutative :: ([Signal Bool], [Signal Bool]) -><br />

Signal Bool<br />

prop_AdderCommutative (a,b) = ok<br />

where<br />

out1 = adder(a,b)<br />

out2 = adder(b,a)<br />

ok = out1 out2<br />

Bei dieser Def<strong>in</strong>ition ist noch völlig offen wie groß die E<strong>in</strong>gabewerte s<strong>in</strong>d und welche<br />

Schaltung entsteht. Damit man diese Schaltung aber zum<strong>in</strong>dest für e<strong>in</strong>e bestimmte<br />

Größe testen kann, kann man e<strong>in</strong>e Hilfsfunktion def<strong>in</strong>ieren:<br />

prop_AdderCommutative_ForSize :: Int -> Property<br />

prop_AdderCommutative_ForSize n =<br />

forAll (list n) $ \as -><br />

forAll (list n) $ \bs -><br />

prop_AdderCommutative (as, bs)<br />

Seite 6/7

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!