Sistem Verilog | |
---|---|
Clasa de limba | Design structural); orientat pe obiecte (verificare) |
Aparut in | 2002 |
Autor | Institutul de Ingineri Electrici și Electronici |
Extensie de fișier | .sv |
Eliberare | IEEE 1800-2009 (2009-12-18) |
Tip sistem | static, slab |
A fost influențat | Verilog , Vera |
SystemVerilog este un limbaj de descriere și verificare hardware care este o extensie a limbajului Verilog .
SystemVerilog a fost construit pe deasupra limbilor Superlog (Accellera, 2002). O mare parte din funcționalitățile legate de verificare au fost preluate din limbajul OpenVera ( Synopsis ). [1] În 2005, SystemVerilog a fost adoptat ca standard IEEE 1800-2005. [2]
În 2009, standardul 1800-2005 a fost fuzionat cu standardul de limbaj Verilog (IEEE 1364-2005), iar versiunea actuală a SystemVerilog, standardul IEEE 1800-2009, a fost adoptată.
SystemVerilog poate fi folosit pentru a descrie RTL ca o extensie a limbajului Verilog-2005 . Pentru verificare, se folosește un model de programare orientat pe obiecte .
SystemVerilog acceptă toate tipurile de date disponibile în Verilog și adaugă multe tipuri de date noi.
Tipuri de date întregi . SystemVerilog oferă noi tipuri de date:
Aceste tipuri de date au două stări: 0 și 1. Spre deosebire de tipurile Verilog corespunzătoare (de exemplu , reg sau întreg ), ele nu pot lua valorile „X” și „Z”, ceea ce permite o simulare mai rapidă.
O matrice multidimensională împachetată este o extensie și o generalizare a memoriei în Verilog:
logica [ 1 : 0 ][ 2 : 0 ] my_pack [ 32 ];Un tip enumerat vă permite să dați nume constantelor numerice, de exemplu:
typedef enum logic [ 2 : 0 ] { RED , VERDE , ALBASTRU , CYAN , MAGENTA , GALBEN } color_t ; culoare_t culoarea_mea = VERDE ; initial $display ( "Culoarea este %s" , culoarea_mea . nume ());Acest exemplu folosește logic[2:0] ca tip de bază.
Structurile și uniunile sunt utilizate în același mod ca în C. Pe lângă Verilog, SystemVerilog adaugă două atribute noi: packed și tagged . Atributul packed înseamnă că toți membrii structurii sunt stocați compact în memorie, fără goluri (adică compilatorul nu își poate face alinierea ):
typedef struct packed { bit [ 10 : 0 ] expo ; semn de bit ; bit [ 51 : 0 ] mant ; } FP ; FP zero = 64 'b0 ;Atributul etichetat permite controlul asupra cărui membru al uniunii este utilizat la un moment dat în timpul execuției programului.
Verilog oferă un proces de blocare întotdeauna care, în funcție de context, poate descrie diferite tipuri de hardware. Pentru a descrie în mod explicit tipul de hardware, SystemVerilog adaugă 3 noi blocuri de proces: always_comb , always_ff și always_latch .
Blocul always_comb vă permite să modelați logica combinațională . Lista de sensibilitate bloc conține toate variabilele utilizate în bloc.
always_comb begin tmp = b * b - 4 * a * c ; no_root = ( tmp < 0 ); SfârşitBlocul always_ff vă permite să descrieți logica secvențială sincronă , cum ar fi declanșatoarele :
always_ff @( posedge clk ) q <= reset ? 0 : d ;Bistabilele cu o singură etapă controlate static (zăvoare) sunt descrise folosind blocurile always_latch :
always_latch if ( activare ) q <= d ;Pentru sistemele mici, conexiunile externe ale modulului sunt descrise în mod compact folosind porturile Verilog. Cu toate acestea, blocurile mari dintr-un sistem mare conțin de obicei câteva mii de porturi. SystemVerilog oferă un mecanism de interfață pentru a grupa porturile și pentru a evita dublarea la definirea porturilor. În plus, interfețele pot conține o construcție modport care specifică direcția conexiunilor. De exemplu:
interfață intf ; logic a ; logica b ; modport in ( input a , input b ); modport out ( ieșire a , ieșire b ); interfață finală partea de sus a modulului ; intfi ( ); u_a m1 ( .i1 ( i )); u_b m2 ( .i2 ( i )); modul final modul u_a ( intf . in i1 ); atribuiți x = i1 . a ; atribuiți y = i1 . b ; modul final modul u_b ( intf . out i2 ); atribui i2 . a = 1 _ atribui i2 . b = 0 _ modul finalUrmătoarele construcții nu sunt sintetizabile . Acestea sunt folosite pentru a implementa medii de testare, aserțiuni în codul testat și pentru a verifica acoperirea codului .
Tipul șirului poate fi utilizat pentru a gestiona șiruri de lungime variabilă, de exemplu:
șir s1 = „Bună ziua” ; șir s2 = „lume” ; șir p = ".?!" ; șir s3 = { s1 , ", " , s2 , p [ 2 ]}; // concatenare șiruri $display ( "[%d] %s" , s3 . len (), s3 ); // Se va imprima: „[13] Bună, lume!”