SystemVerilog: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m Formattazione paragrafi |
m →Sincronizzazione: fix wl |
||
(14 versioni intermedie di 10 utenti non mostrate) | |||
Riga 1:
{{Linguaggio di programmazione
|nome = SystemVerilog
Line 7 ⟶ 6:
|versione = IEEE 1800-2017
|utilizzo = [[Linguaggio di descrizione hardware]]
|paradigmi = Design: [[
|tipizzazione = Statico, debole
|influenzato_da = Design: [[Verilog]], [[VHDL]], [[C++]],
Verifica: [[OpenVera]], [[Java (programming language)|Java]]
|ha_influenzato =
Line 18 ⟶ 17:
}}
'''SystemVerilog''', standardizzato come '''IEEE 1800''', è un linguaggio [[Linguaggio di descrizione hardware|di descrizione]] e verifica dell'hardware utilizzato per modellare, progettare, simulare, testare e implementare sistemi elettronici. SystemVerilog è basato su [[Verilog]] ed è comunemente usato nell'industria dei [[Semiconduttore|semiconduttori]] e della progettazione [[elettronica]] come evoluzione di Verilog. Dal 2008 Verilog e SystemVerilog fanno
== Storia ==
SystemVerilog nasce nel 2002, con la donazione del linguaggio Superlog ad Accellera
Il set di funzionalità di SystemVerilog può essere suddiviso in due
# SystemVerilog per la progettazione a [[Register transfer level|livello di trasferimento tra registri]] (RTL): è un'estensione di [[Verilog|Verilog-2005]] e tutte le funzionalità di quel linguaggio sono disponibili in SystemVerilog. Pertanto, Verilog
# SystemVerilog per la verifica: utilizza estesamente tecniche [[Programmazione orientata agli oggetti|di programmazione orientate agli oggetti]] ed è più strettamente correlato a [[Java (linguaggio di programmazione)|Java]]
Il resto di questo articolo discute le caratteristiche di SystemVerilog non presenti in [[Verilog|Verilog-2005]].
== Caratteristiche a supporto della progettazione ==
=== Durata delle variabili ===
Esistono due tipi di durata delle variabili specificate in SystemVerilog: static e automatic. Le variabili automatiche vengono create nel momento in cui l'esecuzione del programma rientra nello scope della variabile. Le variabili statiche vengono create all'inizio dell'esecuzione del programma e mantengono lo stesso valore durante l'intero ciclo di vita del programma, a meno che non venga assegnato un nuovo valore durante l'esecuzione.
Qualsiasi variabile dichiarata all'interno di un task o di una funzione senza specificare il tipo verrà considerata automatica. Per specificare che una variabile è statica si utilizza la [[Parola riservata|parola chiave]] <code>static</code> nella dichiarazione del tipo, ad esempio <code>static int x;</code>. La parola chiave <code>automatic</code>
=== Nuovi tipi di dati ===
'''I tipi di variabili avanzati''' aggiungono nuove funzionalità al tipo "reg" di Verilog:<syntaxhighlight lang="systemverilog" line="1">
logic [31:0] my_var;
</syntaxhighlight>Verilog-1995 e Verilog-2001 limitano le variabili reg a
'''I Packed array multidimensionali''' unificano ed estendono la nozione di "registri" e "memorie" di Verilog:<syntaxhighlight lang="systemverilog" line="1">
logic [1:0][2:0] my_pack[32];
</syntaxhighlight>Il Verilog classico consente di dichiarare solo una dimensione a sinistra del nome della variabile. SystemVerilog consente qualsiasi numero di tali dimensioni "impacchettate". Una variabile di tipo array
'''I tipi di dati enumerati''' (<code>enums</code>) consentono di assegnare nomi significativi a quantità numeriche. Le variabili dichiarate di tipo enumerato non possono essere assegnate a variabili di un diverso tipo enumerato senza [[
typedef enum logic [2:0] {
RED, GREEN, BLUE, CYAN, MAGENTA, YELLOW
Line 53 ⟶ 51:
color_t my_color = GREEN;
initial $display("The color is %s", my_color.name());
</syntaxhighlight>Come mostrato sopra, il progettista può specificare un tipo aritmetico sottostante (
'''Nuovi tipi interi''': SystemVerilog definisce <code>byte</code>, <code>shortint</code>, <code>int</code> e <code>longint</code> come tipi interi con segno a due stati con rispettivamente 8, 16, 32 e 64 bit. Un tipo <code>bit</code> è un tipo a due stati a larghezza variabile che funziona in modo molto simile a <code>logic</code>. I tipi a due stati mancano dei metavalori [[Condizione di indifferenza|X]] e Z del Verilog classico; l'uso di questi tipi può consentire una simulazione più veloce.
'''Le [[Record (informatica)|
typedef struct packed {
bit [10:0] expo;
Line 68 ⟶ 66:
=== Blocchi procedurali ===
SystemVerilog introduce tre nuovi blocchi procedurali destinati a modellare l'hardware
Un blocco <code>always_comb</code> modella [[Circuito combinatorio|
always_comb begin
tmp = b * b - 4 * a * c;
Line 78 ⟶ 76:
always_latch
if (en) q <= d;
</syntaxhighlight>Un blocco <code>always_ff</code> modella la
always_ff @(posedge clk)
count <= count + 1;
Line 108 ⟶ 106:
== Funzionalità di verifica ==
Le seguenti funzionalità di verifica in genere non sono sintetizzabili, il che significa che non possono essere implementate
=== Nuovi tipi di dati ===
Line 117 ⟶ 115:
string s3 = {s1, ", ", s2, p[2]}; // string concatenation
$display("[%d] %s", s3.len(), s3); // simulation will print: "[13] Hello, world!"
</syntaxhighlight>Oltre agli array statici utilizzati nella progettazione, SystemVerilog offre [[Array dinamico|array dinamici]], [[Array associativo|array associativi]] e [[Coda (informatica)|code]]
int cmdline_elements; // # elements for dynamic array
int da[]; // dynamic array
Line 128 ⟶ 126:
da = new[ cmdline_elements ]; // Allocate array with 16 elements
end
</syntaxhighlight>Un array dinamico funziona in modo molto simile a un array unpacked, ma offre il vantaggio di essere [[Gestione della memoria|allocato dinamicamente]] in [[Run-time|fase di esecuzione]] (come mostrato sopra
Un array associativo può essere considerato come un [[Albero binario di ricerca|albero di ricerca binario]] con un tipo della chiave e un tipo dei dati specificati dall'utente. La chiave implica un ordinamento. Gli elementi di un array associativo possono essere letti in ordine lessicografico.
Infine, una coda fornisce gran parte delle funzionalità del tipo [[deque]] della [[Standard Template Library|Standard Template Library C++]]: gli elementi possono essere aggiunti e rimossi da entrambe le estremità in modo efficiente. Queste primitive consentono la creazione di strutture di dati complesse, necessarie ad esempio per lo scoreboard di un progetto di grandi dimensioni.
Line 139 ⟶ 137:
In SystemVerilog, le classi supportano un modello [[Ereditarietà multipla|di ereditarietà singola]], ma possono implementare funzionalità simili all'ereditarietà multipla attraverso l'uso delle cosiddette "classi di interfaccia" (identiche nel concetto alla funzionalità <code>interface</code> di Java). Le classi possono essere parametrizzate per tipo, fornendo la funzione di base dei template C++. Tuttavia, la specializzazione dei template e le funzioni template non sono supportati.
Le funzionalità [[Polimorfismo (informatica)|di polimorfismo]] di SystemVerilog sono simili a quelle di C++: il programmatore può definire una funzione <code>virtual</code> per fare in modo che una classe derivata [[Funzione virtuale|ottenga il controllo della funzione]].
[[Incapsulamento (informatica)|L'incapsulamento]] e l'occultamento dell'informazione (''information hiding'') vengono eseguiti utilizzando le parole chiave <code>local</code> e <code>protected</code>, che devono essere applicate a qualsiasi elemento che deve essere nascosto. Per impostazione predefinita, tutte le proprietà della classe sono pubbliche.
Line 206 ⟶ 204:
endfunction
endclass
</syntaxhighlight>I metodi ''constraint_mode()'' e ''random_mode()'' sono usati per controllare la randomizzazione. constraint_mode() viene utilizzato per attivare e disattivare un vincolo specifico e random_mode viene utilizzato per attivare o disattivare una randomizzazione di una variabile specifica. Il codice seguente descrive e verifica proceduralmente un [[frame Ethernet]]
class eth_frame;
rand bit [47:0] dest;
Line 243 ⟶ 241:
Le asserzioni SystemVerilog sono costruite da '''sequenze''' e '''proprietà'''. Le proprietà sono un superinsieme di sequenze; qualsiasi sequenza può essere utilizzata come se fosse una proprietà, sebbene ciò non sia tipicamente utile.
Le sequenze sono costituite da [[Espressione booleana|espressioni booleane]] aumentate con operatori temporali. L'operatore temporale più semplice è l'operatore <code>##</code> che esegue una concatenazione:
sequence S1;
@(posedge clk) req ##1 gnt;
Line 257 ⟶ 255:
assert_req_gnt: assert property (req_gnt) else $error("req not followed by gnt.");
</syntaxhighlight>Questo esempio mostra un operatore
Oltre alle asserzioni, SystemVerilog supporta [[Presupposizione (linguistica)|le ipotesi]] e la copertura delle proprietà. Un'assunzione stabilisce una condizione che uno [[Dimostrazione automatica di teoremi|strumento
=== Copertura ===
'''La copertura''' (''coverage'') applicata ai linguaggi di verifica hardware si riferisce alla raccolta di statistiche basate su eventi di campionamento all'interno della simulazione. La copertura viene utilizzata per determinare quando il dispositivo sottoposto a test (''Device Under Test'', DUT) è stato esposto a una varietà sufficiente di stimoli tale che vi sia un'elevata probabilità che il DUT funzioni correttamente. Si noti che
Un gruppo di copertura SystemVerilog crea un database di "contenitori" (''bin'') che memorizzano un [[istogramma]] di valori di una variabile associata. È inoltre possibile definire la copertura incrociata, che crea un istogramma che rappresenta il [[prodotto cartesiano]] di più variabili.
Line 291 ⟶ 289:
=== Sincronizzazione ===
Un ambiente di test complesso è costituito da componenti di verifica riutilizzabili che devono comunicare tra loro. La primitiva "event" di Verilog consente a diversi blocchi di istruzioni procedurali di attivarsi a vicenda, ma l'applicazione
== Miglioramenti generali al Verilog classico ==
Line 297 ⟶ 295:
* Gli [[Operatore di assegnamento|operatori di assegnazione]] procedurale (<=, =) ora possono operare direttamente sugli array.
* Le definizioni delle porte (inout, input, output) sono ora espanse per supportare una più ampia varietà di [[Tipo di dato|tipi di dati]]
* Il costrutto [[Ciclo for|del ciclo for]] ora consente la dichiarazione automatica delle variabili all'interno dell'istruzione for. [[Struttura di controllo|Il controllo del flusso]] del ciclo è migliorato dalle [[Struttura di controllo|istruzioni ''continue'' e ''break'']].
* SystemVerilog aggiunge un ciclo ''do/while'' al costrutto del ciclo ''while''.
Line 313 ⟶ 311:
== Software di verifica e sintesi ==
Nella progettazione di chip elettronici, SystemVerilog è ampiamente utilizzato nella verifica. I tre maggiori fornitori di strumenti EDA (Cadence Design Systems, [[Mentor Graphics]], Synopsys) hanno incorporato SystemVerilog nei loro simulatori HDL in linguaggio misto. Sebbene nessun simulatore possa ancora rivendicare il supporto completo del SystemVerilog Language Reference Manual, rendendo [[Interoperabilità|l'interoperabilità]] dei test bench una sfida, sono in corso sforzi per promuovere la compatibilità tra fornitori.
{{senza fonte|Nella sintesi del progetto (trasformazione di una descrizione del progetto hardware in una [[netlist]]), l'adozione di SystemVerilog è stata lenta. Molti team di progettazione utilizzano flussi di progettazione che coinvolgono più strumenti di fornitori diversi. La maggior parte dei team di progettazione non può migrare a progetti RTL basati su SystemVerilog fino a quando l'intera suite di strumenti front-end ([[Lint (software)|linter]], [[verifica formale]] e [[Generazione di programmi di prova automatici|generatori di strutture di test automatizzate]] ) non supporta un sottoinsieme linguistico comune}}.
==
<references />
* [[Verilog]]▼
* [[SystemC|System C]]▼
==
* {{
* {{
* {{
* {{
* {{
▲* {{Cite book| title = 1800-2017 — IEEE Standard for SystemVerilog—Unified Hardware Design, Specification, and Verification Language| doi = 10.1109/IEEESTD.2018.8299595| year = 2017| isbn = 978-1-5044-4509-2}}
* {{cita news|cognome=Puneet Kumar |url=http://asicguru.com/System-Verilog-Tutorial/1/3 |titolo=System Verilog Tutorial |data=9 novembre 2005 }}
▲* {{cite news |last=McGrath |first=Dylan |url=http://www.eetimes.com/news/design/showArticle.jhtml;?articleID=173601060 |title=IEEE approves SystemVerilog, revision of Verilog |publisher=EE Times |date=2005-11-09 |access-date=2007-01-31}}
* {{
* {{
* Spear, Chris, [https://www.amazon.com/SystemVerilog-Verification-Learning-Testbench-Language/dp/0387765298/ref=sr_1_1?ie=UTF8&s=books&qid=1247578512&sr=8-1 "SystemVerilog for Verification"] Springer, New York City, NY. {{ISBN|0-387-76529-8}}
* Stuart Sutherland, Simon Davidmann, Peter Flake, [https://www.amazon.com/SystemVerilog-Design-Second-Hardware-Modeling/dp/0387333991/ref=sr_1_4?ie=UTF8&s=books&qid=1247578512&sr=8-4 "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}}
Line 338 ⟶ 333:
* Erik Seligman and Tom Schubert [https://www.amazon.com/Formal-Verification-Essential-Toolkit-Modern-ebook/dp/B012VX1MW8/ref=sr_1_1?ie=UTF8&qid=1451183481&sr=8-1&keywords=erik+seligman+formal+verification] Formal Verification: An Essential Toolkit for Modern VLSI Design, Jul 24, 2015,
==
* [[Linguaggio di descrizione dell'hardware]]
▲* [[Verilog]]
* [[VHDL]]
▲* [[SystemC|System C]]
== Collegamenti esterni ==
;Standard IEEE
Lo standard SystemVerilog più recente è accessibile gratuitamente tramite [https://ieeexplore.ieee.org/browse/standards/get-program/page/series?id=80 IEEExplore].
Riga 361:
* [http://www.edaplayground.com EDA Playground] – Eseguire SystemVerilog da un web browser (online IDE)
* [http://www.svericl.com/sverule sverule] – SystemVerilog BNF Navigator
{{Controllo di autorità}}
{{Norme IEEE}}
{{Logica programmabile}}
{{portale|
[[Categoria:Linguaggi di descrizione hardware]]
|