Domanda sul ciclo For sintetizzabile e Genera

Sto usando il linguaggio Verilog e Zedboard come bacheca di destinazione.

Per quanto ne so , il ciclo for può essere sintetizzato e lo strumento di sintesi traduce il ciclo for come una sequenza di istruzioni duplicate come lo srotolamento del ciclo.

Ad esempio,

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; 

Pertanto, per quanto ne so, il ciclo for può essere utilizzato se la risorsa è disponibile per dedurre le porte multiple ma con lo stesso scopo.

Tuttavia, sembra che la generazione in Verilog può essere utilizzato non solo per implicare più istanze, ma anche per istruzioni multiple come il ciclo for.

Capisco che generate possa solo implicare le istanze multiple del modulo e il ciclo for non può essere utilizzato a tale scopo.

Allora qual è la differenza tra il ciclo generate + for e il ciclo solo for? Penso che entrambi funzionino come il ciclo che si srotola. Cè qualche differenza evidente? Se non cè differenza, quale è lo stile di codifica preferibile per indurre lo srotolamento del ciclo?

Commenti

  • Solo per chiarezza, ' s: Immagino, deduci tu. per esempio. implichi una RAM in Verilog / VHDL, il software di sintesi deduce quella RAM dal tuo Verilog / VHDL. Errore molto comune, che vale la pena imparare.

Risposta

I cicli for di Verilog sono perfettamente sintetizzabili in determinate condizioni:

  • Puoi utilizzare qualsiasi istruzione procedurale allinterno di un ciclo (ad es. if-else).
  • Il numero di cicli deve essere predeterminato .
    • Lespressione limite deve essere un confronto tra la variabile del ciclo e una costante o un parametro.
    • Lassegnazione del passaggio deve incrementare il valore del ciclo di una quantità costante.
  • È possibile assegnare un valore diverso alla stessa variabile in ogni ciclo (ad es. calcolare un indice dalla variabile del ciclo).
  • Per scopi di sintesi, il ciclo viene valutato in tempo zero, ovvero se provassi a creare un contatore, vedresti sempre e solo il valore finale.

Queste stesse regole si applicano sia che utilizzi un ciclo for in un blocco procedurale, sia in un blocco di generazione.

Quando eseguito in un blocco procedurale, initial e always, puoi utilizzare un per loop per modificare gli elementi in un array (esattamente come il tuo esempio), oppure potresti cambiare lo stesso valore più volte, ad esempio:

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 

In questo esempio, lhardware risultante sarà una catena di sommatori, sommando i valori da quattro indici di array.

La cosa fondamentale è che non puoi creare nuove variabili o moduli in un ciclo for procedurale. Questa regola si applica ai blocchi procedurali in generale, non solo ai cicli (cioè non puoi “dichiarare una variabile in un blocco procedurale).

 

Daltra parte, la generazione di blocchi consente la creazione di variabili e la creazione di istanze di moduli. Ciò significa che in un blocco di generazione è possibile utilizzare un ciclo generate for per dedurre i moduli. Questa è praticamente lunica differenza.

Per la generazione di cicli for, è necessario utilizzare un genvar come variabile del ciclo (ovvero il valore che si utilizza per contare attraverso ogni ciclo). Devi anche dare un nome al ciclo for:

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

Questo nome è anteposto a qualsiasi pezzo di hardware che installi nel ciclo. Quindi, se crei unistanza chiamata bob, il ciclo precedente creerebbe istanze:

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

Ciò si traduce in più istanze con nomi univoci.

 

Sia generate che procedural for loop eseguiranno lo srotolamento del loop come dici tu. La differenza è semplicemente come puoi usarli. Procedurale può essere utilizzato in blocchi procedurali (ad es. Per inizializzare una memoria). Generate può essere utilizzato solo in generate blocks.

Sono entrambi utili e preferiti. Uno non può “sostituire laltro.

Commenti

  • un altro modo di pensare a generate è come una sorta di pre-processore, il tuo compilatore verilog ' esegue ' cose in genera blocchi nel punto in cui ' s istanzia il blocco contenente la generazione – non ' non si verifica in fase di esecuzione (a differenza dei cicli procedurali)
  • @Taniwha cicli procedurali don ' t vengono eseguiti anche in fase di esecuzione. Sono srotolati dal compilatore. Alla fine tutto si riduce allhardware. Inoltre, non ' confondere il preprocessore con le istruzioni generate, non lo sono lo stesso concetto – Verilog ha un preprocessore che include istruzioni di tipo if-else.
  • @TomCarpenter Apprezzo unottima risposta. Potrei capire tutti i tuoi punti tranne il ciclo generate for.Sembra che inizio: qualcosa debba essere aggiunto subito prima del ciclo for, ma non riesco a capire come funziona nellistanziare i moduli. LoopName è una variabile o solo una stringa? E come possono essere indicizzati da [1] a [4].
  • @JaeHyukLee loopName è solo testo, come un nome di istanza o un nome di segnale. Può essere qualsiasi cosa tu voglia.
  • @TomCarpenter – dipende dal compilatore – se ' stai compilando i gate sì, vengono srotolati, se ' ricompilare il codice per la simulazione molto probabilmente no (disclaimer, ' ho scritto un compilatore Verilog)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *