# SystemVerilog

SystemVerilog, estandarditzat com a IEEE 1800, és un llenguatge de descripció i verificació de maquinari utilitzat per modelar, dissenyar, simular, provar i implementar sistemes electrònics. SystemVerilog es basa en Verilog i algunes extensions, i des de 2008, Verilog ara forma part del mateix estàndard IEEE. S'utilitza habitualment a la indústria del disseny electrònic i dels semiconductors com una evolució de Verilog.

## Història

SystemVerilog va començar amb la donació del llenguatge Superlog a Accellera l'any 2002 per part de la startup Co-Design Automation. La major part de la funcionalitat de verificació es basa en el llenguatge OpenVera donat per Synopsys. El 2005, SystemVerilog es va adoptar com a estàndard IEEE 1800-2005. El 2009, l'estàndard es va fusionar amb l'estàndard base Verilog (IEEE 1364-2005), creant l'estàndard IEEE 1800-2009. La versió actual és l'estàndard IEEE 1800-2017.
El conjunt de funcions de SystemVerilog es pot dividir en dos rols diferents:
* SystemVerilog per al disseny de nivell de transferència de registre (RTL) és una extensió de Verilog-2005; totes les funcions d'aquest idioma estan disponibles a SystemVerilog. Per tant, Verilog és un subconjunt de SystemVerilog.
* SystemVerilog per a la verificació utilitza tècniques de programació orientades a objectes àmplies i està més relacionat amb Java que amb Verilog. Aquestes construccions generalment no són sintetitzables.
La resta d'aquest article tracta les característiques de SystemVerilog que no estan presents a Verilog-2005.

## Característiques de disseny
### Vida útil de les dades

Hi ha dos tipus de temps de vida de dades especificats a SystemVerilog: estàtica i automàtica. Les variables automàtiques es creen en el moment en què l'execució del programa entra a l'abast de la variable. Les variables estàtiques es creen a l'inici de l'execució del programa i mantenen el mateix valor durant tota la vida útil del programa, tret que s'assigni un nou valor durant l'execució.
Qualsevol variable que es declari dins d'una tasca o funció sense especificar el tipus es considerarà automàtica. Per especificar que una variable és estàtica, col·loqueu la paraula clau "estàtica" a la declaració abans del tipus, per exemple, "static int x;". La paraula clau "automàtic" s'utilitza de la mateixa manera.

## Interficies

Per a dissenys petits, el port Verilog descriu de manera compacta la connectivitat d'un mòdul amb l'entorn circumdant. Però els blocs principals dins d'una gran jerarquia de disseny solen tenir un nombre de ports de milers. SystemVerilog introdueix el concepte d'interfícies tant per reduir la redundància de les declaracions de noms de port entre mòduls connectats, com per agrupar i resumir senyals relacionats en un paquet declarat per l'usuari. El concepte addicional és modport, que mostra la direcció de les connexions lògiques.

## Millores generals al Verilog clàssic

A més de les noves funcions anteriors, SystemVerilog millora la usabilitat de les funcions d'idioma existents de Verilog. Les següents són algunes d'aquestes millores:
* Els operadors d'assignació de procediments (<=, =) ara poden operar directament en matrius.
* Les definicions de port (inout, input, output) ara s'amplien per donar suport a una varietat més àmplia de tipus de dades: s'admeten tipus struct, enum, real i multidimensional.
* La construcció del bucle for ara permet la declaració automàtica de variables dins de la instrucció for. El control del flux de bucle es millora amb les declaracions continue i break.
* SystemVerilog afegeix un bucle do/while a la construcció del bucle while.
* Les variables constants, és a dir, les designades com a no canviants durant el temps d'execució, es poden designar mitjançant l'ús de const.
* La inicialització de variables ara pot operar en matrius.
* Els operadors d'increment i decrement (x++, ++x, x--, --x) són compatibles amb SystemVerilog, igual que altres operadors d'assignació compostos (x += a, x -= a, x *= a, x /= a , x %= a, x <<= a, x >>= a, x &= a, x ^= a, x |= a) com en C i descendents.
* El preprocessador ha millorat les capacitats de "definir macro-substitució, específicament la substitució dins de cadenes literals (""), així com la concatenació de múltiples macro-tokens en una sola paraula.
* La construcció fork/join s'ha ampliat amb join_none i join_any.
* Les addicions a la directiva `timescale permeten controlar l'escala de temps de simulació de manera més previsible en un entorn de simulació gran, amb cada fitxer font utilitzant una escala de temps local.
* Els ports de tasques ara es poden declarar ref. Una referència dona al cos de la tasca accés directe als arguments font en l'àmbit de la persona que truca, conegut com a "pass per referència" en programació informàtica. Com que està operant amb la variable original en si, en lloc d'una còpia del valor de l'argument, la tasca/funció pot modificar variables (però no xarxes) en l'àmbit de la persona que truca en temps real. Les declaracions dels ports d'entrada/sortida passen variables per valor i posposen l'actualització de la variable d'àmbit de la persona que truca fins al moment en què s'acaba la tasca.
* Les funcions ara es poden declarar nuls, el que significa que no retorna cap valor.
* Els paràmetres es poden declarar de qualsevol tipus, inclosos els typedefs definits per l'usuari.

## Referències

* ↑ Admin. «SystemVerilog Tutorial» (en anglès britànic). [Consulta: 14 desembre 2023].
* ↑ «[https://ece.uah.edu/~gaede/cpe526/SystemVerilog_3.1a.pdf SystemVerilog 3.1a Language Reference Manual]» (en anglès). [Consulta: 14 desembre 2023].
* ↑ Ganesh, Subramani. «SystemVerilog Assertions Basics - systemverilog.io» (en anglès). [Consulta: 14 desembre 2023].
* ↑ «[https://compas.cs.stonybrook.edu/~nhonarmand/courses/sp15/cse502/slides/03-systemverilog.pdf A Brief Introduction to SystemVerilog]» (en anglès). [Consulta: 14 desembre 2023].