Folosesc limbajul Verilog și Zedboard ca tablă țintă.
Din câte știu , bucla for poate fi sintetizată, iar instrumentul de sinteză traduce bucla for ca o secvență de instrucțiuni duplicate, cum ar fi derularea buclei.
De exemplu,
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;
Prin urmare, din câte știu, bucla for poate fi utilizată dacă resursa este disponibilă pentru a deduce porțile multiple, dar aceleași.
Cu toate acestea, se pare că generarea în Verilog poate fi folosit pentru a implica nu numai instanțele multiple, ci și instrucțiunile multiple la fel ca bucla for.
Înțeleg că generarea poate implica doar instanțele multiple ale modulului și bucla for nu poate fi utilizată în acest scop.
Atunci care este diferența dintre genera + pentru buclă și doar pentru buclă? Cred că ambele funcționează ca desfășurarea buclei. Există vreo diferență vizibilă? Dacă nu există nicio diferență, care este stilul de codare preferabil pentru a induce derularea buclei?
Comentarii
- Doar pentru claritate, ' s: presupun, deduceți. de exemplu. presupuneți o memorie RAM în Verilog / VHDL, software-ul de sinteză deduce memoria RAM din Verilog / VHDL. Greșeală foarte frecventă, merită învățată.
Răspuns
Verilog pentru bucle sunt perfect sintetizabile în anumite condiții:
- Puteți utiliza orice afirmație procedurală într-o buclă (de ex. if-else).
- Numărul de bucle trebuie să fie predeterminat .
- Expresia limitativă trebuie să fie o comparație între variabila buclă și fie o constantă, fie un parametru.
- Alocarea pasului trebuie să fie incrementarea valorii buclei cu o cantitate constantă.
- Puteți atribui o valoare diferită aceleiași variabile în fiecare buclă (de exemplu, calcularea unui index din variabila buclă).
- În scopuri de sinteză, bucla este evaluată în timp zero – adică dacă ați încerca să faceți un contor, veți vedea doar valoarea finală.
Aceleași reguli se aplică indiferent dacă utilizați o buclă for într-un bloc procedural sau într-un bloc de generare.
Când ați terminat într-un bloc de procedură, initial
și always
, puteți utiliza un pentru bucla pentru a schimba elementele dintr-o matrice (exact ca în exemplul dvs.) sau puteți schimba aceeași valoare de mai multe ori, de exemplu:
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
În acest exemplu, hardware-ul rezultat va fi un lanț de addere, însumând valorile din patru indici matrice.
Principalul lucru este că nu puteți crea noi variabile sau module într-o procedură pentru buclă. Această regulă se aplică blocurilor procedurale în general, nu doar pentru bucle (adică nu puteți „declara o variabilă într-un bloc procedural).
Generarea blocurilor, pe de altă parte, permite crearea de variabile și instanțierea modulelor. Asta înseamnă că într-un bloc de generare, puteți utiliza o buclă de generare pentru a deduce module. Aceasta este cam singura diferență.
Pentru generare pentru bucle, trebuie să utilizați o genvar
ca variabilă de buclă (adică valoarea pe care o utilizați pentru a număra prin fiecare buclă). De asemenea, trebuie să dați buclei for un nume:
for (loopVal = 0; loopVal < 4; loopVal = loopVal + 1) begin : loopName
Acest nume este însoțit de orice componentă hardware pe care o creați în buclă. Deci, dacă creați o instanță numită bob
, bucla de mai sus va crea instanțe:
loopName[0]|bob loopName[1]|bob loopName[2]|bob loopName[3]|bob
Acest lucru are ca rezultat multiple instanțe cu nume unice.
Atât generarea cât și procedurile pentru bucle vor efectua derularea buclelor așa cum spuneți. Diferența este pur și simplu modul în care le puteți folosi. Procedural poate fi utilizat în blocuri procedurale (de exemplu, pentru inițializarea unei memorii). Generare poate fi utilizată numai în blocuri de generare.
Sunt utile și preferate. Unul nu îl poate înlocui pe celălalt.
Comentarii
- un alt mod de a te gândi la generare este ca un fel de pre-procesor, compilatorul tău de verilog ' execută ' lucruri din blocuri de generare în punctul în care ' instanțează blocul care conține generează – nu ' se întâmplă în timpul rulării (spre deosebire de buclele procedurale)
- @Taniwha buclele procedurale nu ' nu se execută nici în timpul rulării. Acestea sunt derulate de compilator. În cele din urmă, totul se reduce la hardware. De asemenea, nu ' nu confundați preprocesorul cu instrucțiunile generate, acestea nu sunt același concept – Verilog are un preprocesor care include instrucțiuni de tip if-else.
- @TomCarpenter Apreciez un răspuns minunat. Aș putea înțelege toate punctele dvs., cu excepția buclei generate pentru.Se pare că începe: ceva ar trebui adăugat chiar înainte de bucla for, dar nu poate înțelege cum funcționează în instanțierea modulelor. BuclaNume este o variabilă sau doar un șir? Și modul în care pot fi indexate de [1] la [4].
- @JaeHyukLee
loopName
este doar text, cum ar fi un nume de instanță sau un nume de semnal. Poate fi orice vrei. - @TomCarpenter – depinde de compilator – dacă ' reuniți porțile da, acestea se desfășoară, dacă ' re compilarea codului pentru simulare mai probabil nu (disclaimer, am ' am scris un compilator Verilog)