SystemVerilog - SystemVerilog

SystemVerilog
SystemVerilog-Logo.png
SystemVerilog-Logo
Paradigma Strukturiert (Design)
Objektorientiert (Verifikation)
Entworfen von Synopsys , später IEEE
Erstmals erschienen 2002 ; Vor 19 Jahren ( 2002 )
Stabile Version
IEEE 1800-2017 / 22. Februar 2018 ; Vor 3 Jahren ( 2018-02-22 )
Schreibdisziplin Statisch , schwach
Dateinamenerweiterungen .sv, .svh
Beeinflusst von
Design: Verilog , VHDL , C++ , Verifizierung: OpenVera , Java

SystemVerilog , standardisiert als IEEE 1800 , ist eine Hardwarebeschreibungs- und Hardwareverifikationssprache, die zum Modellieren, Entwerfen , Simulieren , Testen und Implementieren elektronischer Systeme verwendet wird. SystemVerilog basiert auf Verilog und einigen Erweiterungen und ist seit 2008 Teil des gleichen IEEE-Standards . Es wird häufig in der Halbleiter- und Elektronikdesignindustrie als Weiterentwicklung von Verilog verwendet.

Geschichte

SystemVerilog begann mit der Spende der Superlog-Sprache an Accellera im Jahr 2002 durch das Startup-Unternehmen Co-Design Automation. Der Großteil der Verifizierungsfunktionalität basiert auf der von Synopsys gespendeten OpenVera- Sprache . 2005 wurde SystemVerilog als IEEE- Standard 1800-2005 angenommen. Im Jahr 2009 wurde der Standard mit dem Basisstandard Verilog (IEEE 1364-2005) zusammengeführt, wodurch der IEEE Standard 1800-2009 entstand. Die aktuelle Version ist der IEEE-Standard 1800-2017.

Der Funktionsumfang von SystemVerilog kann in zwei verschiedene Rollen unterteilt werden:

  1. SystemVerilog für Register-Transfer-Level (RTL)-Design ist eine Erweiterung von Verilog-2005 ; alle Funktionen dieser Sprache sind in SystemVerilog verfügbar. Daher ist Verilog eine Teilmenge von SystemVerilog.
  2. SystemVerilog für die Verifikation verwendet umfangreiche objektorientierte Programmiertechniken und ist enger mit Java verwandt als Verilog. Diese Konstrukte sind im Allgemeinen nicht synthetisierbar.

Im Rest dieses Artikels werden die Funktionen von SystemVerilog beschrieben, die in Verilog-2005 nicht vorhanden sind .

Design-Merkmale

Datenlebensdauer

In SystemVerilog gibt es zwei Arten von Datenlebensdauern: static und automatic . Automatische Variablen werden erstellt, sobald die Programmausführung den Gültigkeitsbereich der Variablen erreicht. Statische Variablen werden zu Beginn der Programmausführung erstellt und behalten während der gesamten Lebensdauer des Programms den gleichen Wert, es sei denn, während der Ausführung wird ein neuer Wert zugewiesen.

Jede Variable, die innerhalb einer Aufgabe oder Funktion ohne Angabe des Typs deklariert wird, wird als automatisch betrachtet. Um anzugeben, dass eine Variable statisch ist, platzieren Sie das Schlüsselwort " static" in der Deklaration vor dem Typ, zB " ". Das Schlüsselwort " " wird auf die gleiche Weise verwendet. static int x;automatic

Neue Datentypen

Verbesserte Variablentypen fügen dem "reg"-Typ von Verilog neue Funktionen hinzu:

logic [31:0] my_var;

Verilog-1995 und -2001 beschränken Reg-Variablen auf Verhaltensanweisungen wie RTL-Code . SystemVerilog erweitert den Reg-Typ, sodass er von einem einzigen Treiber wie Gate oder Modul angesteuert werden kann. SystemVerilog nennt diesen Typ "Logik", um Benutzer daran zu erinnern, dass er über diese zusätzliche Fähigkeit verfügt und kein Hardware-Register ist. Die Namen "logic" und "reg" sind austauschbar. Ein Signal mit mehr als einem Treiber (wie ein Tri-State-Puffer für allgemeine Eingabe/Ausgabe ) muss als Netztyp wie "wire" deklariert werden, damit SystemVerilog den Endwert auflösen kann.

