System Verilog | |
---|---|
Nyelvóra | szerkezeti (tervezés); objektum-orientált (ellenőrzés) |
Megjelent | 2002 |
Szerző | Villamos és Elektronikai Mérnöki Intézet |
Fájlkiterjesztés _ | .sv |
Kiadás | IEEE 1800-2009 (2009-12-18) |
Típusrendszer | statikus, gyenge |
Befolyásolt | Verilog , Vera |
A SystemVerilog egy hardverleíró és ellenőrző nyelv, amely a Verilog nyelv kiterjesztése .
A SystemVerilog a Superlog nyelvekre épült (Accellera, 2002). Az ellenőrzéssel kapcsolatos funkciók nagy részét az OpenVera nyelvből ( Synopsys ) vettük át. [1] 2005-ben a SystemVerilogot IEEE 1800-2005 szabványként fogadták el. [2]
2009-ben az 1800-2005 szabványt egyesítették a Verilog nyelvi szabvánnyal (IEEE 1364-2005), és elfogadták a SystemVerilog jelenlegi verzióját, az IEEE 1800-2009 szabványt.
A SystemVerilog használható az RTL leírására , mint a Verilog-2005 nyelv kiterjesztésére . Az ellenőrzéshez objektum-orientált programozási modellt használnak .
A SystemVerilog támogatja a Verilogban elérhető összes adattípust, és számos új adattípust ad hozzá.
Egész számú adattípusok . A SystemVerilog új adattípusokat kínál:
Ezeknek az adattípusoknak két állapota van: 0 és 1. A megfelelő Verilog típusokkal ellentétben (pl . reg vagy integer ) nem vehetik fel az „X” és „Z” értékeket, ami gyorsabb szimulációt tesz lehetővé.
A többdimenziós csomagolt tömb a memória kiterjesztése és általánosítása a Verilogban:
logika [ 1 : 0 ][ 2 : 0 ] csomagom [ 32 ];A felsorolt típus lehetővé teszi, hogy numerikus konstansokat nevezzen el, például:
typedef enum logic [ 2 : 0 ] { PIROS , ZÖLD , KÉK , CIÁN , MAGENTA , SÁRGA } color_t ; color_t my_color = ZÖLD ; kezdeti $display ( "A szín %s" , my_color . name ());Ez a példa a logic[2:0] -t használja alaptípusként.
A struktúrák és az uniók ugyanúgy használatosak, mint a C-ben. A Verilog mellett a SystemVerilog két új attribútumot ad hozzá: packed és tagged . A packed attribútumazt jelenti, hogy a struktúra minden tagja kompaktan, hézagok nélkül tárolódik a memóriában (vagyis a fordító nem tudja elvégezni az igazítást ):
typedef struct packed { bit [ 10 : 0 ] expo ; bit jel ; bit [ 51 : 0 ] mant ; } FP ; FP nulla = 64 'b0 ;A címkézett attribútum lehetővé teszi annak szabályozását, hogy melyik szakszervezeti tag legyen használatban a program végrehajtása során.
A Verilog mindig blokkoló folyamatot biztosít, amely a kontextustól függően különböző típusú hardvereket írhat le. A hardvertípus pontos leírása érdekében a SystemVerilog 3 új folyamatblokkot ad hozzá: always_comb , always_ff és always_latch .
Az always_comb blokk lehetővé teszi a kombinációs logika modellezését . A blokkérzékenységi lista tartalmazza a blokkon belül használt összes változót.
always_comb begin tmp = b * b - 4 * a * c ; nincs_gyökér = ( tmp < 0 ); végeAz always_ff blokk lehetővé teszi a szinkron szekvenciális logika leírását , például triggereket :
always_ff @( posedge clk ) q <= reset ? 0 : d ;A statikusan vezérelt egyfokozatú flip-flopokat (reteszeket) az always_latch blokkok segítségével írjuk le:
always_latch if ( engedélyezés ) q <= d ;Kis rendszerek esetén a modul külső csatlakozásait a Verilog portok segítségével tömören írják le. Egy nagy rendszeren belüli nagy blokkok azonban jellemzően több ezer portot tartalmaznak. A SystemVerilog interfész-mechanizmust biztosít a portok csoportosításához, és elkerüli a párhuzamosságokat a portok meghatározásakor. Ezenkívül az interfészek tartalmazhatnak egy modport konstrukciót , amely meghatározza a kapcsolatok irányát. Például:
interfész intf ; logika a ; logika b ; modport in ( input a , input b ); modport out ( output a , output b ); végfelület modul teteje ; intfi ( ); u_a m1 ( .i1 ( i )); u_b m2 ( .i2 ( i )); végmodul modul u_a ( intf . in i1 ); x = i1 hozzárendelése . a ; y = i1 hozzárendelése . b ; végmodul modul u_b ( intf . out i2 ); i2 hozzárendelése . a = 1_ _ i2 hozzárendelése . b = 0_ _ végmodulA következő konstrukciók nem szintetizálhatók . Tesztkörnyezetek megvalósítására, a tesztelés alatt álló kódban lévő állítások megvalósítására és a kódlefedettség ellenőrzésére szolgálnak .
A karakterlánctípus változó hosszúságú karakterláncok kezelésére használható, például:
string s1 = "Hello" ; string s2 = "világ" ; string p = ".?!" ; string s3 = { s1 , ", " , s2 , p [ 2 ]}; // string összefűzés $display ( "[%d] %s" , s3 . len (), s3 ); // Kinyomtatja: "[13] Hello, world!"