Jeg bruker Verilog-språket og Zedboard som målkort.
Så vidt jeg vet , for-sløyfen kan syntetiseres, og synteseverktøyet oversetter for-sløyfen som en sekvens av dupliserte instruksjoner som sløyfeutrulling.
For eksempel
for ( i = 0; i < 4; i=i+1) begin mem[i] = i; end will be translated to mem[0] = 0; mem[1] = 1; mem[2] = 2; mem[3] = 3;
Derfor, så vidt jeg vet, kan for-loop brukes hvis ressursen er tilgjengelig for å utlede flere men samme målrettede porter.
Det ser imidlertid ut til at genereringen i Verilog kan brukes til å ikke bare antyde flere forekomster, men også flere instruksjoner som for for loop.
Jeg forstår at genereringen bare kan antyde flere forekomster av modulen og for loop kan ikke brukes for det formålet.
Hva er så forskjellen mellom generer + for loop og bare for loop? Jeg tror begge fungerer som loop utrulling skjønt. Er det noen merkbar forskjell? Hvis det ikke er noen forskjell, hvilken er det å foretrekke kodestil for å indusere løkkeutrulling?
Kommentarer
- Bare for klarhetens skyld, er det ' s: Jeg antyder, du slutter. f.eks. du antyder en RAM i Verilog / VHDL, syntese programvaren utleder at RAM fra din Verilog / VHDL. Svært vanlig feil, verdt å lære.
Svar
Verilog for-loops er perfekt syntetiserbare under visse forhold:
- Du kan bruke en hvilken som helst prosedyreerklæring i en løkke (f.eks. hvis-annet).
- antall løkker må være forhåndsbestemt .
- Det begrensende uttrykket må være en sammenligning mellom sløyfevariabelen og enten en konstant eller en parameter.
- Trinntildelingen må øke lønnsverdien med en konstant mengde.
- Du kan tilordne en annen verdi til den samme variabelen i hver sløyfe (for eksempel å beregne en indeks fra sløyfevariabelen).
- For synteseformål evalueres sløyfen på null tid – dvs. hvis du prøvde å lage en teller, ville du bare se den endelige verdien.
De samme reglene gjelder om du bruker en for-loop i en prosedyreblokk, eller i en genereringsblokk.
Når du er ferdig i en prosedyreblokk, initial
og always
, kan du bruke en for loop for å endre elementer i en matrise (nøyaktig som eksemplet ditt), eller du kan endre den samme verdien flere ganger, for eksempel:
for (idx = 0; idx < 4; idx=idx+1) begin a = a + b[idx]; c = c + 2; //You can change more than one variable in a for loop end
I det eksemplet, den resulterende maskinvaren vil være en kjede av tillegg, som summerer verdiene fra fire matriseindekser.
Det viktigste er at du ikke kan opprette nye variabler eller moduler i en prosedyre for loop. Denne regelen gjelder generelt for prosessuelle blokker, ikke bare for sløyfer (dvs. du kan ikke erklære en variabel i en prosessblokk).
Generere blokker derimot tillater oppretting av variabler og instantiering av moduler. Det betyr at i en genereringsblokk kan du bruke en generere for løkke for å utlede moduler. Det er stort sett den eneste forskjellen.
For å generere for sløyfer, må du bruke en genvar
som løkkevariabel (dvs. verdien du bruker til å telle gjennom hver sløyfe). Du må også gi for-loop et navn:
for (loopVal = 0; loopVal < 4; loopVal = loopVal + 1) begin : loopName
Dette navnet er forhåndsbetalt til alle maskinvarene du installerer i loop. Så hvis du oppretter en forekomst kalt bob
, vil den ovennevnte sløyfen opprette forekomster:
loopName[0]|bob loopName[1]|bob loopName[2]|bob loopName[3]|bob
Dette resulterer i flere forekomster med unike navn.
Både generering og prosedyre for sløyfer vil utføre sløyfing som du sier. Forskjellen er ganske enkelt hvordan du kan bruke dem. Prosedyren kan brukes i prosedyreblokker (f.eks. For initialisering av et minne). Generere kan bare brukes i generere blokker.
De er både nyttige og foretrukne. Man kan ikke erstatte den andre.
Kommentarer
- en annen måte å tenke på å generere er som en slags forprosessor, din verilog-kompilator ' utfører ' ting genererer blokker på det punktet der det ' setter i gang blokken som inneholder genererer – de skjer ikke ' på kjøretid (i motsetning til prosessuelle løkker)
- @Taniwha prosessuelle løkker skjer ikke ' T kjør heller ikke på kjøretid. De blir rullet ut av kompilatoren. Det hele koker ned til maskinvare til slutt. Ikke ' t forveksler forprosessoren med genererer utsagn, de er ikke det samme konseptet – Verilog har en forprosessor som inkluderer if-else type uttalelser.
- @ TomCarpenter Jeg setter pris på et godt svar. Jeg kunne forstå alle poengene dine bortsett fra generere for loop.Det ser ut til at begynner: noe skal legges til rett før for-sløyfen, men kan ikke forstå hvordan det fungerer i å starte moduler. Er loopName en variabel eller bare streng? Og hvordan de kan indekseres av [1] til [4].
- @JaeHyukLee
loopName
er bare tekst, som et fornavn eller et signalnavn. Det kan være hva du vil. - @ TomCarpenter – det kommer an på kompilatoren – hvis du ' kompilerer porter, ja de blir rullet ut, hvis du ' det er mer sannsynlig at det ikke er mulig å kompilere kode for simulering (ansvarsfraskrivelse, jeg ' har skrevet en Verilog-kompilator)