Blocking versus non-blocking assignment: timing, volgorde en gebruik vergeleken
Beide zijn toekenningen die in een always-blok van Verilog worden gebruikt, maar ze verschillen in het moment waarop de linkerkant verandert. Een blocking assignment (=) werkt de linkerkant bij op het moment dat die regel wordt uitgevoerd, en de volgende regel gebruikt de nieuwe waarde. Een non-blocking assignment (<=) evalueert eerst alle rechterkanten van hetzelfde tijdstip en werkt daarna alle linkerkanten tegelijk bij. De basisrichtlijn is <= voor sequentiële schakelingen die op de klok werken en = voor always-blokken met combinatorische logica.
| Kenmerk | Blocking assignment (=) | Non-blocking assignment (<=) |
|---|---|---|
| Notatie | a = b; | a <= b; |
| Moment waarop de linkerkant wordt bijgewerkt | Direct wanneer die regel wordt uitgevoerd | Nadat alle rechterkanten van hetzelfde tijdstip zijn geëvalueerd, allemaal tegelijk |
| Waarde zichtbaar vanaf de volgende regel | De nieuwe, bijgewerkte waarde | De oude waarde van vóór de update |
| Afhankelijkheid van de volgorde | Ja. Regels omwisselen verandert het resultaat | Vrijwel niet. Maar bij twee toekenningen aan dezelfde variabele blijft de laatste over |
| Bijbehorend schakelingsgedrag | Combinatorische logica die tussenwaarden van boven naar beneden berekent | Flip-flops die op de klokflank allemaal tegelijk een waarde inklokken |
| Belangrijkste gebruik | always @(*) voor combinatorische logica, procedures in testbenches | always @(posedge clk) voor sequentiële schakelingen die op de klok werken |
| Tweetraps schuifregister (klokgestuurd blok) | Bij q1 = d; q2 = q1; krijgt q2 op dezelfde flank ook d, en is er slechts één trap vertraging | Bij q1 <= d; q2 <= q1; krijgt q2 de waarde van q1 van vóór de flank, en zijn er twee trappen |
| Waarden omwisselen (klokgestuurd blok) | Bij a = b; b = a; krijgen a en b dezelfde waarde | Bij a <= b; b <= a; worden a en b omgewisseld |
| Tussen meerdere always-blokken | Tussen blokken die op dezelfde flank werken ontstaan gemakkelijk races, waarbij het resultaat afhangt van de uitvoeringsvolgorde | De rechterkanten worden eerst allemaal geëvalueerd, dus races ontstaan minder snel |
| Bij verkeerd gebruik | In sequentiële schakelingen hangt het resultaat af van de uitvoeringsvolgorde van de blokken en kan het gedrag afwijken van de gesynthetiseerde schakeling | In combinatorische logica worden tussenwaarden nog oud gelezen, waardoor de simulatie kan afwijken van de gesynthetiseerde schakeling of onnodig opnieuw wordt uitgevoerd |
De getalswaarden zijn typische ordegroottes en variëren per procesgeneratie en product.