Mehrdimensionale gepackte Arrays vereinheitlichen und erweitern Verilogs Begriff von "Registern" und "Speichern":

logic [1:0][2:0] my_pack[32];

Das klassische Verilog erlaubte nur die Deklaration einer Dimension links vom Variablennamen. SystemVerilog erlaubt eine beliebige Anzahl solcher "gepackter" Dimensionen. Eine Variable vom Typ gepacktes Array bildet 1:1 auf eine ganzzahlige arithmetische Größe ab. Im obigen Beispiel kann jedes Element von my_packin Ausdrücken als Sechs-Bit-Ganzzahl verwendet werden. Die Maße rechts neben dem Namen (hier 32) werden als "ungepackte" Maße bezeichnet. Wie bei Verilog-2001 ist eine beliebige Anzahl von unverpackten Abmessungen zulässig.

Aufzählungsdatentypen (enums) ermöglichen die Vergabe von sinnvollen Namen für numerische Größen. Variablen deklariert von Aufzählungstyp sein kannnicht ohne auf Variablen eines anderen Aufzählungstyp zugeordnet werden zu Gießen . Dies gilt nicht für Parameter, die in Verilog-2005 die bevorzugte Implementierungstechnik für Aufzählungsgrößen waren:

typedef enum logic [2:0] {
   RED, GREEN, BLUE, CYAN, MAGENTA, YELLOW
} color_t;

color_t   my_color = GREEN;
initial $display("The color is %s", my_color.name());

Wie oben gezeigt, kann der Designer einen zugrunde liegenden arithmetischen Typ ( logic [2:0]in diesem Fall) angeben, der verwendet wird, um den Aufzählungswert darzustellen. Die Metawerte X und Z können hier verwendet werden, möglicherweise um illegale Zustände darzustellen. Die integrierte Funktion name()gibt einen ASCII-String für den aktuellen Aufzählungswert zurück, der bei der Validierung und beim Testen nützlich ist.

Neue Integer-Typen : SystemVerilog definiert byte, shortint, intund longintals zweistufige vorzeichenbehaftete Integraltypen mit 8, 16, 32 bzw. 64 Bit. Ein bitTyp ist ein Typ mit zwei Zuständen mit variabler Breite, der ähnlich wie logic. Zwei-Zustands-Typen fehlen die X- und Z- Metawerte des klassischen Verilog; Die Arbeit mit diesen Typen kann zu einer schnelleren Simulation führen.

Strukturen und Gewerkschaften funktionieren ähnlich wie sie in der tun Programmiersprache C . Zu den Verbesserungen von SystemVerilog gehören das gepackte Attribut und das markierte Attribut. DastaggedAttribut ermöglicht zur Laufzeit zu verfolgen, welche Mitglieder einer Union derzeit verwendet werden. DaspackedAttribut bewirkt, dass die Struktur oder Union 1:1 auf ein gepacktes Array von Bits abgebildet wird. Der Inhalt vonstructDatentypen belegt einen durchgehenden Speicherblock ohne Lücken, ähnlich wie bei Bitfeldern in C und C++:

typedef struct packed {
    bit [10:0]  expo;
    bit         sign;
    bit [51:0]  mant;
} FP;

FP     zero = 64'b0;

Wie in diesem Beispiel gezeigt, unterstützt SystemVerilog auch typedefs , wie in C und C++.

Verfahrensblöcke

