Pytanie o pętlę Synthesizable For i Generate

Używam języka Verilog i Zedboard jako tablicy docelowej.

O ile wiem , pętla for może zostać zsyntetyzowana, a narzędzie do syntezy tłumaczy pętlę for jako sekwencję zduplikowanych instrukcji, takich jak rozwijanie pętli.

Na przykład

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; 

Dlatego, o ile wiem, pętla for może być używana, jeśli zasób jest dostępny do wnioskowania o wielu, ale tych samych celach bramek.

Jednak wydaje się, że generowanie w Verilog może być używany do, nie tylko implikować wiele wystąpień, ale także wiele instrukcji takich samych jak pętla for.

Rozumiem, że generowanie może tylko implikować wiele wystąpień modułu, a pętla for nie może być używana w tym celu.

Zatem jaka jest różnica między pętlą generowania + for a pętlą po prostu for? Myślę, że oba działają jak rozwijająca się pętla. Czy jest jakaś zauważalna różnica? Jeśli nie ma różnicy, który styl kodowania jest lepszy do wywołania rozwijania pętli?

Komentarze

  • Dla jasności ' s: Sugeruję, wnioskujesz. na przykład implikujesz pamięć RAM w Verilog / VHDL, oprogramowanie do syntezy wnioskuje, że pamięć RAM z Verilog / VHDL. Bardzo częsty błąd, wart nauczenia się.

Odpowiedź

Pętle for-Verilog są doskonale syntetyzowalne w pewnych warunkach:

  • W pętli można użyć dowolnej instrukcji proceduralnej (np. if-else).
  • liczba pętli musi być z góry określony .
    • Wyrażenie ograniczające musi być porównaniem zmiennej pętli ze stałą lub parametrem.
    • Przypisanie kroku musi zwiększać wartość pętli o stałą wartość.
  • Możesz przypisać inną wartość do tej samej zmiennej w każdej pętli (np. obliczenie indeksu ze zmiennej pętli).
  • Dla celów syntezy, pętla jest oceniana w czasie zero – tj. jeśli spróbujesz utworzyć licznik, zobaczysz tylko końcową wartość.

Te same zasady mają zastosowanie niezależnie od tego, czy używasz pętli for w bloku proceduralnym, czy w bloku generowania.

Po zakończeniu w bloku proceduralnym initial i always można użyć znaku pętla, aby zmienić elementy w tablicy (dokładnie tak, jak w przykładzie) lub możesz zmienić tę samą wartość wiele razy, na przykład:

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 

W tym przykładzie wynikowy sprzęt będzie łańcuchem sumatorów, sumując wartości z czterech indeksów tablicy.

Najważniejsze jest to, że nie można tworzyć nowych zmiennych ani modułów w proceduralnej pętli for. Ta zasada dotyczy ogólnie bloków proceduralnych, a nie tylko pętli (tj. Nie można zadeklarować zmiennej w bloku proceduralnym).

 

Z drugiej strony generowanie bloków pozwala na tworzenie zmiennych i tworzenie instancji modułów. Oznacza to, że w bloku generowania można użyć pętli generowania for do wnioskowania o modułach. To prawie jedyna różnica.

Aby wygenerować pętle, musisz użyć genvar jako zmiennej pętli (tj. wartości używanej do liczenia w każdej pętli). Musisz także nadać pętli for nazwę:

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

Ta nazwa jest dołączana do każdego elementu sprzętu, którego instancję tworzysz w pętli. Jeśli więc utworzysz instancję o nazwie bob, powyższa pętla utworzy instancje:

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

Daje to wiele instancje o unikalnych nazwach.

 

Zarówno generowanie, jak i procedury proceduralne dla pętli wykonają rozwijanie pętli, tak jak mówisz. Różnica polega po prostu na tym, jak możesz z nich korzystać. Proceduralne może być używane w blokach proceduralnych (np. Do inicjalizacji pamięci). Generate może być używane tylko w blokach generujących.

Są zarówno przydatne, jak i preferowane. Jeden nie może zastąpić drugiego.

Komentarze

  • Innym sposobem myślenia o generowaniu jest coś w rodzaju preprocesora, czyli kompilatora Verilog ' wykonuje ' rzeczy w generowaniu bloków w punkcie, w którym ' s tworzy instancję bloku zawierającego generuje – nie ' nie zdarza się w czasie wykonywania (w przeciwieństwie do pętli proceduralnych)
  • @Taniwha pętle proceduralne don ' t są wykonywane również w czasie wykonywania. Są one rozwijane przez kompilator. Wszystko sprowadza się do sprzętu. Nie należy też ' nie mylić preprocesora z instrukcjami generowania. ta sama koncepcja – Verilog ma preprocesor zawierający instrukcje typu if-else.
  • @TomCarpenter Doceniam świetną odpowiedź. Mogłem zrozumieć wszystkie twoje punkty z wyjątkiem pętli generowania for.Wygląda na to, że begin: coś powinno zostać dodane tuż przed pętlą for, ale nie mogę zrozumieć, jak to działa w przypadku tworzenia instancji modułów. Czy loopName jest zmienną, czy tylko ciągiem? I jak można je indeksować według [1] do [4].
  • @JaeHyukLee loopName to zwykły tekst, taki jak nazwa instancji lub nazwa sygnału. To może być cokolwiek zechcesz.
  • @TomCarpenter – to zależy od kompilatora – jeśli ' ponownie kompilujesz bramki tak, zostaną one rozwinięte, jeśli ' ponowna kompilacja kodu do symulacji najprawdopodobniej nie (zrzeczenie się, ' napisałem kompilator Verilog)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *