Forum: FPGA, VHDL & Co. Verifikationsplan


von Peter (Gast)


Lesenswert?

Hallo zusammen -

Ich habe derzeit das Problem, viele Module auf ihre Funktion/Fehler etc. 
zu untersuchen.
Welches Tool verwendet ihr um einen Verifikationsplan zu erstellen? 
Excel?
Schreibt ihr für jeden Test eine eigene TestBench?
Dachte mir einen Plan in Excel zu schreiben, und die einzelnen 
TestBenches in seperaten Reitern zu schreiben. Das ganze dann als ascii 
raussschreiben lassen und simulieren.

Und - wie stellt ihr das an, wenn man die outputs mit zu erwarteten 
outputs automatisch vergleichen möchte?

Hierzu hätte ich wieder excel verwendet.. aus der TestBench die outputs 
in ein text-File schreiben lassen, in excel einlesen und mit einem macro 
vergleichen..

Wäre für jegliche Anregung dankbar.

Grüße,
Peter

von Duke Scarring (Gast)


Lesenswert?

Wow: Generation Excel.
Excel ist doch was für's Marketing, nicht für Ingenieure...


Hier hat jedes Modul eine Testbench und die Referenzdaten werden per 
Skript erzeugt. Außerdem gibt es eine Testbench für's Gesammtsystem, da 
kann man dann sehen, ob die Module zusammenspielen.
Den Vergleich, ob ein Modul das Richtige ausspuckt macht ebenfalls die 
Testbench.

Duke

von Matthias G. (mgottke)


Lesenswert?

Hallo Peter,

die Testpattern in Excel zu erzeugen kann durchaus Sinn machen. Je nach 
dem wie umfangreich und generische die sind. Ganz egal wie du die 
Testpattern erstellst, ich würde die Eingangssignale und die zu 
erwartenden Ergebnisse hintereinander jeweils in eine Zeile in ein 
Textfile bringen (z.B. Export von Excel). Diese Werte werden dann aus 
der Testbench ausgelesen. Die Eingangssignale an die UUT weitergegeben 
und die Ausgangssignale der UUT werden gleich in der Testbench mit den 
zu erwartenden Werten vergleichen.

Bei einem Fehler kann die Testbench ja einen "assert" generieren und man 
befindet sich dann gleich an der Stelle welche Probleme macht. Wenn der 
Test Fehlerfrei durchläuft, spuckt Modelsim dann ein OK aus. Damit ist 
ein test sehr schnell gemacht und bei Änderungen im Design diese sehr 
schnell verifiziert.

Noch ein paar Tips:
- Für die Tests schreibe ich mir immer ein ".do"-file in dem schon die 
Waves etc. schon enthalten sind.
- Am Ende des ".do"-files setze ich ein "run" mit einer sehr langen 
Zeit, die sicher viel länge ist, als mein Test benötigt. Z.B. "run 100 
ms". Ein OK am Ende der Testpattern generiere ich ebenfalls mit einem 
"assert", da Modelsim sich nicht anders überreden lässt den Test zu 
beenden. So läuft der Test immer genau so lange bis die Testpattern 
abgearbeitet sind.
- Der Test mit Modelsim und dem ".do"-file rufe zudem noch über eine 
Batch-Datei auf. Die Verifikation ist dann nur noch mit einem 
Doppelklick im Explorer und dem Warten auf das OK sehr schnell erledigt.
- Im übrigen ist es Hilfreich in der Testbench einen Testpatternzähler 
mit einzubinden, der im Fehlerfall noch die Zeilennummer aus dem 
Testpatten-file liefert.

von Peter (Gast)


Lesenswert?

Ja, ich weiss - excel ist nicht gerade DAS Ingenieurstool.

Dennoch - irgendwie muesst ihr ja alle Tests verwalten, sprich eine 
Tabelle etc. haben in der letztendlich pass/fail steht.
Aus genau der Tabelle hatte ich mir auch die Tests rausschreiben wollen. 
So habe ich alles in einem file..

Was verwendet ihr als script-Sprache ? Perl ?

von Duke Scarring (Gast)


Lesenswert?

@Matthias:

>- Am Ende des ".do"-files setze ich ein "run" mit einer sehr langen
>Zeit, die sicher viel länge ist, als mein Test benötigt. Z.B. "run 100
>ms". Ein OK am Ende der Testpattern generiere ich ebenfalls mit einem
>"assert", da Modelsim sich nicht anders überreden lässt den Test zu
>beenden. So läuft der Test immer genau so lange bis die Testpattern
>abgearbeitet sind.
Flasch.

Meine Testbenches halten an, wenn sie fertig sind (oder ein Fehler 
auftritt):
1
  signal simulation_running : boolean := true;
2
3
  ...
4
  ...
5
6
  clk   <= not clk  after 20 ns when simulation_running; 
7
  
8
  ...
9
  ...
10
  main: process:
11
   ...
12
   report "Simulation ends."
13
   simulation_running <= false;
14
   wait;
15
  end process;
16
17
  ...

Duke

von Matthias G. (mgottke)


Lesenswert?

@ Duke:

Tolle Idee einfach den Clock anhalten. Auf die Idee bin ich noch nicht 
gekommen. Was allerdings ungünstig ist, ist dass die Waves ewig lang 
werden.

Danke

von Duke Scarring (Gast)


Lesenswert?

@Matthias:
> Was allerdings ungünstig ist, ist dass die Waves ewig lang
> werden.
Irgendwie stehe ich auf dem Schlauch, diesen Satz verstehe ich gerade 
nicht.

Duke

von Peter (Gast)


Lesenswert?

@Matthias:
Hallo Matthias -
hast Du ein kleines Testbench Beispiel, indem Du zeigen kannst, wie Du 
das machst?
<<ich würde die Eingangssignale und die zu
erwartenden Ergebnisse hintereinander jeweils in eine Zeile in ein
Textfile bringen (z.B. Export von Excel). Diese Werte werden dann aus
der Testbench ausgelesen. Die Eingangssignale an die UUT weitergegeben
und die Ausgangssignale der UUT werden gleich in der Testbench mit den
zu erwartenden Werten vergleichen.>>

Würde mich brennend interessieren. Arbeite noch nicht lange mit vhdl und 
bin über jeden praktischen input dankbar..

Deshalb ja auch die Frage nach dem Verifikationsplan.

von Duke Scarring (Gast)


Lesenswert?

@Peter:

Es ist m.E. günstiger zwei getrennte Dateien zu verwenden: Eine für die 
Eingangsdaten und die zweite für die Ausgangsdaten (und noch eine dritte 
für Konfigurationsdaten, wenn nötig).

Aber ein Verifikationsplan ist etwas anderes. Da steht drin, welche 
Tests durchgeführt werden/wurden. Die Tests selber wiederum können dann 
systematisch sein (z.B. alle möglichen Eingangswerte), bestimmte 
Grenzfälle abdecken oder mit Zufallswerten durchgeführt werden.

Da ist es hilfreich schon ein Modell in einer Hoch-/Skriptsprache (z.B. 
matlab, perl, python) zu haben, womit man die passenden Vergleichsdaten 
erzeugen kann.

Duke

von Klaus Falser (Gast)


Lesenswert?

> ich würde die Eingangssignale und die zu
> erwartenden Ergebnisse hintereinander jeweils in eine Zeile in ein
> Textfile bringen (z.B. Export von Excel). Diese Werte werden dann aus
> der Testbench ausgelesen. Die Eingangssignale an die UUT weitergegeben
> und die Ausgangssignale der UUT werden gleich in der Testbench mit den
> zu erwartenden Werten vergleichen.

Ich denke nicht, dass sich eine solche Vorgangsweise für komplexere 
Designs eignet.
Was soll denn überhaupt in jeder Zeile für die Eingangssignalen 
drinnenstehen? Der Zustand zu jeder Taktflanke? Bei 300 MHz Taktrate und 
10 ms Simulationszeit gibt das ewig große Dateien und ewig langsame 
Simulation.
Wann soll denn der Ausgang abgegriffen und verglichen werden? Genau zur 
Taktflanke oder später? Was ist mit asynchronen Signalen oder Busse, die 
verzögert hochohmig werden?
Wie willst du denn deine Eingangsvektoren und Ausgangsvektoren erzeugen 
und wie kannst Du sicher sein dass sie richtig sind wenn Du 100 
Eingangs-/Ausgangssignale hast und diese für vielleicht 1 Mio Taktzyklen 
beobachten willst?

Excel mag gehen, um wie gesagt, die Ergebnisse "Pass/Fail" zu sammeln, 
aber nicht um die Testvektoren zu verwalten.
Gerade aus diesem Grund hat man ja VHDL (und Verilog) erfunden. Diese 
sind eine Hochsprache, mit der man die Testsignale prozedural erzeugen 
und überprüfen kann.
Wenn Du wirklich komplexere Designs testen willst, dann lernen 
Testbenches zu schreiben. Dazu gehören BFMs (Bus Functional Models) und 
sonstige Modelle von öfter verwendeten Units.

Aber letztendlich ist es immer ein Kompromiss zwischen Auswand und 
Nutzen. Wenn ich Designs verkaufen will oder ein ASIC entwerfe, das ich 
nicht mehr ändern kann, dann werde ich vieles sehr sorgfältig testen, 
bis ich wirklich 100 % sicher bin.
Dann werde ich mir vielleicht auch die Mühe machen, Regression-Test zu 
fahren, um sicher zu sein, dass durch eine spätere Änderung sich nichts 
and der zuvor getesteten Funktion geändert hat.
Wenn ich ein FPGA verwende, dann werde ich mir möglicherweise zwar die 
prinzipielle Funktion am Simulator ansehen, und nur wenn ich später 
irgendwo Probleme habe, dies mit Hilfe des Simulators debuggen.

von Matthias G. (mgottke)


Lesenswert?

@ Klaus
> Aber letztendlich ist es immer ein Kompromiss zwischen Auswand und
> Nutzen. Wenn ich Designs verkaufen will oder ein ASIC entwerfe, das ich

Das ist wohl wahr. Du hast hier viel ausgeführt. Und man kann sicherlich 
keine allgemein Aussage treffen, welche Methode die für einen Test ist. 
Das ist immer Designabhängig. Im Fall von 1000-Eingängenen und Millionen 
Testpattern wird es schwierig und händisch sind die sowieso nicht mehr 
zu schreiben.

Oft ist es aber geradezu sinnvoll ein Teilkomplex mit einer endlichen 
Anzahl von Testpattern durchlaufen zu lassen. An einem Beispiel von 
einem Addierer kann das z.B. so aussehen:
Der Addierer hat z.B. In_A und In_B und Result als Signale. Alle als 
Integer (zur vereinfachung)
Die Testpattern könnten dann z.B. im File so aussehen:
  2  5  7
  9  23 22
  ...
Die Testbench ließt dann die drei Werte der Zeile ein. Leitet die Ersten 
Beiden an die Eingänge, wartet von mir aus bis zur nächsten Taktflanke 
und prüft den Result-Wert mit dem 3. Wert aus der Testbench. Bei einem 
Fehler wird ein assert erzeugt. Dies wird so lange gemacht, bis das 
File-Ende erreicht ist. Klingt doch irgendwie logisch.

Dies kann natürlich nicht alle Testfälle erschlagen. In Designs in denen 
ich z.B. viele Eingänge habe und unterschiedliche Abläufe simulieren 
möchte, definiere ich mir eine Art Befehlssatz. Dies sind Strings, die 
in den Testpattern an erster Stelle stehen. Die darauf folgende Daten 
sind dann je nach Befehl variabel. Die Testbench wiederum interpretiert 
die Befehle und die Daten. Teilweise habe ich auch Makrofunktionalität 
in den Befehlssatz mit eingebaut. Dies reduziert den Umfang der 
Testpattern dann erheblich. Dies nur so als Beispiel.

von Segor (Gast)


Lesenswert?

>Wow: Generation Excel.
>Excel ist doch was für's Marketing, nicht für Ingenieure.

Ich nutze seir Jahren Excel, um mir tabellarischen Code zu erzeugen

von berndl (Gast)


Lesenswert?

Hi,

ich mach' das so: Zu eigentlich jeder Entity gibt es auch eine oder 
mehrere Testbenches. Die arbeiten entweder mit fixen Parametern oder mit 
Pseudo-Random-Pattern. Bei fixen Parametern gebe ich natuerlich auch die 
erwarteten Ergebnisse vor, bei Pseudo-Random 'rechnet' die Testbench die 
erwarteten Werte selber aus (in einer Procedure oder Function).

Darueber hinaus heissen meine Testbenches halt auch (Filename) 
<design>_tb*.vhd.

Die Testbenches schreiben diverse Meldungen in ein Logfile 
(<design>_tb*.log), da steht am Ende eben auch: 'All tests successfully 
passed'.

Dann gehe ich mit einem Perl-Script ueber das Directory, werte aus was 
ich alles so gefunden habe, und erzeuge davon ein <project>.html File im 
passenden Doku-Verzeichnis. Da steht unter anderem auch drin, wann ich 
diese Testbench zum letzten Mal laufen gelassen habe.

Damit habe ich auf 2 Bildschirmseiten eine gute Uebersicht, was ich im 
Design in letzter Zeit gemacht bzw. simuliert habe, sowie eben auch der 
Status.

Wenn man das einmal aufgesetzt hat und sich bei den Filenamen an gewisse 
Randbedingungen haelt, dann faellt eine kurze Doku/Status sozusagen 
'nebenbei' ab. Die Meldungen aus der Testbench enthalten auch noch 
Infos, was diese TB denn testen will, das kommt als Kurzbeschreibung 
natuerlich auch ins .html.

Also ich brauche kein Excel oder Calc...

von Matthias G. (mgottke)


Lesenswert?

> Darueber hinaus heissen meine Testbenches halt auch (Filename)
> <design>_tb*.vhd.

Das handhabe ich genau so. Da gibt es einfache Restriktionen  über 
Filenamen, Erweiterungen und Verzeichnisstrukturen. Damit lässt sich das 
meiste schon lösen.

Kannst Du mal dein Script mit einstellen. An dem hätte ich auch 
Interesse.

Matthias

von nixda (Gast)


Lesenswert?

servus,

Verfikationsumgebungen werden bei groesseren Designs zumeist mit einer 
constraint-random driven methodik aufgebaut. die benutzten 
sprachen/tools dort sind aktuell hauptsaechlich specman-e bzw 
systemverilog/ovm. dazu kommen assertions formal oder simulativ.

als planungstool gibt es zb. jasper gameplan 
http://www.jasper-da.com/gameplan/ oder von cadence den Enterprise 
Planner zum schreiben von verifikationsplaenen wobei letzerer im 
zusammenspiel mit dem enterprise planner planung und status tracking 
bzgl. unterschiedlichsten metriken abdeckt (code coverage,funktionale 
coverage, directed tests pass/fail, formales pass/fail)(näheres 
http://www.cadence.com/products/fv/Pages/mdv_flow.aspx). mentor hat auch 
etwas in der richtung vorgestellt - habe aber den link nicht auf die 
schnelle

das sind natuerlich keine pakete fuer den heimgebrauch :-). sonst gibt 
es excel als input fuer eigene regression umgebungen bzw. auswertungen. 
aber zumeist handelt es sich bei den excel loesungen um (lange) listen 
mit directed tests.

mfg
/uwe

von berndl (Gast)


Lesenswert?

>Das handhabe ich genau so. Da gibt es einfache Restriktionen  über
>Filenamen, Erweiterungen und Verzeichnisstrukturen. Damit lässt sich das
>meiste schon lösen.
>
>Kannst Du mal dein Script mit einstellen. An dem hätte ich auch
>Interesse.
>
>Matthias

gerne, habe aber gerade gemerkt, dass ich in dem rekursiven Aufbau der 
Dependency-List (quasi makefile) noch einen Bug habe. Wenn's dann mal 
richtig tut poste ich's hier...

Gruss,
- berndl

von Gast (Gast)


Lesenswert?

>Also ich brauche kein Excel oder Calc...

Wie erzeugts Du in der VHDL Testbench die zu erwartenden Werte bei 
algorithmischen FPGAs? VHDL kann weder Sinus, noch sonstwas, um irgendwo 
einen sweep einzuspeisen. Viele Daten kriege ich auch aus MATLAB raus. 
Da ist es das einfachste, die Daten und deren Erwartungswerte ins Excel 
zu klopfen und sich ein VHDL-file machen zu lassen.

von berndl (Gast)


Lesenswert?

spricht ja nix dagegen, bei besonders stoerrischer Logik mit 
vorgegebenen Werten in einer TB zu arbeiten. Zumindest mit ein paar 
Eckwerten mache ich das auch immer, die TB kann ja schliesslich auch 
fehlerhaft sein.

Aber die allermeisten Sachen kann man auch mit Random-pattern in einer 
TB beschreiben und die Ergebnisse vorhersagen. Wenn ich auf die 
Signal-waves schaue erwarte ich ja auch was ganz bestimmtes um die 
Simulation bewerten zu koennen.

von Duke Scarring (Gast)


Lesenswert?

> VHDL kann weder Sinus, noch sonstwas, um irgendwo
> einen sweep einzuspeisen
Aha.

Und was ist das?!?
http://www.csee.umbc.edu/help/VHDL/math_real.vhdl

Duke

von berndl (Gast)


Angehängte Dateien:

Lesenswert?

ok, hier wie versprochen mein PERL script zum checken des 
Simulationsstatus (Beispiellogfile wie eine Testbench eine 'success' 
message schreiben muss):

--------------------------------------
INFO: Testbench successfully completed

--------------------------------------

Hier nur die Sparversion, im G'schaeft ist die Ausgabe halt .html oder 
.xml. Man kann auch .csv erzeugen und in excel importieren. Der Sinn der 
Ausgabe sollte beim druebergehen klar werden.

Vielleicht kann's ja jemand gebrauchen, bitte den Disclaimer aber auch 
beibehalten wenn ihr das verwendet und weiter entwickelt (und vor allem 
Weiterentwicklungen dann auch hier posten, dann haben alle was davon).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.