Forskjell mellom blokkering og ikke-blokkerende oppgave Verilog

Jeg leste denne siden http://www.asic-world.com/verilog/verilog_one_day3.html da jeg kom over følgende:

Vi må normalt tilbakestille flip-flops, og dermed hver gang klokken gjør overgang fra 0 til 1 (posedge), sjekker vi om tilbakestilling er hevdet (synkron tilbakestilling), så fortsetter vi med normal logikk. Hvis vi ser nøye, ser vi at når det gjelder kombinasjonslogikk hadde vi «=» for tildeling, og for den sekvensielle blokken hadde vi operatøren «< =». Vel, «=» blokkerer tildeling, og «< =» er ikke-blokkerende oppgave. «=» utfører kode sekvensielt i begynnelsen / slutten, mens ikke-blokkering «< =» utføres parallelt.

Jeg var ganske sikker på at ikke-blokkerende oppgaver var sekvensielle mens blokkeringsoppdrag var parallelle. Tross alt kan du gjøre blokkeringsoppgaver med tilordningsuttalelser utenfor alltid blokker, og de kjører alle parallelt. Er dette en feil, eller er oppførselen annerledes i en alltid blokk? Og hvis oppførselen ER forskjellig i en alltid blokk, kan ikke oppgaver som ikke blokkeres gjøres utenfor en alltid blokk?

Svar

var ganske sikker på at ikke-blokkerende oppgaver var sekvensielle mens blokkeringsoppdrag var parallelle.

Blokkering av oppdrag utføres «i serie» fordi en blokkerende oppgave blokkerer utførelse av neste uttalelse til den er fullført. Derfor kan resultatene av neste uttalelse avhenge av at den første blir fullført.

Ikke-blokkerende oppgave utføres parallelt fordi den beskriver oppgaver som alle skjer samtidig. Resultatet av en uttalelse på 2. linje vil ikke avhenge av resultatene av uttalelsen på første linje. I stedet vil andre linje kjøres som om ikke første linje hadde skjedd ennå.

Kommentarer

  • Hva med tilordningsuttalelser? Er de bare i en hel klasse for seg selv?
  • Ja, assign utsagn forekommer utenfor alltid blokker og brukes vanligvis til å beskrive til kombinatoriske (ulåst ) logikk (mens det alltid er blokker, med noen unntak, beskriver sekvensiell logikk). AFAIK, assign utsagn utfører alltid » parallelt » når LHS har en verdiendring .
  • Ok … Jeg ‘ Jeg begynner å få inntrykk av at Verilog bare ikke er ‘ t mest elegant designet språk. Dette blir som å lære C var.
  • Verilog ble designet for å » beskrive » maskinvare som allerede eksisterer. Å bruke det som et språk for å designe (syntetisere) maskinvare er et hack.
  • hvis Verilog » som å lære C » er et problem, ta en titt på VHDL. Noen mennesker har ganske sterke preferanser for den ene eller den andre. For noen er VHDL bare for ordentlig. For meg er det ‘ mye bedre gjennomtenkt. (signal / variabel tildeling semantikk er mye klarere enn for eksempel blokkering / ikke). stackoverflow.com/questions/13954193/… og sigasi .com / content / vhdls-crown-Jewel Du foretrekker det eller hater det. Men det er ‘ det er verdt å se.

Svar

Tildelingsuttalelser er verken «blokkerende» eller «ikke-blokkerende», de er «kontinuerlige». Utdataene fra en tildelingsuttalelse er alltid lik den spesifiserte funksjonen til «s innganger.» Blokkering «og» ikke-blokkerende «tildelinger eksisterer bare innenfor alltid blokker.

En blokkeringstilordning har innvirkning umiddelbart når den behandles. En ikke-blokkerende oppgave finner sted ved slutten av behandlingen av den nåværende «tidsdeltaet».

alltid kan blokker brukes til å modellere enten kombinatorisk eller sekvensiell logikk (systemverilog har alltid_kom og alltid_ff for å gjøre dette eksplisitt). kombinatorisk logikk er det vanligvis mer effektivt å bruke = men det betyr egentlig ikke noe.

Når du modellerer sekvensiell logikk (f.eks. alltid @ (posedge clk)) bruker du vanligvis ikke-blokkerende påstander. Dette gjør at du avskrekke «tilstanden etter klokkekanten» i form av «tilstanden før klokkekanten».

Det er noen ganger nyttig å bruke blokkeringsoppgaver i sekvensielle blokker som «variabler». Hvis du gjør dette så det er to viktige regler å huske på.

  1. Ikke få tilgang til a reg som er satt med blokkerende tildelinger i en sekvensiell blokkering alltid fra utenfor alltid blokken den er tildelt i.
  2. Ikke bland blokkerende og ikke-blokkerende oppgaver til samme reg.

Å bryte disse reglene vil sannsynligvis resultere i syntesesvikt og / eller atferdsforskjeller mellom simulering og syntese.

Kommentarer

  • » » Ikke få tilgang til et reg som er satt med blokkerende tildelinger i en sekvensiell blokker alltid utenfor den blokker alltid den er tildelt. » » Kan du forklare det?
  • Forskjellige sekvensielle blokker har ikke en definert rekkefølge. Så å lese en » reg » satt med en blokkerende vurdering i en alltid blokk fra en annen alltid blokk vil føre til uforutsigbar oppførsel.
  • Og selv om det ser ut til å fungere i simulering, bør et synteseverktøy se på det og si » nope «. Jeg bruker lokale regs for de mellomliggende varene, og sørger for at de alltid tildeles hver klokke før de blir lest, slik at ingen ‘ lagring ‘ er underforstått.
  • IIRC i det minste i kvartal regnes det bare som en advarsel ikke som en feil.
  • Du bør ikke bruke ikke-blokkerende tildeling i kombinasjonslogikk, den kan låse opp simuleringen. For mer informasjon, se dette svaret: electronics.stackexchange.com/a/506047/238188

Svar

Begrepet Blokkeringsoppgave forvirrer folk fordi ordet blokkering ser ut til å antyde tidssekvensiell logikk. Men i syntetisert logikk betyr det ikke dette , fordi alt fungerer i parallell .

Kanskje et mindre forvirrende begrep ville være umiddelbar oppgave som fortsatt vil skille mellomresultatene av kombinasjonslogikk fra innganger til ikke-gjennomsiktige minneelementer (for eksempel klokkede registre), som kan ha forsinket tildeling .

Fra et juridisk synspunkt fungerer det veldig bra. Du kan faktisk betrakte = for å være en blokkering (tidssekvensiell) operasjon selv innenfor always_comb sekvenser. Imidlertid gjør skillet mellom tidssekvensiell og parallell absolutt ingen forskjell i dette tilfellet fordi always_comb -blokken er definert til å gjenta til instruksjonssekvensen konvergerer i en stabil tilstand – som er nøyaktig hva maskinvarekretsene vil gjøre (hvis den oppfyller timingkravene.) Verilog (og spesielt SystemVerilog) er ekstremt enkel og enkel å bruke – når du først vet de nødvendige uttrykkene. Du må bare komme forbi den smarte bruken av terminologi knyttet til de såkalte atferdsmessige elementene på språket.

Kommentarer

  • I atferdsmessige kodestiler ( sammenlignet med RTL ) kan skillet mellom blokkering og ikke-blokkering være relevant. I noen tilfeller kan synteseverktøyet være i stand til å utlede funksjonelt ekvivalent RTL fra atferdskomponentdesign.
  • Selvfølgelig er prosessuelle modus for SystemVerilog, spesielt anvendelig for initial utsagn i program blokker, bruker (tidssekvensiell) blokkeringsoppgave utelukkende. Dette er nyttig for testbenk -design, men generelt ikke for RTL-spesifikasjon.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *