Verilog

Da Wikipedia, l'enciclopedia libera.
Template-info.svg

Verilog è un linguaggio di descrizione dell'hardware (HDL) usato per descrivere sistemi elettronici.

Il linguaggio (a volte chiamato Verilog HDL) supporta la progettazione, la verifica, e l'implementazione di circuiti digitali e più raramente di circuiti analogici o circuiti misti analogico-digitali a vari livelli di astrazione. Gli inventori del Verilog volevano un linguaggio con una sintassi simile al C così che fosse familiare agli utilizzatori e facilmente accettato.

Allo stato attuale può considerarsi l'unico linguaggio, assieme al VHDL utilizzato nel mondo della progettazione e simulazione digitale con una quota di mercato pari a circa il 50% rispetto al più moderno ma assai più rigido VHDL.

Il linguaggio distingue tra caratteri maiuscoli e caratteri minuscoli, ha un preprocessore come il C, e le maggiori parole chiave di controllo del flusso del programma, come "if" e "while", sono uguali al C. La formattazione delle procedure di stampa, gli operatori del linguaggio e la loro precedenza sono simili al C.

Il linguaggio differisce dal C in alcuni punti fondamentali. Verilog usa Begin/End invece delle parentesi graffe per definire un blocco di codice. Le costanti in Verilog richiedono di essere specificate in termini di larghezza in numero di bit insieme al tipo di base utilizzata per la definizione. Verilog 95 e 2001 non ha strutture, puntatori, sottoprocedure ricorsive, mentre queste sono presenti nel SystemVerilog che ora include queste capacita'. Infine il concetto di time —così importante per l' HDL— non esiste nel C.

Il linguaggio differisce dai linguaggi di programmazione convenzionali nell'esecuzione delle istruzioni dato che essendo un linguaggio che descrive processi paralleli e concorrenti l'esecuzione non è strettamente lineare.

Un progetto Verilog consiste di una gerarchia di moduli. Ciascuno è definito da un insieme di ingressi e uscite e porte bidirezionali. Internamente contiene una lista di file e registri. Definizione di processi paralleli e sequenziali ne definiscono il comportamento definendo la relazione tra le porte i registri e i file. Le istruzioni sequenziali sono poste all'interno di un blocco begin/end in ordine sequenziale all'interno del blocco.

Tutte le istruzioni concorrenti e tutti i blocchi begin/end sono eseguiti in parallelo. Un modulo contiene una o più istanze di un altro modulo per definire sotto comportamenti. Un sottoinsieme delle istruzioni del linguaggio è logicamente sintetizzabile. Se il modulo in un disegno contiene soltanto istruzioni sintetizzabili, ovvero non ha dichiarazioni di simulazione, del software può essere utilizzato per trasformare (sintetizzare) il progetto in una lista di componenti (gate o device) e di connessioni tra loro che descrivono i macro blocchi da implementare in hardware.

La lista di connessioni (netlist) può essere per esempio in una forma che descrive un circuito integrato di tipo gate array, molto più raramente uno standard cells, ovvero degli (ASIC).

Più comunemente l'uscita è un bitstream utilizzata per un dispositivo programmable logic device (ad esempio, una FPGA).

Storia[modifica | modifica sorgente]

Il Verilog fu inventato nel 1985 da Phil Moorby presso la Automated Integrated Design Systems (più tardi denominata Gateway Design Automation) come un linguaggio di programmazione dell'hardware. Nel 1990 l'azienda fu comprata da Cadence Design Systems, la quale rese di pubblico dominio il linguaggio, fino ad allora proprietario. Da qui derivò la possibilità di renderlo uno standard, cosa che divenne con il nome di IEEE 1364, con revisioni nel 1995, 2001 e 2005. Cadence attualmente detiene la proprietà completa dei diritti dei simulatori logici della vecchia Gateway

Esempi[modifica | modifica sorgente]

Un programma che visualizza "hello world":

module main;
  initial 
    begin
      $display("Hello world!");
      $finish;
    end
endmodule

Un esempio di 2 flip-flop:

module toplevel(clock,reset);
 input clock;
 input reset;

 reg flop1;
 reg flop2;

 always @ (posedge reset or posedge clock)
 if (reset)
   begin
     flop1 <= 0;
     flop2 <= 1;
   end
 else
   begin
     flop1 <= flop2;
     flop2 <= flop1;
   end
