Verilog

S Vikipedije, slobodne enciklopedije

Verilog, standardizovan kao IEEE 1364, je jezik za opis hardvera koji se koristi za modelovanje elektronskih sistema. Najčešće se koristi u dizajnu i verifikaciji digitalnih kola na nivou prenosa apstrakcije. Takođe se koristi u verifikaciji analognih kola i kola sa mešovitim signalima kao i u dizajnu genetičkih kola.[1]

Uvod[uredi | uredi izvor]

Jezici za opis hardvera kao što je Verilog su slični softverskim programskim jezicima, jer uključuju načine opisivanja širenja vremena i jačine signala (osetljivost). Postoje dva tipa operatora dodele; blokirajuće (=) i neblokirajuće (<=). Neblokirajuća dodela omogućava dizajnerima da opišu ažuriranje stanja mašine bez potrebe za deklaracijom i korišćenjem varijabli sa privremenim skladištenjem. Pošto su ovi koncepti deo Verilogove semantike jezika, dizajneri mogu brzo napisati opise velikih kola u relativno kompaktnom i konciznom obliku. U vreme Verilogovog nastajanja (1984), Verilog je predstavio ogromnu poboljšanu produktivnost za dizajnere kola koji su već koristili grafički šematski softver za snimanje i posebno napisane softverske programe za dokumentovanje i simulaciju elektronskih kola.

Dizajneri Veriloga su želeli jezik sa sintaksom sličnom programskom jeziku C, koji je već bio široko rasprostranjen i korišćen u razvoju inženjerskog softvera. Kao C, Verilog je osetljiv na velika i mala slova i ima osnovni preprociser (iako manje sofisticiran od ANSII C / C ++). Ključne reči kontrolnog toka (ako/onda, za, dok, slučaj, itd.) su ekvivalentne, a prednost njegovog operatora je kompatibilnost sa jezikom C. Sintaksičke razlike uključuju: zahtevanje širine bitova za deklaracije promenljivih, razdvajanje proceduralnih blokova (Verilog koristi početak/kraj umesto zagrada {}), i mnoge druge manje razlike. Verilog zahteva da se promenljivoj dodeli određena veličina. U C se ove veličine pretpostavljaju na osnovu "tipa" varijable (na primer, celi tip može biti 8 bita).

Istorija[uredi | uredi izvor]

Početak[uredi | uredi izvor]

Verilog je bio jedan od prvih popularnih jezika za opis hardvera. Izradili su ga Prabu Goel, Fil Morbi i Či-Lej Huang i Daglas Varmke u periodu između kraja 1983. i početka 1984[2]. Či-Lej Huang je ranije radio na opisu hardvera LALSD, jeziku koji je razvio profesor S. I. H. Su, za svoj doktorski rad[3]. Startni naslov za ovaj rad je bio "Automatski integrisani dizajn sistema" (koji je kasnije preimenovan u Automatizacija dizajna prolaska (kapije) 1985) kao jezik hardvera za modeliranje koji je kupio Kadens Dizajn Sistemi 1990. godine. Prvobitno, Verilog je imao samo nameru da opisuje i dozvoli simulaciju, automatizovanu sintezu podskupova jezika na fizički realizovane strukture (kapije itd.) Razvijen je nakon što je jezik postigao široku upotrebu.

Naziv "Verilog" je nastao kombinacijom reči "verifikacija" i "logika".[4]

Verilog-95[uredi | uredi izvor]

Sa takođe rastućim uspehom VHDL u to vreme, Kadens je odlučio napraviti jezik koji bi bio dostupan za otvorenu standardizaciju. Kadens je preneo Verilog u javni domen pod nazivom Internacionalan Slobodan Verilog (ISV) (sada poznata kao organizacija Accellera). Verilog je kasnije bio izložen na IEEE i postao IEEE Standard 1364-1995, obično nazvan Verilog-95.

U isto vreme Kadens je pokrenuo stvaranje Verilog-A kako bi postavio standarde za svojim analognim simulatorom Spektra. Verilog-A nikada nije bio namenjen da bude samostalni jezik, on je podskup Verilog-AMS koji obuhvata Verilog-95.

Verilog 2001.[uredi | uredi izvor]

Dodaci za Verilog-95 su vraćeni na IEEE kako bi se pokrili nedostaci koje su korisnici pronašli u originalnom Verilog standardu. Ove ekstenzije su postale IEEE Standard 1364-2001 poznat kao Verilog-2001.

