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.

KenmerkBlocking assignment (=)Non-blocking assignment (<=)
Notatiea = b;a <= b;
Moment waarop de linkerkant wordt bijgewerktDirect wanneer die regel wordt uitgevoerdNadat alle rechterkanten van hetzelfde tijdstip zijn geëvalueerd, allemaal tegelijk
Waarde zichtbaar vanaf de volgende regelDe nieuwe, bijgewerkte waardeDe oude waarde van vóór de update
Afhankelijkheid van de volgordeJa. Regels omwisselen verandert het resultaatVrijwel niet. Maar bij twee toekenningen aan dezelfde variabele blijft de laatste over
Bijbehorend schakelingsgedragCombinatorische logica die tussenwaarden van boven naar beneden berekentFlip-flops die op de klokflank allemaal tegelijk een waarde inklokken
Belangrijkste gebruikalways @(*) voor combinatorische logica, procedures in testbenchesalways @(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 vertragingBij 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 waardeBij a <= b; b <= a; worden a en b omgewisseld
Tussen meerdere always-blokkenTussen blokken die op dezelfde flank werken ontstaan gemakkelijk races, waarbij het resultaat afhangt van de uitvoeringsvolgordeDe rechterkanten worden eerst allemaal geëvalueerd, dus races ontstaan minder snel
Bij verkeerd gebruikIn sequentiële schakelingen hangt het resultaat af van de uitvoeringsvolgorde van de blokken en kan het gedrag afwijken van de gesynthetiseerde schakelingIn 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.

Wanneer welke variant?

Blocking assignment (=)
Bij het achtereenvolgens berekenen van tussenwaarden in always @(*) voor combinatorische logica. Bij het stap voor stap beschrijven van procedures in een testbench.
Non-blocking assignment (<=)
Bij het beschrijven van klokgestuurde flip-flops, zoals in always @(posedge clk). Bijwerken van registers, tellers en de toestand van toestandsmachines.
Niet mengen
Meng = en <= niet binnen één always-blok, en ken dezelfde variabele niet toe vanuit meerdere always-blokken. In SystemVerilog kan de bedoeling met always_ff en always_comb aan de tools worden doorgegeven.

Veelgestelde vragen

Wat gebeurt er als je blocking assignment in een sequentiële schakeling gebruikt?

Afhankelijk van de volgorde van de regels wordt een waarde die op dezelfde flank is bijgewerkt direct doorgegeven aan de volgende regel, en ontstaat een schakeling met minder trappen dan bedoeld. Ook kunnen races ontstaan met andere always-blokken op dezelfde klok, waarbij het resultaat afhangt van de uitvoeringsvolgorde; dat is een oorzaak van verschillen tussen de simulatie en de gesynthetiseerde schakeling.

Waarom worden de waarden omgewisseld als je met non-blocking assignment a <= b; b <= a; schrijft?

Omdat beide rechterkanten eerst met hun oude waarden worden geëvalueerd en daarna de linkerkanten tegelijk worden bijgewerkt. Het gedrag is hetzelfde als dat van een schakeling waarin de uitgangen van twee flip-flops met elkaars ingang zijn verbonden.

Welke moet je in een testbench gebruiken?

Voor delen die procedures stap voor stap beschrijven is blocking assignment prima. Maar als de ingangen van de schakeling op hetzelfde tijdstip als de klokflank veranderen, hangt het van de uitvoeringsvolgorde af of de oude of de nieuwe waarde wordt ingeklokt; verander ze daarom iets na de flank of met non-blocking assignment.

Test uw begrip

Welke uitspraak over de werking van de niet-blokkerende toekenning (<=) in Verilog is juist?

  1. AHet linkerlid wordt direct bijgewerkt en de nieuwe waarde wordt in de volgende regel gebruikt
  2. BEerst worden alle rechterleden van hetzelfde tijdstip geëvalueerd en daarna worden de linkerleden gezamenlijk bijgewerkt
  3. CHet resultaat van de toekenning wordt weggegooid en er verandert niets
Antwoord en toelichting tonen

Antwoord: B. Eerst worden alle rechterleden van hetzelfde tijdstip geëvalueerd en daarna worden de linkerleden gezamenlijk bijgewerkt

Bij niet-blokkerende toekenning worden op de klokflank eerst alle rechterleden van <= met de oude waarden geëvalueerd, en daarna worden de linkerleden tegelijk herschreven. Dit komt overeen met de werking van een echte schakeling, waarin veel flipflops die op dezelfde klok werken tegelijk de waarde vlak vóór de flank overnemen. Voor de beschrijving van sequentiële schakelingen die op de klok werken, geldt daarom als basisregel niet-blokkerende toekenning te gebruiken.

Welke algemene richtlijn voor het onderscheiden van soorten toekenning in Verilog is juist?

  1. AOveral alleen blokkerende toekenning (=) gebruiken
  2. BVoor sequentiële schakelingen op de klok niet-blokkerende toekenning (<=) gebruiken en voor always van combinatorische schakelingen blokkerende toekenning (=)
  3. CIn één always-blok beide soorten willekeurig door elkaar gebruiken
Antwoord en toelichting tonen

Antwoord: B. Voor sequentiële schakelingen op de klok niet-blokkerende toekenning (<=) gebruiken en voor always van combinatorische schakelingen blokkerende toekenning (=)

Als een sequentiële schakeling met niet-blokkerende toekenning wordt geschreven, komt dat overeen met de werking van een schakeling waarin alle flipflops tegelijk de waarde overnemen, en hangt het resultaat niet af van de volgorde van beschrijving of van de uitvoeringsvolgorde met andere always-blokken. Bij combinatorische schakelingen is het natuurlijk om van boven naar beneden tussenwaarden te berekenen, dus blokkerende toekenning wordt gebruikt. Ook is het belangrijk beide niet in één always-blok te mengen.

Als in een testbench de ingangen van de schakeling met blokkerende toekenning op hetzelfde tijdstip als de stijgende klokflank worden gewijzigd, kan een probleem ontstaan. Welke combinatie van de belangrijkste reden en de tegenmaatregel is juist?

  1. AOmdat het afhangt van de uitvoeringsvolgorde of de schakeling de waarde van vóór of na de verandering overneemt (race). De ingangen iets verschoven van de klokflank of met niet-blokkerende toekenning wijzigen
  2. BOmdat de klokfrequentie automatisch daalt. De klok sneller maken
  3. COmdat blokkerende toekenning in een testbench niet kan worden gebruikt. Alles met assign-statements doen
Antwoord en toelichting tonen

Antwoord: A. Omdat het afhangt van de uitvoeringsvolgorde of de schakeling de waarde van vóór of na de verandering overneemt (race). De ingangen iets verschoven van de klokflank of met niet-blokkerende toekenning wijzigen

Als op hetzelfde tijdstip de bewerking waarmee de testbench de ingangen herschrijft en de bewerking waarmee de flipflops van de schakeling de ingangen overnemen plaatsvinden, kan de overgenomen waarde de oude of de nieuwe waarde zijn, afhankelijk van welke de simulator als eerste uitvoert. Dit is een race in de simulatie, en het resultaat kan per simulator verschillen. Men voorkomt het door de ingangen bij de dalende flank te wijzigen, ze iets te vertragen of niet-blokkerende toekenning of de clocking blocks van SystemVerilog te gebruiken.

  1. In de bovenstaande beschrijving waren vlak vóór de stijgende klokflank a=0 en b=1. Wat zijn de waarden van a en b na de stijgende flank?
  2. Bedoeld als een tweetraps schuifregister is het zoals hierboven geschreven met blokkerende toekenning (=). Welk probleem treedt op?
  3. Dit is zoals hierboven geschreven als een combinatorische schakeling bedoeld. Welk mogelijk probleem is juist?

Oefenvragen over Hardwarebeschrijvingstalen en verificatie

Belangrijke termen uitgelegd

Blocking assignment
De toewijzing met '=' in Verilog. De linkerzijde wordt direct bijgewerkt en de volgende regel gebruikt de nieuwe waarde. Gebruikt in always-blokken voor combinatorische logica en in testbenches.
Non-blocking assignment
Toewijzing met "<=" in Verilog. Alle rechterzijden van hetzelfde tijdstip worden eerst geëvalueerd, waarna de linkerzijden samen worden bijgewerkt. Komt overeen met het gedrag van flipflops en wordt dus voor sequentiële schakelingen gebruikt.
Sensitivity list
Reeks signalen achter always in @( ) in Verilog die bepaalt wanneer het blok wordt uitgevoerd. Bij een combinatorische schakeling leidt een vergeten signaal tot een verschil tussen simulatie en schakeling.
Verilog
Hardwarebeschrijvingstaal die veel wordt gebruikt voor ontwerp en verificatie van digitale circuits. Circuits worden per module geschreven en het gedrag wordt met assign en always beschreven.

Verwante vergelijkingen