System Verilog | |
---|---|
Kieliluokka | rakenteellinen suunnittelu); oliosuuntautunut (vahvistus) |
Esiintyi | 2002 |
Tekijä | Sähkö- ja elektroniikkainsinöörien instituutti |
Tiedostotunniste _ | .sv |
Vapauta | IEEE 1800-2009(2009-12-18) |
Tyyppijärjestelmä | staattinen, heikko |
Vaikutettu | Verilog , Vera |
SystemVerilog on laitteiston kuvaus- ja vahvistuskieli , joka on Verilog-kielen laajennus .
SystemVerilog rakennettiin Superlog-kielten päälle (Accellera, 2002). Suuri osa todentamiseen liittyvistä toiminnoista on otettu OpenVera- kielestä ( Synopsys ). [1] Vuonna 2005 SystemVerilog otettiin käyttöön IEEE 1800-2005 -standardina. [2]
Vuonna 2009 standardi 1800-2005 yhdistettiin Verilog-kielistandardiin (IEEE 1364-2005), ja SystemVerilogin nykyinen versio, IEEE 1800-2009 -standardi, otettiin käyttöön.
SystemVerilogia voidaan käyttää kuvaamaan RTL :ää Verilog-2005- kielen laajennuksena . Varmentamiseen käytetään olio-ohjelmointimallia .
SystemVerilog tukee kaikkia Verilogissa saatavilla olevia tietotyyppejä ja lisää monia uusia tietotyyppejä.
Kokonaislukutietotyypit . SystemVerilog tarjoaa uusia tietotyyppejä:
Näillä tietotyypeillä on kaksi tilaa: 0 ja 1. Toisin kuin vastaavat Verilog-tyypit (esim . reg tai integer ), ne eivät voi ottaa arvoja "X" ja "Z", mikä mahdollistaa nopeamman simulaation.
Moniulotteinen pakattu taulukko on Verilogin muistin laajennus ja yleistys :
logiikka [ 1 : 0 ][ 2 : 0 ] pakettini [ 32 ];Luettelotyypin avulla voit antaa nimiä numeerisille vakioille, esimerkiksi:
typedef enum logic [ 2 : 0 ] { PUNAINEN , VIHREÄ , SININEN , SYAANI , MAGENTA , KELTAINEN } väri_t ; color_t my_color = VIHREÄ ; ensimmäinen $näyttö ( "Väri on %s" , oma_väri . nimi ());Tässä esimerkissä logiikka[2:0] on perustyyppi.
Rakenteita ja liitoksia käytetään samalla tavalla kuin C:ssä. Verilogin lisäksi SystemVerilog lisää kaksi uutta attribuuttia: packed ja tagged . Pakattu attribuuttitarkoittaa, että kaikki rakenteen jäsenet on tallennettu tiiviisti muistiin ilman aukkoja (eli kääntäjä ei voi tehdä niiden kohdistusta ):
typedef rakenne pakattu { bit [ 10 : 0 ] expo ; bittimerkki ; _ bitti [ 51 : 0 ] mant ; } FP ; FP nolla = 64'b0 ; _Koodattu attribuutti mahdollistaa hallinnan, mitä liiton jäsentä käytetään milloin tahansa ohjelman suorittamisen aikana.
Verilog tarjoaa aina estoprosessin, joka voi kontekstista riippuen kuvata erityyppisiä laitteita. SystemVerilog lisää 3 uutta prosessilohkoa laitteistotyypin kuvaamiseksi: always_comb , always_ff ja always_latch .
Always_comb - lohkon avulla voit mallintaa yhdistelmälogiikkaa . Lohkon herkkyysluettelo sisältää kaikki lohkossa käytetyt muuttujat.
aina_kampa alkaa tmp = b * b - 4 * a * c ; ei_juuri = ( tmp < 0 ); loppuAlways_ff -lohkon avulla voit kuvata synkronista peräkkäistä logiikkaa , kuten liipaimia :
aina_ff @( posedge clk ) q <= reset ? 0 : d ;Staattisesti ohjatut yksivaiheiset varkut (salvat) kuvataan aina_latch- lohkoilla:
aina_salpa if ( salpaa ) q <= d ;Pienissä järjestelmissä moduulin ulkoiset liitännät on kuvattu tiiviisti käyttämällä Verilog-portteja. Suuren järjestelmän suuret lohkot sisältävät kuitenkin tyypillisesti useita tuhansia portteja. SystemVerilog tarjoaa käyttöliittymämekanismin porttien ryhmittelyyn ja päällekkäisyyksien välttämiseksi portteja määritettäessä. Lisäksi liitännät voivat sisältää modport- rakenteen , joka määrittää yhteyksien suunnan. Esimerkiksi:
käyttöliittymä inf ; logiikka a ; logiikka b ; modport in ( input a , input b ); modport out ( lähtö a , lähtö b ); pääteliittymä moduulin yläosa ; intfi ( ); u_a m1 ( .i1 ( i )); u_b m2 ( .i2 ( i )); loppumoduuli moduuli u_a ( intf . in i1 ); määritä x = i1 . a ; määritä y = i1 . b ; loppumoduuli moduuli u_b ( intf . out i2 ); määritä i2 . a = 1_ _ määritä i2 . b = 0 _ loppumoduuliSeuraavat konstruktit eivät ole syntetisoitavissa . Niitä käytetään testausympäristöjen toteuttamiseen, väitteisiin testattavassa koodissa ja koodin kattavuuden tarkistamiseen .
Merkkijonotyyppiä voidaan käyttää vaihtuvan pituisten merkkijonojen käsittelemiseen, esimerkiksi :
string s1 = "Hei" ; merkkijono s2 = "maailma" ; merkkijono p = ".?!" ; merkkijono s3 = { s1 , ", " , s2 , p [ 2 ]}; // merkkijonojen ketjutus $näyttö ( "[%d] %s" , s3 . len (), s3 ); // Tulostaa: "[13] Hei, maailma!"