SystemVerilog
Module
Limabjul Verilog este structurat pe module. Fiecare modul reprezintă un circuit care implementează o anume funcție. Spre exemplu un modul poate reprezenta un sumator, adică un circuit care are două intrări ce specifică cei doi operanzi și o ieșire ce reprezintă rezultatul adunării. Conținutul modulului reprezintă descrierea (structurală sau comportamentală) a porților care calculeaza suma celor două intrări. Prin urmare, definiția unui modul Verilog are două părți:
- interfață - lista tuturor porturilor de intrare și ieșire ale circuitului, specificate prin nume și dimensiune;
- implementare - descrierea efectivă a circuitului care se folosește de valorile de intrare pentru a calcula valorile de ieșire;
Interfața modulului Adder este prezentată mai jos. Observație: Ca și în sistemul numeral zecimal, unde suma a două numere de n cifre are nevoie de n + 1 cifre (9 + 9 = 18), și în sistemul binar, suma a două numere de n biți va fi pe n + 1 biți.
module Adder(
output [4:0] out,
input [3:0] in0,
input [3:0] in1
);
//implementare
endmodule
Cuvintele cheie module și endmodule sunt folosite pentru a începe și a încheia definirea unui modul. Imediat după cuvântul cheie module urmează numele modulului.
Convenție: Numele unui modul va începe cu literă mare.
După definirea numelui modulului, urmează lista de porturi, plasată între paranteze rotunde și separate prin virgulă. Cuvintele cheie acceptate sunt output (reprezentând un port de ieșire), input (reprezentând un port de intrare) și inout (reprezentând un port bidirecțional).
Sfat: Se evită utilizarea semnalelor de tip inout. O alternativă acceptată este definirea a două porturi, unul de intrare și unul de ieșire, cu nume similare (ex: data_in și data_out).
Convenție: Întâi se definesc ieșirile, apoi intrările unui modul.
Convenție: Porturile unui modul se scriu unul sub altul, pe câte o linie, aliniate cu un tab la dreapta față de cuvântul cheie module.
După tipul portului, urmează dimensiunea acestiua, specificată în indecșii biților, unde cel mai puțin semnificativ bit are indexul 0. Spre exemplu, un semnal de 4 biți va avea următoarea specificație [3:0] (bitul cel mai semnificativ are indexul 3, cel mai puțin semnificativ 0, în total 4 biți). Observație: Semnalelor de un bit le lipsește specificația de dimensiune:
input oneBitSignal,
După lista de porturi aflată între paranteze, definirea interfeței se termină cu caracterul ;.
Observație: Există module nesintetizabile (care nu au corespondent in porți logice), care sunt folosite ca "programe" de test în medii de simulare și se numesc module de test. Aceste module nu au porturi de intrare și ieșire și sunt utilizate doar pentru a da valori porturilor de intrare ale modulului care se testează, și de a verifica valorile de pe porturile de ieșire ale acestuia. În cazul acestor module, lista de porturi și parantezele rotunde aferente lipsesc:
module TestModule;
//implementare
endmodule