Spørgsmål om syntetiserbar Til loop og generer

Jeg bruger Verilog-sproget og Zedboard som målkort.

Så vidt jeg ved , kan for-sløjfen syntetiseres, og synteseværktøjet oversætter for-sløjfen som en sekvens af duplikerede instruktioner som sløjfe-rullning.

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 ved, kan for-sløjfen bruges, hvis ressourcen er tilgængelig til at udlede de flere, men samme målrettede porte.

Det ser dog ud til, at genereringen i Verilog kan bruges til ikke kun at antyde flere forekomster, men også flere instruktioner, der er de samme som for-løkken.

Jeg forstår, at genereringen kun kan antyde, at modulet er flere forekomster, og for-løkken kan ikke bruges til det formål.

Hvad er så forskellen mellem generer + til loop og bare til loop? Jeg tror begge fungerer ligesom loop udrulning dog. Er der nogen mærkbar forskel? Hvis der ikke er nogen forskel, hvilken af dem foretrækkes kodningstil for at fremkalde loop-afrulning?

Kommentarer

  • Bare for klarhedens skyld er det ' s: Jeg antyder, du udleder. for eksempel. du antyder en RAM i Verilog / VHDL, syntesesoftwaren udleder den RAM fra din Verilog / VHDL. Meget almindelig fejl, værd at lære.

Svar

Verilog for-loops kan syntetiseres perfekt under visse betingelser:

  • Du kan bruge ethvert proceduremæssigt udsagn i en løkke (f.eks. hvis-ellers).
  • antal sløjfer skal være forudbestemt .
    • Det begrænsende udtryk skal være en sammenligning mellem loop-variablen og enten en konstant eller en parameter.
    • Trinopgaven skal forøge loop-værdien med en konstant mængde.
  • Du kan tildele en anden værdi til den samme variabel i hver sløjfe (f.eks. beregning af et indeks ud fra loop-variablen).
  • Til synteseformål evalueres sløjfen på nul tid – dvs. hvis du forsøgte at lave en tæller, ville du kun nogensinde se den endelige værdi.

De samme regler gælder, uanset om du bruger en for-loop i en procedureblok eller i en genereringsblok.

Når du er færdig i en procedureblok initial og always, kan du bruge en til loop for at ændre elementer i en matrix (nøjagtigt som dit eksempel), eller du kan ændre den samme værdi flere gange, 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 dette eksempel, den resulterende hardware vil være en kæde af tilføjere, der opsummerer værdierne fra fire matrixindeks.

Det vigtigste er, at du ikke kan oprette nye variabler eller moduler i en procedureløsning. Denne regel gælder for procedureblokke generelt, ikke kun for sløjfer (dvs. du kan ikke erklære en variabel i en procedureblok).

 

Generer blokke på den anden side tillader oprettelse af variabler og instantiering af moduler. Det betyder, at i en genereringsblok kan du bruge en generere til løkke til at udlede moduler. Det er stort set den eneste forskel.

For at generere til sløjfer skal du bruge en genvar som loopvariabel (dvs. den værdi, du bruger til at tælle gennem hver loop). Du skal også give for-sløjfen et navn:

for (loopVal = 0; loopVal < 4; loopVal = loopVal + 1) begin : loopName 

Dette navn foretrækkes til ethvert stykke hardware, du installerer i sløjfen. Så hvis du opretter en forekomst kaldet bob, vil ovenstående sløjfe skabe forekomster:

loopName[0]|bob loopName[1]|bob loopName[2]|bob loopName[3]|bob 

Dette resulterer i flere forekomster med unikke navne.

 

Både generering og proceduremæssig for sløjfer udfører looprulning som du siger. Forskellen er simpelthen, hvordan du kan bruge dem. Procedural kan bruges i procedureblokke (f.eks. Til initialisering af en hukommelse). Generate kan kun bruges i genereringsblokke.

De er begge nyttige og foretrukne. Man kan ikke erstatte den anden.

Kommentarer

  • en anden måde at tænke på generere er som en slags forprocessor, din verilog-kompilator ' udfører ' ting genererer blokke på det punkt, hvor det ' instanterer blokken, der indeholder genererer – de sker ikke ' sker ikke på kørselstid (i modsætning til procedurelejser)
  • @Taniwha proceduremæssige sløjfer ikke ' t udføres heller ikke ved kørselstid. De rulles ud af compileren. Det koger alt sammen til hardware til sidst. Også ' t forveksler forprocessoren med genererer udsagn, de er ikke det samme koncept – Verilog har en forprocessor, der inkluderer if-else type udsagn.
  • @ TomCarpenter Jeg sætter pris på et godt svar. Jeg kunne forstå alle dine punkter undtagen generere til loop.Det ser ud til, at begynder: noget skal tilføjes lige før for-sløjfen, men kan ikke forstå, hvordan det fungerer i moduleringsmoduler. Er loopName en variabel eller bare streng? Og hvordan de kan indekseres af [1] til [4].
  • @JaeHyukLee loopName er bare tekst, som et instansnavn eller et signalnavn. Det kan være hvad du vil.
  • @TomCarpenter – det afhænger af kompilatoren – hvis du ' er ved at kompilere porte, ja de rulles ud, hvis du ' at kompilere kode til simulering sandsynligvis ikke (ansvarsfraskrivelse, jeg ' har skrevet en Verilog-kompilator)

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *