Ist der Anfangsblock in Verilog synthetisierbar?

Ich bin auf viele Beiträge gestoßen, die besagen, dass der initialBlock in Verilog HDL nicht synthetisierbar ist. Gemäß diesem Anhang zu synthetisierbaren und nicht synthetisierbaren Verilog-Konstrukten (aus dem Buch Digital Logic Design Using Verilog von Taraate) initialist der Block nicht synthetisierbar.

Ich ziehe es vor, einen Reset zu verwenden, um Inhalte in Speicherblöcken zu initialisieren. Aber meine Freunde führen ein Spieleprojekt durch, bei dem sie die Anfangspositionen (Werte) von Blöcken mit einem Anfangsschlüsselwort festlegen (wir verwenden ein Nexys 4 DDR FPGA). Es funktionierte.

Ich weiß wirklich nicht, was ich sagen soll, weil ich dachte, es wäre nicht möglich. Kannst du mir das bitte erklären? Ich verwende Xilinx Vivado.

Ich vermute, es funktioniert, weil Sie ein FPGA verwenden. Man kann im Allgemeinen nur die Register (und so ziemlich alles) in denen mit den Programmierbitströmen vorladen. In „echtem Silizium“ können die Register jedoch ohne PoR-Schaltung und Reset-Magie in nahezu jedem gewünschten Zustand hochgefahren werden. Ich weiß es nicht, es ist nur eine Vermutung. Trotzdem kann ich nicht verstehen, warum es keinen Silizium-Synthesizer geben könnte, der die PoR-Handhabung für Sie übernimmt.
Ich habe dasselbe über die Signalinitialisierung geglaubt und war überrascht ... Aber es sieht so aus, als ob die Tool-Anbieter sich zu frei fühlen, wenn sie nicht standardmäßige Funktionen hinzufügen, die mehr Chaos als Ordnung anrichten, wenn Sie mich fragen ...
Danke @RichardtheSpacecat. Aber wie Eugene Sh erwähnte, haben Anbieter diese Funktionen möglicherweise hinzugefügt, und dies variiert mit dem von uns verwendeten Tool.
Verwenden Sie Reset nicht zum Initialisieren von Speicherblöcken, da dies dazu führt, dass eine sehr große Anzahl von Registern anstelle von verteiltem oder Block-RAM verwendet wird.
@alex.forencich Gibt es eine andere Möglichkeit, den Inhalt zu initialisieren? Lass es mich wissen, bitte.
Nicht wirklich. Wenn es sich um ein ROM handelt, verwenden Sie einen Anfangsblock. Wenn es sich um ein RAM handelt, müssen Sie eine Zustandsmaschine verwenden, um die neuen Werte von irgendwoher zu laden. Wenn Sie ein Reset-Signal verwenden, muss die Logik als Flip-Flops implementiert werden, da RAMs nicht rücksetzbar sind.

Antworten (1)

Xilinx Vivado kann initialin einigen Fällen Blöcke synthetisieren. Beispielsweise zeigt Vivado Synthesis Guide (Seite 145), wie RAM-Inhalte initialisiert werden.

reg [DATA_WIDTH-1:0] ram [DEPTH-1:0];
integer i;
initial for (i=0; i<DEPTH; i=i+1) ram[i] = 0;
end

$readmembKann laut Seite 147 auch zur Initialisierung eines RAM verwendet werden.

reg [31:0] ram [0:63];

initial begin
    $readmemb(“rams_20c.data”, ram, 0, 63);
end

Wenn wir über ASIC sprechen, synthetisiert * Design Compiler diese Blöcke nicht.

Ja. Aber sie verwendeten auch die Systemfunktion $readmemb zum Lesen der Datendatei, die nicht synthetisierbar ist. (Können wir das unmittelbar obige Beispiel betrachten, das Sie für die Synthese erwähnt haben?)
@SandeepI Ich habe die Antwort bezüglich aktualisiert $readmemb.
Ihre Antwort ist sehr irreführend ... initialBlöcke sind im Allgemeinen nicht synthetisierbar. Diese Codebeispiele sind nicht im normalen Sinne des Wortes synthetisiert. Natürlich kann das FPGA nicht direkt auf eine RAM-Datendatei zugreifen. Die gewünschten RAM-Inhalte werden in den Bitstrom zum Programmieren des FPGA eingebettet, bevor das FPGA tatsächlich konfiguriert wird.
@ElliotAlderson Nein, du interpretierst meine Antwort falsch. Ich behaupte nicht, dass FPGA eine Datendatei nach der Konfiguration liest. Wenn der Inhalt der Datei in den Bitstrom eingebettet ist, bedeutet dies, dass er synthetisiert wurde. Wenn das FPGA eingeschaltet wird, enthält das RAM die Daten.
Ihr erster Satz lautet: "Vivado kann Anfangsblöcke synthetisieren". Dies gilt nicht pauschal , sondern nur in Einzelfällen. Ich würde das Wort "Synthese" nicht verwenden, um die Initialisierung eines RAM zu beschreiben ... für mich ist "Synthese" der Prozess der Konvertierung von HDL in eine bestimmte Hardwareimplementierung.
@ElliotAlderson Ich habe den Satz dann aktualisiert. Bei "Synthese" bin ich immer noch anderer Meinung. Bei FPGAs sehe ich keinen Unterschied zwischen der Initialisierung eines RAM oder einer LUT. Wenn Sie sagen, dass wir das Wort "Synthese" nicht für die RAM-Initialisierung verwenden können, sollten wir es überhaupt nicht für FPGAs verwenden.
Als zusätzlicher Kommentar unterstützt Intel PSG, ehemals Altera, auch die Initialisierung eines Speichers mithilfe des Anfangsblocks. Der Grund, denke ich, ist, dass beide Hersteller Tools bereitstellen wollten, um auf RAMs zu schließen, ohne auf die IP-Nutzung zurückgreifen zu müssen. Und ich finde es gut, weil abgeleitete Blöcke offensichtlich besser wiederverwendbar sind als IP-Blöcke.