Verilog

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
Verilog
limbaj de programare
Data de origine 1984
Utilizare Limbajul de descriere a hardware-ului
Paradigme Structurat
Tastare Static, slab
Extensii comune .v
Influențată de SystemVerilog

Verilog este un limbaj de descriere hardware (HDL) folosit pentru a descrie sistemele electronice digitale.

Prezentare generală

Limbajul (denumit uneori Verilog HDL ) acceptă proiectarea, verificarea și implementarea circuitelor digitale și mai rar a circuitelor analogice sau a circuitelor mixte analog-digitale la diferite niveluri de abstractizare. Inventatorii Verilog și-au dorit un limbaj cu o sintaxă asemănătoare cu C, astfel încât să fie familiar utilizatorilor și ușor acceptat. [ fără sursă ]

Una dintre cele mai imediate modalități de a practica cu Verilog este utilizarea plăcilor care montează chips-uri FPGA , Field Programmable Gate Array. Există mai mulți producători, inclusiv Digilent și Terasic, care montează cipuri produse de Xilinx și respectiv Altera. Folosind instrumentele furnizate de producătorii de plăci, este posibil să sintetizați codul și să încărcați fluxul de biți pe cipul FPGA care va implementa circuitul proiectat.

Principalul concurent este VHDL mai modern, dar în același timp mai puțin imediat de utilizat.

Caracteristici

Limbajul este sensibil la majuscule, adică distinge între majuscule și minuscule, are un preprocesor precum C și cuvintele cheie majore de control al fluxului de programe, cum ar fi „dacă” și „în timp ce”, sunt similare cu programarea mai cunoscută limba. Formatarea procedurilor de tipărire, operatorii de limbă și precedența lor sunt similare cu C.

Este greșit să ne gândim la Verilog ca la un limbaj de programare. De fapt, execuția codului nu este secvențială, ci este o descriere a comportamentului pe care trebuie să-l asume un modul, adică o componentă care va compune sistemul, pentru a genera ieșiri ca răspuns la intrări.

Poate fi util să comparați sintaxa cu cea a limbajului C pentru stocarea construcțiilor. Verilog folosește Begin / End în loc de paranteze curlate pentru a defini un bloc de cod. Constantele din Verilog trebuie specificate în termeni de lățime în număr de biți, împreună cu tipul de bază utilizat pentru definiție. Verilog 95 și 2001 nu au structuri recursive, indicatori, subproceduri, în timp ce acestea sunt prezente în SystemVerilog care include acum aceste capabilități. În cele din urmă, conceptul de timp - atât de important pentru HDL - nu există în C.

Limbajul Verilog diferă de limbajele de programare convenționale în executarea instrucțiunilor, deoarece, fiind un limbaj care descrie hardware, fiecare modul poate fi executat în paralel cu altele.

Un proiect Verilog constă dintr-o ierarhie de module. Fiecare este definit de un set de intrări și ieșiri și porți bidirecționale. Intern conține o listă de fișiere și registre. Definirea proceselor paralele și secvențiale definesc comportamentul acestora definind relația dintre porturi, registre și fișiere. Instrucțiunile secvențiale sunt plasate într-un bloc de început / sfârșit în ordine secvențială în cadrul blocului.

Toate instrucțiunile concurente și toate blocurile de început / sfârșit sunt executate în paralel. Un modul poate conține una sau mai multe instanțe ale altui modul pentru a defini comportamente secundare.

Omologul compilării codului sursă al limbajelor de programare comune în Verilog se numește sinteză. În timp ce în limbajele de programare codul sursă este tradus în codul mașinii, secvențele de 1 și 0 în sinteza instrucțiunilor și constructelor corespund componentelor fizice. Informațiile preluate din sinteză în etapele de dezvoltare ulterioare sunt traduse în măști de aspect pentru imprimarea circuitelor integrate sau într-un cod specific numit bitstream pentru programarea FPGA-urilor.

Un subset al instrucțiunilor de limbă este sintetizabil logic. Dacă modulul dintr-un desen conține doar instrucțiuni sintetizabile, adică nu are declarații de simulare, software-ul poate fi utilizat pentru a transforma (sintetiza) proiectul într-o listă de componente (poartă sau dispozitiv) și a conexiunilor dintre ele care descriu blocurile macro la să fie implementat în hardware. Lista conexiunilor (netlist) poate fi, de exemplu, într-o formă care descrie un circuit integrat de tipul gate array , mult mai rar o celulă standard , (adică ASIC ).

Cel mai frecvent, ieșirea este un flux de biți utilizat pentru un dispozitiv logic programabil (de exemplu, un FPGA ).

Istorie

Verilog a fost inventat în 1985 de Phil Moorby la Automated Integrated Design Systems (denumit ulterior Gateway Design Automation ) ca limbaj de programare hardware. În 1990 , compania a fost cumpărată de Cadence Design Systems , care a transformat limbajul anterior în domeniul public. De aici și posibilitatea de a face din acesta un standard, care s-a întâmplat sub numele de IEEE 1364, cu revizuiri în 1995, 2001 și 2005. Cadence deține în prezent proprietatea deplină a drepturilor asupra simulatoarelor logice ale vechiului Gateway.

Exemple

Un program care afișează „ hello world ”:

 modul principal ;
  iniţială 
    începe
      $ display ( "Bună ziua lume!" );
      $ finisare ;
    Sfârșit
endmodule

Codul de mai sus este util doar pentru simulare. Nu este posibil să sintetizați cu aceste instrucțiuni un circuit care are acest comportament.

Un exemplu de 2 flip-flops .

 nivel superior modul ( ceas , resetare );
 ceas de intrare ;
 resetare intrare ;

 reg ff1 ;
 reg ff2 ;

 întotdeauna @ (posedge resetare sau ceas posedge)
 dacă ( reset )
   începe
     ff1 <= 0 ;
     ff2 <= 1 ;
   Sfârșit
 altceva
   începe
     ff1 <= ff2 ;
     ff2 <= ff1 ;
   Sfârșit
endmodule

Operatorul <= este un alt aspect al faptului că Verilog este un limbaj de descriere hardware și nu un limbaj procedural normal. Acest operator este cunoscut sub numele de „atribuire fără blocare”. Când se execută simularea, toate acele semnale setate de „<=” sunt modificate numai după ce au fost executate toate instrucțiunile care apar în același timp. Acest lucru face mai ușoară descrierea comportamentelor care apar simultan.

În exemplul de mai sus, ff1 este atribuit lui ff2 și ff2 este atribuit lui ff1 . Aceste instrucțiuni sunt executate în același timp. Deoarece atribuțiile sunt codificate folosind <= , acestea se întâmplă la sfârșitul evenimentului și până atunci toate citirile valorilor ff1 și ff2 vor returna valoarea la începutul evenimentului. Aceasta înseamnă că ordinea sarcinilor nu este semnificativă și va produce aceleași rezultate. ff1 și ff2 vor schimba valori la fiecare ciclu.

Cealaltă alegere pentru atribuire este operatorul = , cunoscut sub numele de „blocare de atribuire”. Când sunt folosite, lucrurile se întâmplă în secvența în care apar, ca și în limbajul procedural.

În exemplul de mai sus, dacă misiunile ar fi folosit = în loc de <= , ordinea în care apar ar fi afectat comportamentul: resetarea ar fi setat ff2 la 1 și ff1 la 0. În următorul ciclu, ff1 ar avea a fost setat la valoarea ff2 , care este 1 după resetare. Instrucțiunea următoare ar fi apoi executată și setată ff2 la ff1 , care este acum egală cu 1. În loc să schimbe valorile la fiecare buclă, ff1 și ff2 ar fi setate la 1 și rămân așa.

Un exemplu de contor :

 modulul Div20x ( rst , clk , cet , cep , count , tc );
// TITLUL „Divizați-la-20 Contorul cu activează”
// enable CEP este doar un ceas activat
// enable CET este un clock enable și
// activează ieșirea TC
// contor în Verilog

dimensiunea parametrului = 5 ;
lungimea parametrului = 20 ;

prima intrare ; // aceste intrări / ieșiri reprezintă
intrare clk ; // conexiuni la modul
intrare cet ;
cep de intrare ;

ieșire [ dimensiune - 1 : 0 ] număr ;
ieșire tc ;

reg [ size - 1 : 0 ] count ; // semnale atribuite
                      // în interiorul unui bloc „întotdeauna”
                      // (sau „inițială”)
                      // trebuie să fie de tip „reg”
                      
sârmă tc ; // celelalte semnale sunt de tip „fir”

// declarația „întotdeauna” de mai jos indică a
// rulează în paralel că
// se întâmplă de fiecare dată când semnalele
// „rst” sau „clk” trece de la low la high

mereu @ ( posedge clk sau posedge rst )
  if ( rst ) // acest lucru determină resetarea contorului
    număr <= 5 'b0 ;
  altceva
  if ( cet && cep ) // ambele „adevărate”
    începe
      if ( număr == lungime - 1 )
        număr <= 5 'b0 ;
      altceva
        număr <= număr + 5 'b1 ; // 5'b1 este de 5 biți
    sfârșit // de mărime și uniform
                               // la valoarea 1

// „tc” este atribuit continuu
// valoarea expresiei
atribuiți tc = ( cet && ( count == lungime - 1 ));

endmodule

Un exemplu de întârziere:

 ...
reg a , b , c , d ;
sârmă și ;
...
mereu @ ( b sau e )
 începe
   a = b & e ;
   b = a | b ;
   # 5 c = b ;
   d = # 6 c ^ e ;
 Sfârșit

Utilizarea cuvântului cheie always de mai sus ilustrează cealaltă metodă de utilizare, adică este executată ori de câte ori o entitate specificată în listă se schimbă în exemplul b sau e . Când se întâmplă acest lucru, noile valori sunt atribuite imediat lui a și b . După 5 unități de timp, lui c i se atribuie valoarea lui b , în timp ce rezultatul lui c ^ e este pus deoparte într-o zonă ascunsă. Apoi, după alte 6 unități de timp, această valoare „ascunsă” este atribuită d .

Semnale care încep din cadrul unui proces (Un bloc inițial sau întotdeauna trebuie să fie de tip reg . Semnalele care încep în afara unui proces trebuie să fie de tip wire . Cuvântul cheie reg nu implică neapărat un registru hardware.

linkuri externe

Despre Verilog

Controlul autorității LCCN ( EN ) sh90004761