Verilog-2001 je značajna nadogradnja Verilog-95. Prvo, dodaje eksplicitnu podršku za označene mreže i promenljive. Prethodno su autori koda morali da izvrše označene operacije koristeći neuobičajene manipulacije na nivou bitova. Konstrukcija generisanje/krajgenerisanja (slična VHDLovoj konstrukciji) omogućava Verilogu-2001 da kontroliše instancu kroz normalne operatere odlučivanja (case/if/else). Koristeći ovu konstrukciju, Verilog-2001 može instancirati niz instanci, uz kontrolu povezivanja pojedinih instanci. Fajl I/O je poboljšan sa nekoliko novih sistemskih zadataka. I na kraju, uvedeno je nekoliko dodataka za sintaksu kako bi se poboljšala čitljivost kodova (npr. uvek, @ *, imenovani parametar preklapanja, C-stil funkcija / zadatak / deklaracija zaglavlja modula).

Verilog-2001 je Verilog verzija koju podržava većina komercijalnih EDA softverskih paketa.

Verilog 2005.[uredi | uredi izvor]

Da ne bi došlo do zabune sa SistemVerilog, Verilog 2005 (IEEE Standard 1364-2005) se sastoji od malih izmena i nekoliko dodatnih opcija za jezike.

Poseban deo Verilog standarda, Verilog-AMS, pokušava integrisati analogno i mešovito modeliranje sa tradicionalnim Verilog modeliranjem.

Koncept modula[uredi | uredi izvor]

Modul u Verilog-u predstavlja osnovnu jedinicu dizajna i tipično predstavlja hardversku komponentu koju zelimo da napravimo. Svaki modul može imati ulaze i izlaze koji predstavljaju signale koji respektivno, ulaze i izlaze iz komponente koju dizajniramo (ulaze i izlaze drugačije zovemo portovi). Manji moduli se mogu instancirati u okviru većih modula (kao što se jednostavnija logička kola koriste u izgradnji složenijih). Takođe, u Verilog-u postoje i moduli za koje nije cilj da se sintetizuju, već se koriste isključivo za testiranje drugih modula. Ovi moduli najčešće nemaju portove, a sintaksa Veriloga koja se u njima koristi je obično znatno slobodnija, jer ne moramo da vodimo računa o tome da li se nešto može ili ne može sintetizovati u stvarnom hardveru. Sintaksa kreiranja modula je sledeća:

module <име_модула>(<листа_портова>);
<декларације_портова>;

// код

endmodule // крај модула

U istom fajlu Veriloga se obično može definisati veći broj modula, mada je često dobra praksa da se za svaki modul kreira poseban fajl sa kodom koji se zove isto kao i modul (sa ekstenzijom .v).

Portovi modula se navode svojim identifikatorima koji su razdvojeni zarezima. Nakon zaglavlja slede deklaracije portova. Za svaki port treba definisati da li je ulazni, izlazni, ili ulazno-izlazni. Na primer:

module moj_modul(x,y,z);
input [3:0] x;
output y;
inout z;

Semantika Verilog-a[uredi | uredi izvor]


Izvršavanje Verilog simulatora je nedeterminističko, a sastoji se od većeg broja procesa koji se izvršavaju paralelno, u proizvoljnom redosledu. Pod procesom podrazumevamo sledeće:

  • na nivou gejtova: svaki gejt (not, and, or...) je proces.
  • na nivou protoka podataka: svaka assign naredba kontinuirane dodele je proces
  • na nivou modelovanja ponasanja: initial i always su procesi

Za svaki proces vezujemo dva tipa događaja: događaji evaluacije procesa (evaluation event) i događaji ažuriranja vrednosti signala koji se u tom procesu izračunavaju (update event). Događaj evaluacije podrazumeva izračunavanje koje se obavlja u tom procesu. Npr. kod gejtova to znači izračunavanje odgovarajuće logičke funkcije, kod assign naredbe izračunavanje leve strane. Kod initial i always procesa, događaj evaluacije podrazumeva pokretanje naredbe koja se nalazi u okviru procesa (od tipa naredbe zavisi kako će se ona tačno izvršavati). Događaj ažuriranja podrazumeva promenu vrednosti nekog signala. Npr. kod gejtova se nakon izračunavanja logičke funkcije odgovarajući izlazni signal gejta postavlja na dobijenu vrednost. Kod assign naredbe se signal na levoj strani dodele postavlja na izračunatu vrednost. U slučaju initial i always procesa, događaji ažuriranja nastaju kao rezultat proceduralnih dodela.

Događaji ažuriranja kreiraju nove događaje evaluacije: svi procesi koji su osetljivi na promenu nekog signala se ponovo izračunavaju. Npr. gejtovi su osetljivi na svaku promenu ulaznih signala, assign naredbe su osetljive na svaku promenu nekog od signala koji se pojavljuje u izrazu na levoj strani. Događaji evaluacije za initial i always procese se kreiraju odmah po pokretanju simulatora. Za initial procese će to biti i jedina evaluacija u toku rada simulatora, dok će kod always procesa nakon završetka te prve evaluacije odmah biti kreiran novi događaj evaluacije za taj proces.