SystemVerilog führt drei neue prozedurale Blöcke ein, die dazu gedacht sind, Hardware zu modellieren : always_comb(um kombinatorische Logik zu modellieren ), always_ff(für Flip-Flops ) und always_latch(für Latches ). Während Verilog einen einzigen Allzweckblock verwendet always, um verschiedene Arten von Hardwarestrukturen zu modellieren, soll jeder der neuen Blöcke von SystemVerilog einen bestimmten Hardwaretyp modellieren, indem semantische Einschränkungen auferlegt werden, um sicherzustellen, dass die von den Blöcken beschriebene Hardware der beabsichtigten Verwendung von das Model. Ein HDL-Compiler oder ein Verifizierungsprogramm kann zusätzliche Schritte unternehmen, um sicherzustellen, dass nur der beabsichtigte Verhaltenstyp auftritt.

Ein always_combBlock modelliert kombinatorische Logik . Der Simulator leitet die Sensitivitätsliste als alle Variablen aus den enthaltenen Anweisungen ab:

always_comb begin
    tmp = b * b - 4 * a * c;
    no_root = (tmp < 0);
end

Ein always_latchBlock modelliert pegelempfindliche Latches. Auch hier wird die Sensitivitätsliste aus dem Code abgeleitet:

always_latch
    if (en) q <= d;

Ein always_ffBlock modelliert synchrone Logik (insbesondere flankensensitive sequentielle Logik ):

always_ff @(posedge clk)
    count <= count + 1;

EDA-Tools ( Electronic Design Automation ) können die Absicht des Designs überprüfen, indem sie überprüfen, ob das Hardwaremodell keine Blockverwendungssemantik verletzt. Beispielsweise beschränken die neuen Blöcke die Zuweisung an eine Variable, indem sie nur eine Quelle alwayszulassen , während der Block von Verilog die Zuweisung von mehreren prozeduralen Quellen zulässt.

Schnittstellen

Bei kleinen Designs beschreibt der Verilog- Port kompakt die Konnektivität eines Moduls mit der Umgebung. Aber große Blöcke innerhalb einer großen Entwurfshierarchie weisen typischerweise Portzahlen in der Größenordnung von Tausenden auf. SystemVerilog führt ein Konzept von Schnittstellen ein, um sowohl die Redundanz von Port-Namen-Deklarationen zwischen verbundenen Modulen zu reduzieren als auch Gruppen- und abstrakt- bezogene Signale in einem vom Benutzer deklarierten Bündel zu reduzieren . Ein zusätzliches Konzept ist Modport, das die Richtung der logischen Verbindungen anzeigt.

Beispiel:

interface intf;
  logic a;
  logic b;
  modport in (input a, output b);
  modport out (input b, output a); 
endinterface

module top;
  intf i ();
  u_a m1 (.i1(i.in));
  u_b m2 (.i2(i.out));
endmodule

module u_a (intf.in i1);
endmodule

module u_b (intf.out i2);
endmodule

Verifizierungsfunktionen

Die folgenden Verifizierungsmerkmale sind normalerweise nicht synthetisierbar, dh sie können nicht in Hardware basierend auf HDL-Code implementiert werden. Stattdessen helfen sie beim Aufbau erweiterbarer, flexibler Prüfstände .

Neue Datentypen

Der stringDatentyp für eine variable Länge Textzeichenfolge . Beispielsweise:

string s1 = "Hello";
string s2 = "world";
string p = ".?!";
string s3 = {s1, ", ", s2, p[2]}; // string concatenation
$display("[%d] %s", s3.len(), s3); // simulation will print: "[13] Hello, world!"

Zusätzlich zu dem im Design verwendeten statischen Array bietet SystemVerilog dynamische Arrays , assoziative Arrays und Warteschlangen :

int cmdline_elements; // # elements for dynamic array
int da[];             // dynamic array
int ai[int];          // associative array, indexed by int
int as[string];       // associative array, indexed by string
int qa[$];            // queue, indexed as an array, or by built-in methods

initial begin
    cmdline_elements = 16;
    da = new[ cmdline_elements ]; // Allocate array with 16 elements
end

Ein dynamisches Array funktioniert ähnlich wie ein ausgepackt Array, bietet aber den Vorteil, dass sie dynamisch zugewiesen bei Laufzeit (wie oben gezeigt.) Die Größe eines gepackten Anordnung muss (aus einer Konstante oder ein Ausdruck von Konstanten), die dynamische Array zum Zeitpunkt der Kompilierung bekannt sein size kann von einer anderen Laufzeitvariablen initialisiert werden, wodurch das Array nach Bedarf beliebig skaliert und skaliert werden kann.

Ein assoziatives Array kann man sich als binären Suchbaum mit einem benutzerdefinierten Schlüsseltyp und Datentyp vorstellen . Der Schlüssel impliziert eine Ordnung ; die Elemente eines assoziativen Arrays können in lexikographischer Reihenfolge ausgelesen werden. Schließlich bietet eine Warteschlange einen Großteil der Funktionalität des C++-STL- Deque- Typs: Elemente können effizient hinzugefügt und von beiden Enden entfernt werden. Diese Primitive ermöglichen die Erstellung komplexer Datenstrukturen, die für das Scoreboarding eines großen Designs erforderlich sind .

Klassen

SystemVerilog bietet ein objektorientiertes Programmiermodell .

In SystemVerilog unterstützen Klassen ein Einfachvererbungsmodell , können aber durch die Verwendung sogenannter "Schnittstellenklassen" (konzeptidentisch mit der interfaceJava-Funktion) Funktionen ähnlich der Mehrfachvererbung implementieren . Klassen können nach Typ parametrisiert werden , wodurch die grundlegende Funktion von C++-Vorlagen bereitgestellt wird . Allerdings Template - Spezialisierung und Vorlagen - Funktion wird nicht unterstützt.

Die Polymorphismus- Eigenschaften von SystemVerilog ähneln denen von C++: Der Programmierer kann eine virtualFunktion speziell schreiben , damit eine abgeleitete Klasse die Kontrolle über die Funktion erhält. Siehe virtuelle Funktion für weitere Informationen.

Die Kapselung und das Verbergen von Daten erfolgt mit den Schlüsselwörtern localund protected, die auf jedes Element angewendet werden müssen, das ausgeblendet werden soll. Standardmäßig sind alle Klasseneigenschaften public .

Klasseninstanzen werden dynamisch mit dem newSchlüsselwort erstellt. Ein Konstruktor bezeichnet durch function newdefiniert werden. SystemVerilog verfügt über eine automatische Garbage Collection , daher gibt es keine Sprachfunktion , um vom neuen Operator erstellte Instanzen explizit zu löschen .

Beispiel:

virtual class Memory;
    virtual function bit [31:0] read(bit [31:0] addr); endfunction
    virtual function void write(bit [31:0] addr, bit [31:0] data); endfunction
endclass

class SRAM #(parameter AWIDTH=10) extends Memory;
    bit [31:0] mem [1<<AWIDTH];

    virtual function bit [31:0] read(bit [31:0] addr);
        return mem[addr];
    endfunction

    virtual function void write(bit [31:0] addr, bit [31:0] data);
        mem[addr] = data;
    endfunction
endclass

Eingeschränkte Zufallsgenerierung

Ganzzahlige Größen, die entweder in einer Klassendefinition oder als eigenständige Variablen in einem lexikalischen Geltungsbereich definiert sind, können auf der Grundlage einer Reihe von Einschränkungen zufällige Werte zugewiesen werden . Diese Funktion ist nützlich, um zufällige Szenarien für die Überprüfung zu erstellen .

Innerhalb von Klassendefinitionen signalisieren die Modifikatoren randund randcVariablen, die einer Randomisierung unterzogen werden sollen. randcgibt permutationsbasierte Randomisierung an, bei der eine Variable alle möglichen Werte einmal annimmt, bevor ein Wert wiederholt wird. Variablen ohne Modifikatoren werden nicht randomisiert.

class eth_frame;
    rand bit [47:0] dest;
    rand bit [47:0] src;
    rand bit [15:0] f_type;
    rand byte       payload[];
    bit [31:0]      fcs;
    rand bit [31:0] fcs_corrupt;

    constraint basic {
        payload.size inside {[46:1500]};
    }

    constraint good_fr {
        fcs_corrupt == 0;
    }
endclass

In diesem Beispiel ist das fcsFeld nicht randomisiert; in der Praxis wird es mit einem CRC-Generator berechnet und das fcs_corruptFeld verwendet, um es zu verfälschen, um FCS-Fehler einzufügen. Die beiden gezeigten Einschränkungen gelten für konforme Ethernet-Frames . Einschränkungen können selektiv aktiviert werden; diese Funktion wäre im obigen Beispiel erforderlich, um beschädigte Frames zu generieren. Einschränkungen können beliebig komplex sein und Wechselbeziehungen zwischen Variablen, Implikationen und Iterationen beinhalten. Der Constraint-Solver von SystemVerilog wird benötigt, um eine Lösung zu finden, falls eine existiert, gibt jedoch keine Garantie hinsichtlich der dafür benötigten Zeit, da dies im Allgemeinen ein NP-schweres Problem ist ( boolesche Erfüllbarkeit ).

Randomisierungsmethoden

In jeder SystemVerilog-Klasse gibt es 3 vordefinierte Methoden für die Randomisierung: pre_randomize, randomize und post_randomize. Die Methode randomize wird vom Benutzer zur Randomisierung der Klassenvariablen aufgerufen. Die Methode pre_randomize wird von der Methode randomize vor der Randomisierung aufgerufen und die Methode post_randomize wird von der Methode randomize nach der Randomisierung aufgerufen.

class eth_frame;
    rand bit [47:0] dest;
    rand bit [47:0] src;
    rand bit [15:0] f_type;
    rand byte       payload[];
    bit [31:0]      fcs;
    rand bit        corrupted_frame;

    constraint basic {
        payload.size inside {[46:1500]};
    }
    
    function void post_randomize()
      this.calculate_fcs(); // update the fcs field according to the randomized frame
      if (corrupted_frame)  // if this frame should be corrupted 
        this.corrupt_fcs(); // corrupt the fcs
    endfunction
endclass

Beschränkungen kontrollieren

Die Methoden Constraint_mode() und random_mode() werden verwendet, um die Randomisierung zu steuern. Constraint_mode() wird verwendet, um eine bestimmte Einschränkung ein- und auszuschalten, und random_mode wird verwendet, um eine Randomisierung einer bestimmten Variablen ein- oder auszuschalten. Der folgende Code beschreibt und testet einen Ethernet-Frame :

class eth_frame;
    rand bit [47:0] dest;
    rand bit [47:0] src;
    rand bit [15:0] f_type;
    rand byte       payload[];
    bit [31:0]      fcs;
    rand bit        corrupted_frame;

    constraint basic {
        payload.size inside {[46:1500]};
    }
   
    constraint one_src_cst {
        src == 48'h1f00
    }

    constraint dist_to_fcs {
        fcs dist {0:/30,[1:2500]:/50};  // 30, and 50 are the weights (30/80 or  50/80, in this example) 
    }

endclass
.
.
.
eth_frame my_frame;

my_frame.one_src_cst.constraint_mode(0); // the constraint one_src_cst will not be taken into account
my_frame.f_type.random_mode(0);        // the f_type variable will not be randomized for this frame instance.
my_frame.randomize();

Behauptungen

Assertionen sind nützlich, um Eigenschaften eines Designs zu überprüfen, die sich manifestieren, nachdem eine bestimmte Bedingung oder ein bestimmter Zustand erreicht wurde. SystemVerilog verfügt über eine eigene Assertion-Spezifikationssprache, ähnlich der Property Specification Language . Die Teilmenge der SystemVerilog-Sprachkonstrukte, die der Assertion dienen, wird allgemein als SystemVerilog-Assertion oder SVA bezeichnet.