endmodule

L'operatore <= costituisce un altro aspetto del fatto che Verilog è un linguaggio per la descrizione dell'hardware e non un normale linguaggio procedurale. Tale operatore è conosciuto come "assegnazione non bloccante". Quando la simulazione viene eseguita, tutti quei segnali impostati mediante "<=" vengono modificati solo dopo che tutte le istruzioni che avvengono nello stesso momento sono state eseguite. Questo rende più semplice descrivere comportamenti che avvengono simultaneamente.

Nell'esempio sopra, flop1 è assegnato a flop2 e flop2 a flop1. Queste istruzioni sono eseguite durante lo stesso evento temporale. Visto che le assegnazioni sono codificate mediante <=, queste accadono alla fine dell'evento e sino ad allora tutte le letture dei valori di flop1 e flop2 restituiranno il valore all'inizio dell'evento. Questo significa che l'ordine delle assegnazione non è significativo e produrrà gli stessi risultati. flop1 e flop2 si scambieranno i valori a ogni ciclo.

L'altra scelta per l'assegnazione è l'operatore =, conosciuto come "assegnazione bloccante". Quando viene utilizzato, le cose accadono nella sequenza con cui appaiono, come in un linguaggio procedurale.

Nell'esempio sopra, se le assegnazioni avessero fatto uso di = invece di <=, l'ordine con cui compaiono avrebbe influenzato il comportamento: il reset avrebbe impostato flop2 a 1 e flop1 a 0. Al ciclo successivo, flop1 sarebbe stato impostato al valore di flop2, che è 1 dopo il reset. L'istruzione successiva verrebbe stata quindi eseguita, e avrebbe impostato flop2 a flop1, che adesso è pari a 1. Invece di scambiare i valori a ogni ciclo, flop1 e flop2 sarebbero stati impostati a 1 e rimasti così.

Un esempio di contatore:

module Div20x (rst, clk, cet, cep, count,tc);
// TITLE 'Divide-by-20 Counter with enables'
// enable CEP is a clock enable only
// enable CET is a clock enable and
// enables the TC output
// contatore in Verilog

parameter size = 5;
parameter length = 20;

input rst; // questi ingressi/uscite rappresentano
input clk; // connessioni al modulo
input cet;
input cep;

output [size-1:0] count;
output tc;

reg [size-1:0] count; // segnali assegnati
                      // all'interno di un blocco "always"
                      // (o "initial")
                      // devono essere di tipo "reg"
                      
wire tc; // gli altri segnali sono di tipo "wire"

// l'istruzione "always" di seguito indica una
// esecuzione in parallelo che
// avviene ogni volta che i segnali
// "rst" o "clk" effettuano una transizione da basso ad alto

always @ (posedge clk or posedge rst)
  if (rst) // questo cause il reset del contatore
    count <= 5'b0;
  else
  if (cet && cep) // entrambi "true"
    begin
      if (count == length-1)
        count <= 5'b0;
      else
        count <= count + 5'b1; // 5'b1 &egrave 5 bit
    end                        // di dimensione e pari
                               // al valore 1

// a "tc" viene assegnato continuamente
// il valore dell'espressione
assign tc = (cet && (count == length-1));

endmodule

Un esempio di ritardo:

...
reg a, b, c, d;
wire e;
...
always @(b or e)
 begin
   a = b & e;
   b = a | b;
   #5 c = b;
   d = #6 c ^ e;
 end

L'utilizzo della parola-chiave always sopra illustra l'altro metodo di utilizzo, cioè viene eseguita ogni volta che un'entità specificata nella lista cambia nell'esempio b o e. Quando questo avviene, ad a e b sono immediatamente assegnati dei nuovi valori. Dopo 5 unità di tempo, a c è assegnato il valore di b e il risultato di c ^ e nascosto messo da parte in un'area nascosta. Quindi, dopo altre 6 unità di tempo, questo valore "nascosto" è assegnato a d.

Segnali che partono dall'interno di un processo (un blocco di tipo initial o always devono essere di tipo reg. Segnali che partono dal di fuori di un processo devono essere di tipo wire. La parola-chiave reg non comporta necessariamente un registro hardware.

Collegamenti esterni[modifica | modifica sorgente]

Informazioni su Verilog[modifica | modifica sorgente]

informatica Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica