Fråga om syntetiserbar för loop och generera

Jag använder Verilog-språket och Zedboard som målkort.

Såvitt jag vet kan for-slingan syntetiseras och syntesverktyget översätter for-slingan som en sekvens av dubblerade instruktioner som slingan som rullar ut.

Till exempel

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; 

Därför, så vitt jag vet, kan for-loop användas om resursen är tillgänglig för att härleda flera men samma avsedda grindar.

Det verkar dock som att generera i Verilog kan användas för att inte bara antyda flera instanser utan också flera instruktioner samma som för loop.

Jag förstår att generera bara kan innebära att flera instanser av modulen och for loop kan inte användas för det ändamålet.

Vad är då skillnaden mellan generera + för loop och bara för loop? Jag tror att båda fungerar som slingan. Finns det någon märkbar skillnad? Om det inte finns någon skillnad, vilken är att föredra kodningsstil för att framkalla slingrullning?

Kommentarer

  • Bara för tydlighetens skull är det ' s: Jag antyder att du drar slutsatsen. t.ex. antyder du ett RAM-minne i Verilog / VHDL, syntesprogramvaran leder till det RAM-minnet från din Verilog / VHDL. Mycket vanligt misstag, värt att lära sig.

Svar

Verilog for-loopar syntetiseras perfekt under vissa förhållanden:

  • Du kan använda alla proceduruttalanden i en slinga (t.ex. if-else).
  • antal slingor måste vara förutbestämd .
    • Det begränsande uttrycket måste vara en jämförelse mellan slingvariabeln och antingen en konstant eller en parameter.
    • Stegtilldelningen måste öka slingvärdet med en konstant mängd.
  • Du kan tilldela samma variabel till samma variabel i varje slinga (t.ex. beräkna ett index från loopvariabeln).
  • För syntesändamål utvärderas slingan på noll tid – dvs. om du försökte skapa en räknare, skulle du bara se det slutliga värdet.

Samma regler gäller oavsett om du använder en for-loop i ett procedurblock eller i ett generera block.

När du är klar i ett procedurblock, initial och always, kan du använda en för loop för att ändra element i en matris (exakt som ditt exempel), eller så kan du ändra samma värde flera gånger, till exempel:

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 exemplet, den resulterande hårdvaran kommer att vara en kedja av tillägg som summerar värdena från fyra matrisindex.

Det viktigaste är att du inte kan skapa nya variabler eller moduler i en procedur för loop. Denna regel gäller i allmänhet procedurblock, inte bara för loopar (dvs. du kan inte deklarera en variabel i ett procedurblock).

 

Generera block å andra sidan tillåter skapande av variabler och modulering av moduler. Det betyder att i ett genereringsblock kan du använda en generera för loop för att härleda moduler. Det är i stort sett den enda skillnaden.

För att generera för loopar måste du använda en genvar som loopvariabel (dvs. det värde du använder för att räkna genom varje loop). Du måste också ge for-loop ett namn:

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

Det här namnet läggs på alla hårdvaror du installerar i loop. Så om du skapar en instans som heter bob, skulle ovanstående slinga skapa instanser:

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

Detta resulterar i flera instanser med unika namn.

 

Både generera och procedurella för loopar kommer att utföra looprullning som du säger. Skillnaden är helt enkelt hur du kan använda dem. Procedural kan användas i procedurblock (t.ex. för att initiera ett minne). Generera kan endast användas i generera block.

De är både användbara och föredragna. Man kan inte ersätta den andra.

Kommentarer

  • ett annat sätt att tänka på generera är som en slags förprocessor, din verilog-kompilator ' kör ' saker genererar block vid den punkt där det ' skapar blocket som innehåller genererar – de händer inte ' vid körtid (till skillnad från procedurslingor)
  • @Taniwha procedurslingor gör inte ' t kör också vid körningstid. De rullas upp av kompilatorn. Allt slutar med hårdvara i slutändan. Inte ' t förvirrar förprocessorn med generera uttalanden, de är inte samma koncept – Verilog har en förprocessor som innehåller uttalanden av if-else-typ.
  • @ TomCarpenter Jag uppskattar ett bra svar. Jag kunde förstå alla dina poäng utom generera för loop.Det verkar som att börja: något ska läggas till precis före for-slingan, men kan inte förstå hur det fungerar i att modulera moduler. Är loopName en variabel eller bara sträng? Och hur de kan indexeras av [1] till [4].
  • @JaeHyukLee loopName är bara text, som ett instansnamn eller ett signalnamn. Det kan vara vad du vill.
  • @TomCarpenter – det beror på kompilatorn – om du ' kompilerar grindar ja, de rullas ur, om du ' det är mer troligt att kompilera kod för simulering inte (ansvarsfriskrivning, jag ' har skrivit en Verilog-kompilator)

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *