Verilog

**Verilog**, standardiseeritult **[[IEEE]] 1364**, on riistvarakirjelduskeel (HDL), mida kasutatakse elektriliste süsteemide modelleerimiseks. Verilogi kasutatakse kõige enam üldisel registrilisel tasemel digitaalsete skeemide kavandamisel ja ülevaatusel. Lisaks kasutatakse seda ka analoog- ja digitaalsignaalide skeemide koostamisel.

## Ülevaade
Riistvaralised kirjelduskeeled, nagu näiteks Verilog, erinevad tarkvaralistest programmeerimiskeeltest, sest need sisaldavad meetodeid aja ja signaalide levimise kiiruse omavahelise sõltuvuse kirjeldamiseks. Leidub kaks määravat operaatorit: tõkestav (=) ja lubav (
module main;
  initial
    begin
      $display("Hello world!");
      $finish;
    end
endmodule


Lihtne näide kahest trigerist:

```verilog
module toplevel(clock,reset);
  input clock;
  input reset;
 
  reg triger1;
  reg triger2;
 
  always @ (posedge reset or posedge clock)
    if (reset)
      begin
        triger1 <= 0;
        triger2 <= 1;
      end
    else
      begin
        triger1 <= triger2;
        triger2 <= triger1;
      end
endmodule
```


„
...
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


*Always* (alati) klausel kirjeldab teist kasutusmeetodit. See tähendab, et see teostub ükskõik millal ükski loendis olevatest olemitest (**b** või **e**) muutub. Kui üks nendest muutub, määratakse **a**-le otsekohe uus väärtus, ning vastavalt tõkestavale määrangule määratakse **b**-le hiljem omakorda uus väärtus (võttes arvesse **a** uue väärtuse). Pärast viieühikulist viivitust määratakse **c**-le **b** väärtus ning **c^e** väärtus talletatakse nähtamatus mäluosas. Seejärel peale omakorda kuueühikulist viivitust määratakse **d**-le talletatud **c^e** väärtus. 

Protsessisiseselt juhitavad signaalid [*initial* (algus) või *always* plokk] peavad olema registri (*reg*) tüüpi. Protsessiväliselt juhitavad signaalid peavad olema ühenduse (*wire*) tüüpi. Võtmesõna *reg* ei tähenda ilmtingimata riistvaralist registrit.

## Konstantide definitsioonid
Verilog lubab lisada konstantide definitsioonidele parameetreid laiuse kirjeldamiseks. Tavaline süntaks näeb välja selline:

'

Näited:
*12'h123 – Kuueteistkümnendkoodis 123 (kasutades 12 bitti)
*20'd44 – Kümnendkoodis 44 (kasutades 20 bitti – laiend 0 on automaatne)
*4'b1010 – Kahendkoodis 1010 (kasutades 4 bitti)
*6'o77 – Kaheksandkoodis 77 (kasutades 6 bitti)

## Sünteesitavad konstruktsioonid
Verilogis on käske, millel pole analoogiat reaalse riistvaraga, nagu näiteks $display. Järelikult ei saa kasutada suurt osa keelest riistvara kirjeldamiseks. Järgnevalt on toodud klassikalised näited keele alamhulkadest, millele leidub otsene vaste reaalsete väratitega.

Näited multipleksoritest – kolm võimalust sama asja tegemiseks.

```verilog
// Esimene näide kasutab pidevat käsklust
wire out;
assign out = sel ? a : b;
 
// Teine näide kasutab protseduuri
// sama asja saavutamiseks.
 
reg out;
always @(a or b or sel)
  begin
    case(sel)
      1'b0: out = b;
      1'b1: out = a;
    endcase
  end
 
// Viimasena võib kasutada protsessistruktuuris ''if/else'' tingimusi.
reg out;
always @(a or b or sel)
  if (sel)
    out = a;
  else
    out = b;
```


## Operaatorid

Märkus: Need operaatorid pole tähtsuse järjekorras.

## Neljaväärtuseline loogika
IEEE 1364 liides määrab ära neljaväärtuselise loogika, millel on neli erinevat olekut: 0, 1, Z (kõrge impedants) ja X (tundmatu loogikaväärtus). VHDL-i jaoks leidub veel omakorda üheksatasemeline liides IEEE 1164 mitmeväärtuseliseks loogikaks.

## Süsteemikäsud

Süsteemikäsud on olemas lihtsamate sisend-väljundfunktsioonide ja erinevate koostemõõtmete käsitlemiseks. Kõik süsteemikäsud algavad märgiga $, et eristada neid kasutajakäskudest ja -funktsioonidest. Siinkohal on toodud väike nimekiri enimkasutatud käskudest, mis pole kindlasti kõikehõlmav.

*$display – Väljastab ekraanile rea, millele järgneb kohe uus rida.
*$write – Kirjutab ekraanile rea, millele ei järgne uut rida.
*$swrite – Väljastab muutujale rea, millele ei järgne uut rida.
*$sscanf – Loeb muutujast vormindatud sõne. (*Verilog-2001)
*$fopen – Avab käsitletava faili (kirjutamine või lugemine).
*$fdisplay – Kirjutab faili rea, millele järgneb kohe uus rida.
*$fwrite – Kirjutab faili rea, millele ei järgne uut rida.
*$fscanf – Loeb failist vormindatud sõne. (*Verilog-2001)
*$fclose – Sulgeb ja võimaldab kasutuseks lahtise käsitletava faili.
*$readmemh – Loeb kuueteistkümnendfaili sisu mälumassiivi.
*$readmemb – Loeb binaarfaili sisu mälumassiivi.
*$monitor – Väljastab kõik väärtuseid muutnud loetletud muutujad.
*$time – Hetkel simuleeritava aja väärtus.
*$dumpfile – Sätib VCD (inglise keeles *Value change dump*) vormingu väljundfaili nime.
*$dumpvars – Võimaldab ja eemaldab muutujad.
*$dumpports – Võimaldab ja eemaldab muutujad laiendatud VCD vormingus.
*$random – Tagastab juhusliku väärtuse.

## Viited

* Navabi, Zainalabedin *"Verilog Digital System Design"*, ilmumisaasta 2005, kirjastus: McGraw-Hill, ISBN 9780071588928
* Janick Bergerdon, *"Designing Digital Computer Systems With Verilog*, ilmumisaasta 2007, kirjastus: Cambridge University Press, ISBN 9780511261664