În cadrul blocurilor initial și always atribuirile pot fi de două feluri, cu semantici diferite:

  • Atribuiri blocante: = - sunt folosite pentru descrierea logicii combinaționale (porți logice). Atribuirile blocante sunt interpretate ca executându-se secvențial, semantica fiind identică cu cea din limbajele de programare procedurale.
// Initial a = 0 si b = 1.
 
a = b;  // a ia valoarea lui b.
b = a;  // b ia valoarea lui a.
 
// Final a = 1 si b = 1.

* Atribuiri non-blocante: <= - sunt folosite pentru descrierea logicii secvențiale. Atribuirile non-blocante sunt interpretate ca executându-se în paralel, procesul având doi pași:

  1. Partea dreaptă a tuturor atribuirilor este evaluată.
  2. Valorile determinate la pasul 1 sunt asignate variabilelor din partea stângă.
// Initial a = 0 si b = 1.
 
a <= b;  // Valoarea lui b este evaluata, dar nu atribuita lui a.
b <= a;  // Valoarea lui a este evaluata, dar nu atribuita lui b.
 
// Lui a si b le sunt atribuite valorile in acelasi timp.
// Final a = 1 si b = 0.

În cadrul blocurilor always folosite pentru descrierea logicii secvențiale trebuie folosite doar atribuiri non-blocante. Pentru a implementa acest tip de circuite logice, se folosesc blocuri always ce se execută în funcție de semnalul de ceas.

always @(posedge clk) begin
    a <= b;
end

În cadrul blocurilor always ce descriu logică combinațională se pot folosi doar atribuiri blocante. Blocurile pentru logica combinațională se execută la schimbarea unuia dintre semnalele citite în cadrul acestora.

always @(B or C) begin // ASA NU !
    a = b & c;         // B != b și C != c
end

Pentru a evita greșeli de omitere ale unor semnale din listă putem folosi următoarea sintaxă, în care * indică toate semnalele care vor fi citite în cadrul blocului.

always @(*) begin
    a = b & c;
end

În Verilog putem declara variabile de tipul reg (registru) si wire (fir). Atunci când se fac atribuiri avem următoarele restricții:

  • Pe o variabilă de tip wire nu putem face decât atribuiri continue (assign). Acestea trebuie să fie în afara blocurilor always sau initial. Valoarea atribuită poate fi o constantă, o expresie, valoarea unui fir sau a unui registru.
  • Pe o variabilă de tip reg nu putem face decât atribuiri blocante/non-blocante. Acestea trebuie să fie în interiorul unui bloc initial sau always. Valoarea atribuită poate fi o constantă, o expresie, valoarea unui fir sau a unui registru.

soc/laboratoare/02/tipatribuiri.txt · Last modified: 2026/03/03 10:50 by alexandru.ionita04
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0