Ich verwende die Verilog-Sprache und Zedboard als Zieltafel.
Soweit ich weiß, kann die for-Schleife synthetisiert werden, und das Synthesetool übersetzt die for-Schleife als eine Folge duplizierter Anweisungen wie das Abrollen der Schleife.
Zum Beispiel,
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;
Soweit ich weiß, kann daher die for-Schleife verwendet werden, wenn die Ressource verfügbar ist, um auf die mehreren, aber gleichen Gatter zu schließen.
Es scheint jedoch, dass das Generieren in Verilog verwendet werden kann, um nicht nur die mehreren Instanzen, sondern auch die mehreren Anweisungen wie die for-Schleife zu implizieren.
Ich verstehe, dass das Generieren nur die mehreren Instanzen des Moduls implizieren kann und die for-Schleife nicht für diesen Zweck verwendet werden kann.
Was ist dann der Unterschied zwischen der Generate + For-Schleife und der Nur-For-Schleife? Ich denke, beides funktioniert wie das Abrollen der Schleife. Gibt es einen merklichen Unterschied? Wenn es keinen Unterschied gibt, welcher ist der bevorzugte Codierungsstil, um das Abrollen der Schleife zu induzieren?
Verilog for-Schleifen sind unter bestimmten Bedingungen perfekt synthetisierbar:
Dieselben Regeln gelten unabhängig davon, ob Sie eine for-Schleife in einem prozeduralen Block oder in einem generierten Block verwenden.
initial
Wenn Sie in einem prozeduralen Block fertig sind, always
können Sie eine for-Schleife verwenden, um Elemente in einem Array zu ändern (genau wie in Ihrem Beispiel), oder Sie können denselben Wert mehrmals ändern, zum Beispiel:
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 diesem Beispiel ist die resultierende Hardware eine Kette von Addierern, die die Werte von vier Array-Indizes summieren.
Das Wichtigste ist, dass Sie in einer prozeduralen for-Schleife keine neuen Variablen oder Module erstellen können. Diese Regel gilt allgemein für prozedurale Blöcke, nicht nur für Schleifen (dh Sie können keine Variablen in einem prozeduralen Block deklarieren).
Generate-Blöcke hingegen ermöglichen die Erstellung von Variablen und die Instanziierung von Modulen. Das bedeutet, dass Sie in einem Generate-Block eine Generate-For-Schleife verwenden können, um Module abzuleiten. Das ist so ziemlich der einzige Unterschied.
genvar
Zum Erzeugen von for-Schleifen müssen Sie a als Schleifenvariable verwenden (dh den Wert, mit dem Sie durch jede Schleife zählen). Sie müssen der for-Schleife auch einen Namen geben:
for (loopVal = 0; loopVal < 4; loopVal = loopVal + 1) begin : loopName
Dieser Name wird jedem Hardwareteil vorangestellt, das Sie in der Schleife instanziieren. Wenn Sie also eine Instanz mit dem Namen erstellen bob
, würde die obige Schleife Instanzen erstellen:
loopName[0]|bob
loopName[1]|bob
loopName[2]|bob
loopName[3]|bob
Dies führt zu mehreren Instanzen mit eindeutigen Namen.
Sowohl generierte als auch prozedurale For-Schleifen führen das Abrollen der Schleife durch, wie Sie sagen. Der Unterschied besteht einfach darin, wie Sie sie verwenden können. Procedural kann in prozeduralen Blöcken verwendet werden (z. B. zum Initialisieren eines Speichers). Generate kann nur in Generate-Blöcken verwendet werden.
Sie sind sowohl nützlich als auch bevorzugt. Das eine kann das andere nicht ersetzen.
loopName
ist nur Text, wie ein Instanzname oder ein Signalname. Es kann alles sein, was Sie wollen.
Toni M