Događaji evaluacije kreiraju događaje ažuriranja ako i samo ako se evaluacijom izračuna neka vrednost koja je različita od tekuće vrednosti signala kome se ta vrednost dodeljuje. Npr. ako na ulazu and() kola imamo 0 i 1, i ako se drugi ulaz u nekom trenutku promeni u 0, to će izazvati događaj evaluacije (izračunava se nova vrednost), ali neće doći do kreiranja događaja ažuriranja (jer je izračunata vrednost ostala nepromenjena).

Jedini način da se raspoređivanje nekog događaja odloži za neku od sledećih vremenskih jedinica je da se definiše kašnjenje:

  • na nivou gejtova: specifikacijom kašnjenja se odlaže događaj ažuriranja nakon evaluacije za neku od sledećih vremenskih jedinica (time se dobija efekat kašnjenja propagacije izračunate vrednosti kroz gejt).
  • za assign naredbu: specifikacijom kašnjenja se odlaže događaj ažuriranja nakon evaluacije za neku od sledećih vremenskih jedinica (time se dobija efekat kašnjenja izračunavanja kod kombinatornog kola koje izračunava dati izraz).
  • za naredbe u initial i always procesima: kašnjenje može odložiti celu naredbu ili samo neki njen deo. Na primer:
initial #10 // одлаже се цела begin-end наредба за 10 временских јединица
begin
 x <= y;
 y <= x;
end
initial begin
 x <= y;
 #10 y <= x; // одлаже се само друга наредба доделе
end

U drugom primeru se u 0-toj vremenskoj jedinici raspoređuje događaj evaluacije za initial proces, ali se nakon izvršavanja prve naredbe dodele zaustavlja dalja evaluacija i kreira se novi događaj koji podrazumeva evaluaciju ostatka naredbe i koji se raspoređuje sa kašnjenjem od 10 vremenskih jedinica.

Kod složenih begin-end naredbi, čak i kada nema nikakvog kašnjenja, može dogoditi da simulator svojevoljno prekine evaluaciju nakon neke od naredbi i da ostatak složene naredbe rasporedi za kasniju evaluaciju u istoj vremenskoj jedinici (u vidu događaja evaluacije ostatka naredbe). Ovim se simulira paralelno izvršavanje više procesa.

U slučaju initial i always procesa, pored kašnjenja moguće je takođe navoditi i @() i wait() konstrukcije za kontrolu izvršavanja koje odlažu evaluaciju naredbe (ili dela naredbe) do ispunjenja određenih uslova. Kada se dati uslov ispuni, događaj evaluacije naredbe (ili ostatka naredbe) se raspoređuje za obradu u toj istoj vremenskoj jedinici. Na primer:

initial // евалуација прве наредбе доделе се обавља у 0-тој једници
begin
 x <= y;
 @(posedge z) y <= x; // евалуација друге наредбе доделе се одлазе
 	              // до првог преласка сигнала z са 0 на 1
end

Verilog simulator događaje postavlja u redove, pri čemu ima nekoliko različitih redova koji se razmatraju:

Red aktivnih događaja Qa[uredi | uredi izvor]

Ovde se nalaze događaji koji su raspoređeni za obradu u tekućoj vremenskoj jedinici. Oni se obrađuju u proizvoljnom poretku (s tim što se naredbe iz istog begin-end bloka moraju evaluirati u poretku koji je naveden u tom bloku; slično, događaji ažuriranja koji potiču iz istog begin-end bloka moraju se obraditi u poretku u kome su navedeni).

Red neaktivnih događaja Qi[uredi | uredi izvor]

Ovde se nalaze događaji koji su raspoređeni u tekućoj vremenskoj jedinici sa kašnjenjem #0. Ovaj jezički mehanizam se retko koristi prilikom testiranja, kako bi se naterao simulator da neke aktivne događaje ipak rasporedi onako kako korisnik želi. Ovo narušava prirodni nedeterminizam koji postoji u hardveru koji se dizajnira, pa zato ovakve konstrukcije treba izbegavati.

Red neblokirajućih dodela Qn[uredi | uredi izvor]

Ovde se nalaze događaji ažuriranja koji su nastali iz neblokirajućih dodela raspoređenih za izvršavanje u tekućoj vremenskoj jedinici. Ovi događaji obrađuju se nakon što se isprazne prethodna dva reda. Ovim se obezbeđuje ranije opisana semantika neblokirajućih dodela.

Red monitorskih događaja Qm[uredi | uredi izvor]

Ovaj red sadrži $monitor događaje koji se kreiraju u svakoj vremenskoj jedinici za svaki od monitora koji postoje u kolu. Obrada ovih događaja podrazumeva ispis odgovarajuće poruke na izlazu na osnovu vrednosti signala koji se prate (samo ako je bar jedan od signala promenjen u toj vremenskoj jedinici).

Red budućih događaja Qf[uredi | uredi izvor]

Ovaj red sadrži događaje koji su raspoređeni za izvršavanje u nekoj od sledećih vremenskih jedinica. Ovi događaji biće prebačeni u aktivni red čim se ispune odgovarajući uslovi (npr. nastupi odgovarajuća vremenska jedinica u slučaju da je zadato kašnjenje, ili se ispuni odgovarajući uslov u slučaju @() i wait() konstrukcija). Među ovim događajima postoje i događaji ažuriranja nastali iz neblokirajućih dodela koji su odloženi kašnjenjem unutar naredbe dodele, npr:

x <= 10# y; // догађај евалуације се извршава одмах, а догађај
            // ажурирања се одлаже за 10 временских јединица и
 // додаје у ред будућих догађаја

Ovakvi događaji će prilikom aktivacije biti raspoređeni u red neblokirajućih dodela, a ne u aktivni red.

Algoritam raspoređivanja je dat sledećim pseudokodom:

while(неки од редова није празан)
{
  if( празан)
  {
    if( није празан)
     пребаци све догађаје из  у 
    else if( није празан)
     пребаци све догађаје из  у 
    else if( није празан)
     пребаци све догађаје из  у 
    else
     {
       увећај бројач временских јединица;
       активирај све догађаје из  који су распоређени за ту
       временску јединицу;
     }

  }
  else
  {
    Е = произвољан догађај узет из 
    if(Е је догађај ажурирања)
    {
      ажурирамо одговарајући сигнал;
      додајемо догађаје евалуације за све процесе (или наредбе) који су
      осетљиви на ту промену у ред активних догађаја;
    }
    else // догађај евалуације
    {
      изврши евалуацију процеса (или наредбе)
      додај догађаје ажурирања у активни ред (или ред неблокирајућих
      додела, у случају наредбе неблокирајуће доделе)
    }
  }
}

Simulatori softvera[uredi | uredi izvor]

Za informacije o Verilog simulatorima, pogledajte takođe Lista HDL simulatora.

Slični jezici[uredi | uredi izvor]

  • VHDL
  • SistemC
  • SistemVerilog
  • OpenVera
  • e (jezik za verifikaciju)

Reference[uredi | uredi izvor]

  1. ^ Nielsen AA, Der BS, Shin J, Vaidyanathan P, Paralanov V, Strychalski EA, Ross D, Densmore D, Voigt CA (2016). „Genetic circuit design automation”. Science. 352 (6281): aac7341. PMID 27034378. doi:10.1126/science.aac7341. 
  2. ^ „Verilog's inventor nabs EDA's Kaufman award”. EE Times. 7. 11. 2005. 
  3. ^ Huang, Chi-Lai; Su, S.Y.H. „Approaches for Computer-Aided Logic System Design Using Hardware Description Language”. Proceedings of International Computer Symposium 1980, Taipei, Taiwan, December 1980. str. 772—79O. OCLC 696254754. 
  4. ^ „Oral History of Philip Raymond "Phil" Moorby” (PDF). Computer History Museum. 22. 4. 2013. str. 23—25. Arhivirano iz originala (PDF) 27. 12. 2014. g. Pristupljeno 31. 1. 2018. 
Notes

Spoljašnje veze[uredi | uredi izvor]

Tutorijali i izvori[uredi | uredi izvor]

Standardi[uredi | uredi izvor]

  • IEEE Std 1364-2005 – Oficijelni standard za Verilog 2005 (nije besplatan).
  • IEEE P1364 – Radna grupa za Verilog (neaktivna).
  • Verilog syntax – Opis sintakse u Backus-Naur formi. Pred IEEE-1364 standard.
  • Verilog 2001 syntax – Snažno povezana sintaksa BNFa za Verilog 2001 (generisana od EBNF alata).
  • Free Verilog Utilities – RTL i Netlist parseri, Testbench generatori, verilog2vhdl, vhdl2verilog, verilog2systemc, flattener, pretraživač zavisnosti i sortiranja.

Jezički dodaci[uredi | uredi izvor]

  • Verilog AUTOs — Sistem meta-komentara otvorenog koda koji pojednostavljuje održavanje Verilog koda.