Jeg læste denne side http://www.asic-world.com/verilog/verilog_one_day3.html da jeg stødte på følgende:
Vi er normalt nødt til at nulstille flip-flops, så hver gang uret laver overgang fra 0 til 1 (posedge), kontrollerer vi, om reset er hævdet (synkron reset), så fortsætter vi med normal logik. Hvis vi ser nøje, ser vi, at i tilfælde af kombinationslogik havde vi “=” til opgave, og for den sekventielle blok havde vi operatøren “< =”. Nå, “=” blokerer tildeling, og “< =” er ikke-blokeringstildeling. “=” udfører kode sekventielt inde i en start / slutning, mens ikke-blokering “< =” udføres parallelt.
Jeg var ret sikker på, at ikke-blokerende opgaver var sekventielle, mens blokerende opgaver var parallelle. Når alt kommer til alt kan du lave blokerende opgaver med tildelingserklæringer uden for altid blokke, og de kører alle parallelt. Er dette en fejltagelse, eller er adfærden anderledes i en altid blokering? Og hvis opførslen er forskellig inden for en altid blokering, kan opgaver, der ikke blokeres, udføres uden for en altid blokering?
Svar
var temmelig sikker på, at ikke-blokerende tildelinger var sekventielle, mens blokerende opgaver var parallelle.
Blokerende opgave udføres “i serie”, fordi en blokerende opgave blokerer udførelse af den næste sætning, indtil den er afsluttet. Derfor kan resultaterne af den næste erklæring afhænge af, at den første afsluttes.
Ikke-blokerende opgave udføres parallelt, fordi den beskriver tildelinger, som alle finder sted på samme tid. Resultatet af en erklæring på 2. linje afhænger ikke af resultaterne af udsagnet på 1. linje. I stedet udføres 2. linje som om 1. linje endnu ikke var sket.
Kommentarer
Svar
Tildelingserklæringer er hverken “blokerende” eller “ikke-blokerende”, de er “kontinuerlige”. Outputtet fra en tildelingserklæring er altid lig med den specificerede funktion af dens “indgange.” Blokerende “og” ikke-blokerende “tildelinger findes kun inden for altid blokke.
En blokerende tildeling har indflydelse, straks den behandles. En ikke-blokerende tildeling finder sted ved afslutningen af behandlingen af den aktuelle “tidsdelta”.
altid kan blokke bruges til at modellere enten kombinatorisk eller sekventiel logik (systemverilog har altid_kom og altid_ff for at gøre dette eksplicit). kombinatorisk logik er det normalt mere effektivt at bruge = men det betyder typisk ikke noget.
Når du modellerer sekventiel logik (f.eks. altid @ (posedge clk)) bruger du normalt ikke-blokerende opgaver. Dette giver dig mulighed for at afskrække “tilstand efter urkanten” i form af “tilstanden før urkanten”.
Det er undertiden nyttigt at bruge blokerende tildelinger i sekventielle blokke altid som “variabler”. Hvis du gør dette så der er to nøgleregler at huske på.
- Få ikke adgang til a reg, der er indstillet med blokerende tildelinger inde i en sekventiel blokering altid fra uden for den altid blok, den er tildelt i.
- Bland ikke blokerende og ikke-blokerende tildelinger til den samme reg.
At bryde disse regler vil sandsynligvis resultere i syntesesvigt og / eller adfærdsmæssige forskelle mellem simulering og syntese.
Kommentarer
- ” ” Få ikke adgang til en reg, der er indstillet med blokerende tildelinger inde i en sekventiel, bloker altid uden for den, bloker altid den er tildelt. ” ” Kan du venligst forklare det?
- Forskellige sekventielle blokke har altid ikke en defineret bestille. Så at læse en ” reg ” indstillet med en blokerende vurdering i en altid blok fra en anden altid blok vil føre til uforudsigelig opførsel.
- Og selvom det ser ud til at fungere i simulering, skal et synteseværktøj se på det og sige ” nej “. Jeg bruger lokale regs til de mellemliggende vars og sørger for, at de altid tildeles på hvert ur, før de læses, så ingen ‘ lager ‘ er underforstået.
- IIRC i det mindste i kvartal betragtes det kun som en advarsel ikke som en fejl.
- Du bør ikke bruge ikke-blokeringstildeling i kombinationslogik, det kan låse op simuleringen. Se dette svar for flere detaljer: electronics.stackexchange.com/a/506047/238188
Svar
Udtrykket Blokeringstildeling forvirrer folk, fordi ordet blokering ser ud til at antyde en tidssekventiel logik. Men i syntetiseret logik betyder det ikke dette , fordi alt fungerer i parallel .
Måske ville et mindre forvirrende udtryk være øjeblikkelig tildeling som stadig ville differentiere de mellemliggende resultater af kombinationslogik fra input til ikke-gennemsigtige hukommelseselementer (for eksempel urede registre), som kan have forsinket tildeling .
Fra et legalistisk synspunkt fungerer det hele meget pænt. Du kan faktisk betragte =
som en blokerende (tidssekventiel) operation, selv inden for always_comb
sekvenser. Men sondringen mellem tidssekventiel og parallel gør absolut ingen forskel i dette tilfælde, fordi always_comb
-blokken er defineret til at gentage, indtil instruktionssekvensen konvergerer i en stabil tilstand – hvilket er præcis, hvad hardwarekredsløbet vil gøre (hvis det opfylder timingkravene).
Den syntetiserbare delmængde af Verilog (og især SystemVerilog) er ekstremt enkel og nem at bruge – når du kender de nødvendige idiomer. Du skal bare komme forbi den kloge brug af terminologi, der er knyttet til de såkaldte adfærdsmæssige -elementer på sproget.
Kommentarer
- I adfærdsmæssige kodningsstile ( sammenlignet med RTL ) kan forskellen mellem blokering og ikke-blokering være relevant. I nogle tilfælde kan synteseværktøjet muligvis udlede funktionelt ækvivalent RTL fra design af adfærdskomponenter.
- Selvfølgelig er proceduremæssig tilstand af SystemVerilog, især anvendelig til
initial
udsagn inden forprogram
blokke, bruger (tidssekventiel) blokerende opgave udelukkende. Dette er nyttigt til testbench -design, men generelt ikke til RTL-specifikation.
assign
udsagn forekommer uden for altid blokke og bruges generelt til at beskrive til kombinatorisk (ikke-låst ) logik (mens den altid blokerer, med nogle undtagelser, beskriver sekventiel logik). AFAIK,assign
udsagn udfører altid ” parallelt ” når deres LHS har en værdiændring .