Von Armin Bart und Donna Mitchell, erschienen in
Design & Elektronik, May 2002
Grafische Code-Generierung löst Verifikationsprobleme
Steigende Komplexität funktioneller Verifikation wird so manchen dazu zwingen, seine Methoden zur
Testbench-Entwicklung zu überdenken. Die zur Verfügung stehenden Möglichkeiten zu bewerten
ist schwierig. Halten Sie sich an Modellierungssprachen wie VHDL, Verilog oder SystemC? Oder wechseln
Sie zu einer der neuen Verifikationssprachen wie OpenVera oder .e.? Wie auch immer Sie sich entscheiden,
Sie werden in jedem Fall mit der Aufgabe konfrontiert sein, komplexe Testbenches zu entwickeln und diesen
Code über die Dauer von mehreren Projekten und möglicherweise mehreren Verifikations-Ingenieuren
zu pflegen. Grafische Code-Generierung bietet eine sprachunabhängige Lösung zur Testbench-Entwicklung,
die es erlaubt, Testbenches schnell und in einer klaren und präzisen Art und Weise zu beschreiben.
Grafische Testbench-Generierung ist die automatische Erzeugung von Testbench-Quellcode aus der Schnittstellenbeschreibung
und den Bus-Transaktionen eines Designs. Anstatt die Testbench von Hand zu codieren, wird das zu testende
HDL-Modell an einen Testbench-Generator geleitet, der automatisch die Schnittstellensignale des Designs
in einen Timingdiagrammeditor extrahiert. In dieser Umgebung werden dann Timingdiagramme erzeugt, die
die Bustransaktionen der Testbench beschreiben. Durch die Automatisierung der zeitaufreibenden Code-Entwicklung
kann sich der Ingenieur auf die wesentlichen Aspekte wie Design und Funktion konzentrieren.
Erweiterte Modellierung
TestBencher von SynaptiCAD ist ein einfacher und intuitiv zu bedienender grafischer Testbench-Generator.
Die grafische Oberfläche ist geeignet um komplexe Bus-Transaktionen und Schnittstellenbeschreibungen
zu modellieren. Sogar Pipelining, Split-Phase-Transaktionen, Datenstrukturen und Speicher, sowie Sequenzerkennung
können implementiert werden. Aus den Timingdiagrammen erzeugt TestBencher Bus-Transactor-Quellcode
in der vom Anwender bevorzugten Verifikationssprache. Durch die Verwendung von Timingdiagrammen arbeitet
der Ingenieur in einer hohen Abstraktionsebene, frei von den Codierungsproblemen, die rein aus der Wahl
einer bestimmten Verifikationssprache entstehen.
Im Folgenden werden wir einige der allgemeinen Probleme untersuchen, die bei der funktionellen Verifikation
entstehen, und diskutieren, wie diese durch die grafische Generierung des Testbenchcodes vermindert
werden können.
Race-Conditions
Testbenches sind laufend mit Nebenläufigkeits- und Synchronisationsproblemen konfrontiert, die
zu Race-Conditions und unbestimmtem Laufzeitverhalten führen. Während diese Probleme in der
Theorie einfach zu lösen sind, sind sie in der Realität bei Codierung von Hand äußerst
schwierig zu bewältigen. Ein Grund dafür ist, daß Race-Conditions durch subtile Design-Entscheidungen
verursacht werden, und im Gegensatz zu syntaktischen Fehlern nicht automatisch gefunden werden können.
Diese Probleme treten erst zur Laufzeit ans Licht. Und oft können sie nicht einmal zur Laufzeit
erkannt werden, weil der verwendete Simulator zufällig den .richtigen. Ausführungspfad wählt.
Ein anderer Simulator, der theoretisch parallele Operationen in einer anderen Reihenfolge ausführt,
kann ein völlig anderes Ergebnis liefern.
Dies wirft ein besonderes Problem für IP-Händler auf, die Testbenches an Kunden weitergeben,
die Simulatoren von verschiedenen EDA-Anbietern verwenden. Sogar auf dem selben Simulator kann diese
Art von Race-Conditions Probleme verursachen, da es durchaus möglich ist, daß in einer zukünftigen
Version eines Simulators zur Verbesserung der Simulationsperformanz die Ausführungsreihenfolge
von Operationen geändert wird. Die Pflege des Codes kann dadurch ernsthafte Sorgen bereiten.
Ein grafischer Code-Generator behandelt Gegebenheiten, die Race-Conditions verursachen können,
automatisch. Z.B. treten Race-Conditions oft in getakteten funktionellen Testbenches auf, in denen Signale
häufig zur selben Taktflanke, aber zu einem Simulationszeitpunkt nacheinander gesetzt und abgetastet
werden. Grafik 1 zeigt ein vereinfachtes Beispiel für eine Möglichkeit der Entstehung dieser
Race-Conditions. Bei der Codierung von Hand muß sichergestellt werden, daß der Code in einer
Weise geschrieben wird, so daß das Abtasten während jedes Taktzyklusses als erstes ausgeführt
wird. In Hardwarebeschreibungssprachen, wo Signale ihren Zustand innerhalb eines Taktzyklusses oft mehrere
Male wechseln, ist dies keine leichte Aufgabe. In einem Timingdiagramm dagegen sind die Race-Conditions
verursachenden Zustandsübergänge offensichtlich, wodurch diese Art von Race-Conditions leicht
vermieden werden kann.
Grafik 1: Einfache Race-Condition
Kontrollierte Zufallsdaten
Bei der Implementierung einer handcodierten Testbench können sich leicht falsche Portgrößen
oder andere kleine Fehler einschleichen. Automatische Code-Generierung erleichtert es, Informationen
ein einziges Mal zu definieren und dann in der ganzen Testbench zu verwenden. Dies trifft besonders
für die Erzeugung und Pflege komplexer Datenstrukturen zu, die zur Speicherung von Zustandsinformationen
für verschiedene Transaktionen verwendet werden. Kleine änderungen an einer dieser Datenstrukturen
ziehen häufig Code-Anpassungen an vielen verschiedenen Stellen der Testbench nach sich. Nutzt man
jedoch ein grafisches Interface, so wird jede änderung einer einmal definierten Datenstruktur an
alle entsprechenden Stellen der Testbench propagiert.
Moderne Verifikationssprachen unterstützen außerdem erweiterte Datenstruktur-Features, wie
z.B. die kontrollierte Generierung von Zufalls-Test-Stimuli während einer Simulation. Die Verwendung
eines grafischen Interfaces macht es sehr einfach, mit verschiedenen Parametern und Optionen der Zufallsdaten-Generierung
zu experimentieren, da änderungen an Datenstrukturen nur an einer Stelle durchgeführt werden
müssen. Das Beispiel in Grafik 2 zeigt die Definition einer Datenstruktur, die kontrollierte Zufallsdaten
für eine Transaktion bereitstellt. Für die einzelnen Felder einer Struktur stehen die Typen
Element, Array, Assoc Array und Queue zur Verfügung. Für jedes Feld können, abhängig
von der Testbench-Sprache und dem verwendeten Datentyp, verschiedene Eigenschaften definiert werden.
Grafik 2: Komplexe Datenstruktur, die kontrollierte Zufallsdaten verwendet
Darüber hinaus bietet TestBencher die Möglichkeit, in einfacher Weise komplexe Datenstrukturen
zu definieren, die es erlauben, Daten im Hauptspeicher zwischenzuspeichern oder in eine Datei im Tabellenformat
zu schreiben bzw. daraus zu lesen. Auf diese Weise können Daten von einer Transaktion abgelegt
und danach von einer anderen verwendet werden.
Pipelined Transaktionen
Eine weitere Herausforderung bei der Design-Verifikation ist die Implementierung von pipelined Bus-Transaktionen.
Häufig ist es nötig, eine Art von pipelined Bus-Master zu modellieren, der seine Transaktionsdaten
aus einer Queue (FIFO) von Datenpaketen erhält. Bei leerer Queue veranlasst ein von der Queue getriebenes
Signal die Ausführung solange anzuhalten, bis neue Daten in die Queue fließen. Andernfalls
entnimmt der Bus-Transaktor das nächste Datum aus der Queue und die Ausführung der Transaktion
wird unverzüglich fortgesetzt.
Grafik 3 zeigt, wie mit einem einzigen Timingdiagramm Read- und Write-Transaktionen eines AMBA AHB (Advanced
High-Performance Bus) Master-Device modelliert werden können. Der AHB-Bus ist der Haupt-Systembus
der ARM Mikroprozessorfamilie, die Pipelined-Burst-Reads und Writes unterstützt. Im Beispiel erhalten
die Signale HADDR, HWDATA und HWRITE ihre Daten aus einer Queue, die von einem Standalone-Prozess im
Top-Level der Testbench befüllt wird. Ein Sampling-Prozess namens CheckForRead_THEN verwendet eine
weitere Queue, um während einer Read-Operation Daten abzulegen. Der erste Taktzyklus im Diagramm
setzt die Signale HADDR und HWRITE. Handelt es sich um eine Write-Operation, so werden die zu dieser
Adresse gehörenden Daten während des nächsten Taktzyklusses angelegt. Im Falle einer
Read-Operation werden die gesampelten Daten in eine Queue geschoben, die vom Top-Level der Testbench
überwacht werden, oder in eine Datei ausgegeben werden kann. Zwei Marker implementieren eine Schleife,
so daß fortwährend Adressen angelegt und Daten gelesen/geschrieben werden, bis die Adress-Queue
leer ist. Dabei wird jeweils zeitgleich mit den Daten des aktuellen Read-/Write-Zyklusses bereits die
Adresse für die nächste Read-/Write-Operation übertragen.
Grafik 3: AMBA AHB Pipelined Bus-Master, gespeist von einer Queue
Sequenz-Erkennung
Eine Sequenz von Ereignissen zu erkennen und als Reaktion darauf, abhängig von der Art der erkannten
Sequenz, entsprechenden Code auszuführen, setzt eine als Zustandsautomat implementierte Testbench-Transaktion
voraus. Es ist viel einfacher, eine grafisch beschriebene Sequenz von Ereignissen zu verstehen, als
den die erwartete Sequenz implementierenden HDL-Code zu interpretieren.
In Grafik 4 wird am Beispiel eines PCI-Slave-Devices gezeigt, wie mit Hilfe von grafischer Sequenzerkennung
mehrere verschiedene Transaktionen durch ein einziges Timingdiagramm implementiert werden. Ein solches
Device könnte z.B. durch jeweils ein Diagramm für jeden möglichen Transaktionstyp modelliert
werden. Dabei würde jedes Diagramm einen Verhaltensmodus des Designs, wie Read-, Write- oder Disconnect-Transaktionen
repräsentieren. Bei Verwendung von Sequenzerkennung werden die erwarteten Ereignisse für jedes
Signal in das Timingdiagramm eingetragen, wobei die getriebenen Ereignisse nicht erscheinen, solange
die Sequenzerkennung nicht die erwarteten Ereignisse erkannt hat. Stellt die Sequenzerkennung unerwartete
Ereignisse auf den sensitiven Signalen fest, so wird die Transaktion abgebrochen und neu gestartet,
d.h. der Zustandsautomat wird auf seinen Startzustand zurückgesetzt. Während der Simulation
arbeiten die verschiedenen Transaktionstypen nebenläufig, und stellen so das Slave-Device dar.
Grafik 4: PCI Slave-Transaktion, implementiert mit Sequenz-Erkennung
Testbench-Pflege
In einer Testbench läuft eine hohe Zahl von über die ganze Testbench verteilten Vorgängen
parallel ab. Testbench-Quellcode ist deshalb trotz Verwendung modularer Programmiertechniken häufig
schwer zu verstehen. Timingdiagramme ermöglichen eine weitaus klarere, knappere und leichter verständliche
Beschreibung der Signalaktivitäten und Interaktionen zwischen Prozessen. Die Zusammenarbeit mehrerer
Ingenieure an einer Testbench wird durch die grafische Darstellung in Timingdiagrammen enorm erleichtert,
da kein Quellcode mehr interpretiert werden muß. Jeder mit dem Design vertraute Ingenieur ist
in der Lage, aus einem gegebenen Timingdiagramm sofort ein Verständnis für das Verhalten des
Transaktors zu gewinnen, was die Pflege der Testbench drastisch vereinfacht.
Zusammenfassung
Grafische, automatische Testbench-Generierung bietet eine gute Lösung für viele der Probleme,
mit denen man während der funktionellen Design-Verifikation konfrontiert wird. Bei dieser Lösung
werden Timingdiagramme verwendet, um Bus-Transaktionen in einer Testbench zu beschreiben. Ingenieure
sind mit Timingdiagrammen vertraut, diese werden deshalb leicht verstanden und die grafische Darstellung
ermöglicht eine schnelle Visualisierung der Testbench in einer höheren Abstraktionsebene.
Timingdiagramme sind außerdem sprachunabhängig, die selbe grafische Beschreibung kann so
zur Generierung von Testbenches in jeder der bekanntesten Sprachen wie VHDL, Verilog, SystemC, .e. oder
OpenVera verwendet werden. Die im Timingdiagramm dargestellten Transaktionen formen modulare Komponenten
einer Testbench, die einfach verändert und in anderen Designs wiederverwendet werden können.
Dies ebnet den Weg für eine schnellere Verifikation zukünftiger Designs.
Autoren
Armin Bart ist der Entwickler von SynaptiCAD.s GigaWave Viewer. Er ist außerdem verantwortlich
für die Integrierung der von ihm entwickelten Signaldaten-Kompressionstechnologie in SynaptiCAD.s
TestBencher pro. Bart ist momentan dabei, sein Informatik-Studium an der Fachhochschule Landshut abzuschließen.
Donna Mitchell ist Vize-Präsident für Strategisches Marketing bei SynaptiCAD Inc. Sie erlangte
ihren BS- und MS-Degree in Electrical Engineering an der Virginia Tech Universität. Mitchell ist
eine der zwei Gründer von SynaptiCAD Inc. Sie kann per erreicht werden.
SynaptiCAD Inc.
520 Prices Fork Rd #C4
Blacksburg, VA 24060
Telefon: 540-953-3390
Fax: 540-953-3078
|