SystemVerilog-Assertionen werden aus Sequenzen und Eigenschaften erstellt . Eigenschaften sind eine Obermenge von Folgen; Jede Sequenz kann wie eine Eigenschaft verwendet werden, obwohl dies normalerweise nicht nützlich ist.

Sequenzen bestehen aus booleschen Ausdrücken, die mit temporalen Operatoren ergänzt werden . Der einfachste temporale Operator ist der ##Operator, der eine Verkettung durchführt:

sequence S1;
    @(posedge clk) req ##1 gnt;
endsequence

Diese Sequenz stimmt überein, wenn das gntSignal einen Taktzyklus reqhoch geht, nachdem es hoch wird. Beachten Sie, dass alle Sequenzoperationen synchron zu einem Takt sind.

Andere sequentielle Operatoren umfassen Wiederholungsoperatoren sowie verschiedene Konjunktionen. Diese Operatoren ermöglichen es dem Konstrukteur, komplexe Beziehungen zwischen Konstruktionskomponenten auszudrücken.

Eine Assertion funktioniert, indem sie ständig versucht, eine Sequenz oder Eigenschaft auszuwerten. Eine Assertion schlägt fehl, wenn die Eigenschaft fehlschlägt. Die obige Sequenz schlägt fehl, wenn reqniedrig ist. Um die Anforderung, gntdie reqeiner Eigenschaft folgt, genau auszudrücken, ist Folgendes erforderlich:

property req_gnt;
    @(posedge clk) req |=> gnt;
endproperty

assert_req_gnt: assert property (req_gnt) else $error("req not followed by gnt.");

Dieses Beispiel zeigt eine Implikation Operator |=>. Der Satz links von der Implikation heißt Antezedens und der Satz rechts von der Implikation heißt Konsequenz . Die Bewertung einer Implikation beginnt mit wiederholten Versuchen, die Vorgeschichte zu bewerten. Wenn das Antezedens erfolgreich ist , wird das Konsequente versucht, und der Erfolg der Behauptung hängt vom Erfolg des Konsequenten ab. In diesem Beispiel wird die Konsequenz nicht versucht, bis sie reqhoch wird. Danach schlägt die Eigenschaft fehl, wenn sie gntim folgenden Takt nicht hoch ist.

Zusätzlich zu Behauptungen unterstützt SystemVerilog Annahmen und die Abdeckung von Eigenschaften. Eine Annahme legt eine Bedingung fest, von der ein formales Logikprüfwerkzeug als wahr annehmen muss . Eine Assertion gibt eine Eigenschaft an, die als wahr bewiesen werden muss. In der Simulation werden sowohl Behauptungen als auch Annahmen gegen Teststimuli verifiziert. Die Eigenschaftsabdeckung ermöglicht es dem Verifikationsingenieur zu überprüfen, ob Assertionen das Design genau überwachen.

Abdeckung

Die Abdeckung in Bezug auf Hardware-Verifizierungssprachen bezieht sich auf die Sammlung von Statistiken basierend auf Stichprobenereignissen innerhalb der Simulation. Die Abdeckung wird verwendet, um zu bestimmen, wann das zutestende Gerät (DUT) einer ausreichenden Vielzahl von Stimuli ausgesetzt wurde, so dass ein hohes Vertrauen besteht, dass das DUT korrekt funktioniert. Beachten Sie, dass sich dies von der Codeabdeckung unterscheidet , die den Designcode instrumentiert, um sicherzustellen, dass alle Codezeilen im Design ausgeführt wurden. Funktionale Abdeckung sichergestelltdass alle gewünschte Ecke und Kante Fälle in dem Entwurfsraum wurden erforscht .

Eine SystemVerilog-Coverage-Gruppe erstellt eine Datenbank mit "Bins", die ein Histogramm der Werte einer zugeordneten Variablen speichern . Es kann auch eine Cross-Coverage definiert werden, die ein Histogramm erstellt, das das kartesische Produkt mehrerer Variablen darstellt.

Ein Stichprobenereignis steuert, wann eine Stichprobe genommen wird. Das Stichprobenereignis kann ein Verilog-Ereignis, der Eintritt oder Austritt eines Codeblocks oder ein Aufruf der sampleMethode der Abdeckungsgruppe sein. Es ist darauf zu achten, dass Daten nur dann erfasst werden, wenn sie sinnvoll sind.

Beispielsweise:

class eth_frame;
   // Definitions as above
   covergroup cov;
      coverpoint dest {
          bins bcast[1] = {48'hFFFFFFFFFFFF};
          bins ucast[1] = default;
      }
      coverpoint f_type {
          bins length[16] = { [0:1535] };
          bins typed[16] = { [1536:32767] };
          bins other[1] = default;
      }
      psize: coverpoint payload.size {
          bins size[] = { 46, [47:63], 64, [65:511], [512:1023], [1024:1499], 1500 };
      }

      sz_x_t: cross f_type, psize;
   endgroup
endclass

In diesem Beispiel ist der Verifikationsingenieur an der Verteilung von Broadcast- und Unicast-Frames, dem Feld size/f_type und der Nutzlastgröße interessiert. Die Bereiche im Coverpoint der Nutzlastgröße spiegeln die interessanten Eckfälle wider, einschließlich der minimalen und maximalen Rahmengrößen.

Synchronisation

Eine komplexe Testumgebung besteht aus wiederverwendbaren Verifikationskomponenten, die miteinander kommunizieren müssen. Das ' Ereignis' -Primitive von Verilog ermöglichte es verschiedenen Blöcken prozeduraler Anweisungen, sich gegenseitig auszulösen, aber die Durchsetzung der Thread- Synchronisation war dem (klugen) Einsatz des Programmierers überlassen. SystemVerilog bietet zwei Grundelemente speziell für interthread Synchronisation: Mailbox und Semaphore . Die Mailbox ist als FIFO- Nachrichtenwarteschlange modelliert . Optional kann der FIFO typparametrisiert werden , so dass nur Objekte des angegebenen Typs durch ihn geleitet werden dürfen. Typischerweise sind Objekte Klasseninstanzen, die Transaktionen darstellen : elementare Operationen (zum Beispiel das Senden eines Frames), die von den Verifikationskomponenten ausgeführt werden. Die Semaphore wird als modellierten Zählen Semaphor .

Allgemeine Verbesserungen zum klassischen Verilog

Zusätzlich zu den oben genannten neuen Funktionen verbessert SystemVerilog die Benutzerfreundlichkeit der bestehenden Sprachfunktionen von Verilog. Im Folgenden sind einige dieser Verbesserungen aufgeführt:

Darüber hinaus ermöglicht SystemVerilog eine bequeme Schnittstelle zu Fremdsprachen (wie C/C++) durch SystemVerilog DPI (Direct Programming Interface).

Verifikations- und Synthesesoftware

In der Design-Verifizierungsrolle wird SystemVerilog in der Chip-Design-Branche häufig verwendet. Die drei größten EDA-Anbieter ( Cadence Design Systems , Mentor Graphics , Synopsys ) haben SystemVerilog in ihre gemischtsprachigen HDL-Simulatoren integriert . Obwohl noch kein Simulator die Unterstützung für das gesamte SystemVerilog LRM beanspruchen kann , was die Interoperabilität von Testbenchs zu einer Herausforderung macht, sind Bemühungen zur Förderung der herstellerübergreifenden Kompatibilität im Gange. Im Jahr 2008 veröffentlichten Cadence und Mentor die Open Verification Methodology, eine Open-Source-Klassenbibliothek und ein Nutzungs-Framework, um die Entwicklung wiederverwendbarer Testbenches und vorgefertigter Verifikations-IP zu erleichtern. Synopsys, das als erstes Unternehmen eine SystemVerilog-Klassenbibliothek (VMM) veröffentlicht hatte, reagierte daraufhin mit der Öffnung seines proprietären VMM für die breite Öffentlichkeit. Viele Drittanbieter haben die SystemVerilog-Verifizierungs-IP angekündigt oder bereits veröffentlicht.

In der Entwurfssynthese Rolle (Transformation einer Hardware-Design - Beschreibung in einen Tor- netlist ) hat SystemVerilog Annahme langsam. Viele Designteams verwenden Designflows, die mehrere Tools von verschiedenen Anbietern umfassen. Die meisten Designteams können nicht auf SystemVerilog RTL-Design migrieren, bis ihre gesamte Front-End-Toolsuite ( Linters , formale Verifizierung und automatisierte Teststrukturgeneratoren ) eine gemeinsame Sprachuntermenge unterstützt.

Siehe auch

Verweise

  • 1800-2005 – IEEE-Standard für System Verilog – Einheitliches Hardwaredesign, Spezifikation und Verifizierungssprache . 2005. doi : 10.1109/IEEESTD.2005.97972 . ISBN 978-0-7381-4810-6.
  • 1800-2009 – IEEE-Standard für SystemVerilog – Einheitliches Hardwaredesign, Spezifikation und Verifizierungssprache . 2009. doi : 10.1109/IEEESTD.2009.5354441 . ISBN 978-0-7381-6130-3.
  • 1800-2012 – IEEE-Standard für SystemVerilog – Einheitliches Hardwaredesign, Spezifikation und Verifizierungssprache . 2013. doi : 10.1109/IEEESTD.2013.6469140 . ISBN 978-0-7381-8110-3.
  • 1800-2017 – IEEE-Standard für SystemVerilog – Einheitliches Hardwaredesign, Spezifikation und Verifizierungssprache . 2017. doi : 10.1109/IEEESTD.2018.8299595 . ISBN 978-1-5044-4509-2.
  • McGrath, Dylan (2005-11-09). "IEEE genehmigt SystemVerilog, Überarbeitung von Verilog" . EE-Zeiten . Abgerufen 2007-01-31 .
  • Puneet Kumar (2005-11-09). "System-Verilog-Tutorial" .
  • Gopi Krishna (2005-11-09). "SystemVerilog, SVA, SV DPI-Tutorials" .
  • HDVL. "Weitere SystemVerilog-Weblinks" .
  • Spear, Chris, "SystemVerilog for Verification" Springer, New York City, NY. ISBN  0-387-76529-8
  • Stuart Sutherland, Simon Davidmann, Peter Flake, "SystemVerilog for Design Second Edition: A Guide to Using SystemVerilog for Hardware Design and Modeling" Springer, New York City, NY. ISBN  0-387-33399-1
  • Ben Cohen, Srinivasan Venkataramanan, Ajeetha Kumari und Lisa Piper [1] SystemVerilog Assertions Handbook, 4. Auflage, 2016- http://SystemVerilog.us
  • Ben Cohen Srinivasan Venkataramanan und Ajeetha Kumari [2] Ein pragmatischer Ansatz zur Einführung von VMM, - http://SystemVerilog.us
  • Erik Seligman und Tom Schubert [3] Formale Verifizierung: An Essential Toolkit for Modern VLSI Design, 24.07.2015,

Externe Links

IEEE-Standardreferenz

Die neuesten SystemVerilog-Standarddokumente sind kostenlos von IEEEexplore erhältlich .

Tutorials
Entwicklung von Standards
Spracherweiterungen
  • Verilog AUTOs – Ein Open-Source-Meta-Kommentarsystem zur Vereinfachung der Pflege des Verilog-Codes
Online-Tools
  • EDA Playground – Führen Sie SystemVerilog über einen Webbrowser aus (kostenlose Online-IDE)
  • SVeN – Ein SystemVerilog BNF Navigator (aktuell nach IEEE 1800-2012)
Andere Werkzeuge
  • SVInitKomponententest -Framework für Entwickler, die Code in SystemVerilog schreiben. Überprüfen Sie SystemVerilog-Module, -Klassen und -Schnittstellen isoliert.
  • sv2v - Open-Source-Konverter von SystemVerilog zu Verilog