Die zwei Formen
Verilog unterstützt genau zwei Kommentar-Syntaxen, beide aus C übernommen:
Das ist die ganze Syntax. Es gibt kein # wie in Python, kein -- wie in VHDL, keinen Lisp-Stil. Nur // und /* ... */.
Wann was nehmen
// ist das, wozu du fast immer greifst. Kürzer, kann nicht versehentlich unbeendet bleiben und passt natürlich zur Art, wie du Verilog schreibst (eine Deklaration pro Zeile, Kommentar in derselben oder benachbarten Zeile):
output reg [7:0] data, // Byte, das wir auf tx_serial hinausschieben
output reg valid, // high, während Daten übertragen werden
input wire ready // nachgelagerter Konsument ist bereit
/* ... */ ist hauptsächlich für zwei Dinge gedacht: große Header-Blöcke oben in einer Datei und temporäres Deaktivieren eines Codestücks beim Debuggen. Der Deaktivierungs-Fall ist gefährlich - lies weiter.
Die "Keine Verschachtelung"-Falle
Block-Kommentare verschachteln sich nicht. Wenn du einen Bereich auskommentieren willst, der bereits einen Block-Kommentar enthält, schließt das erste */ den äußeren Block, nicht den inneren:
/* äußerer
/* innerer */ // <-- dieses */ schließt den äußeren Kommentar
weiterhin aktiv im Quelltext, was den Parser angeht
*/
Ergebnis: ein Syntaxfehler an einer unerwarteten Stelle, in einer Zeile, die korrekt aussieht.
Wenn du einen Bereich deaktivieren willst, bevorzuge:
-
Jede Zeile mit
//präfixen. Die meisten Editoren tun das per Tastendruck. -
Eine Präprozessor-Schutzdirektive nutzen:
`ifdef DISABLED // Code, der nicht kompilieren soll `endif
Das zweite Muster ist auch der Weg, mehrere Build-Konfigurationen in einer Datei zu halten.
Synthese-Pragmas: Kommentare, die keine sind
Hersteller-Tools nutzen speziell formatierte Kommentare als Out-of-Band-Anweisungen. Der Simulator ignoriert sie weiterhin, aber das Synthese-Tool liest sie:
// synthesis translate_off
initial begin
$display("simulationsspezifisches Setup");
end
// synthesis translate_on
Die zwei Pragmas sagen dem Synthese-Tool "überspringe alles zwischen diesen Markern". Die genauen Schreibweisen variieren je Hersteller (synthesis, synopsys, pragma, xilinx usw.) - prüfe die Tool-Docs. Wichtig zu wissen: Kommentare in Verilog sind manchmal tragend.
Header-Block-Konventionen
Langlebige Verilog-Dateien starten fast immer mit einem Header-Block. Das genaue Format ist Team-Policy, ein typisches Beispiel:
// -----------------------------------------------------------------------------
// Module : uart_tx
// Description : 8-N-1 UART-Sender. Nimmt ein Byte auf `data`, wenn `valid`
// aktiviert ist, und schiebt es auf `serial_out` hinaus.
// `baud_tick` muss einmal pro Baud-Periode pulsen.
// Ports : clk - Systemtakt
// reset_n - active-low synchroner Reset
// baud_tick - 1-Zyklus-Puls in jedem Baud-Intervall
// data - zu sendendes Byte
// valid - aktiviert, um eine Übertragung zu starten
// serial_out - die Leitung, die das FPGA verlässt
// busy - high, während ein Frame in Übertragung ist
// Author : example@team
// Revision : 2026-05-26 - initial version
// -----------------------------------------------------------------------------
module uart_tx (
input wire clk,
input wire reset_n,
input wire baud_tick,
input wire [7:0] data,
input wire valid,
output reg serial_out,
output reg busy
);
// ... Body ...
endmodule
Es geht nicht um die Dekoration. Es geht darum, dass jemand, der diese Datei in einem Jahr öffnet - wahrscheinlich du selbst -, in vier Zeilen weiß, was sie tut, was sie erwartet und was sie produziert. Der Lohn skaliert mit der Größe des Projekts.
Inline-Kommentare, die ihr Geld wert sind
Ein häufiger Fehler ist, das Was einer Zeile zu kommentieren, wenn der Code es bereits zeigt:
// schlecht - der Kommentar wiederholt den Code
count <= count + 1; // count erhöhen
// besser - der Kommentar erklärt, warum die Zeile hier steht
count <= count + 1; // freilaufender Zyklenzähler für Timestamping
Was Kommentare einzigartig gut können, ist das Warum zu erklären, das der Code nicht selbst zeigen kann: welcher Spec-Abschnitt einer komischen Kodierung folgt, warum ein Register ein Bit breiter ist als es aussieht, warum ein default-Case auf 'x statt '0 gesetzt ist. Setze dafür auf sie. Das Offensichtliche überlässt du dem Code.
Probier es aus
Der Block unten enthält jede Kommentar-Form. Lass ihn laufen - die Ausgabe wird dich nicht überraschen, aber die Dateistruktur sollte sich einprägen:
Du hast jetzt jede Kommentar-Form gesehen, die Verilog unterstützt. Der Rest der Docs nutzt sie wie erwartet: Header-Blöcke oben in langen Modulen, einzeilige // neben Ports und Block-Kommentare nur, wenn es einen ganzen Absatz an Begründung einzufangen gibt.
Häufig gestellte Fragen
Wie schreibt man einen Kommentar in Verilog?
Verilog unterstützt zwei Kommentar-Stile, beide von C übernommen. // startet einen Kommentar, der bis zum Zeilenende läuft. /* ... */ umfasst einen mehrzeiligen Block. Der Compiler ignoriert alles zwischen den Markern; beide Stile sind in jeder synthetisierbaren oder simulationsspezifischen Datei gültig.
Sind Verilog-Kommentare synthetisierbar?
Kommentare existieren nach dem Parsen nicht mehr - das Synthese-Tool wirft sie genauso weg wie der Simulator. Die einzige Ausnahme sind Synthese-Pragmas: speziell formatierte Kommentare wie // synthesis translate_off, die Hersteller-Tools als Direktiven erkennen. Die Pragma-Syntax ist tool-spezifisch und nicht Teil des Verilog-Standards.
Können Verilog-Kommentare verschachtelt werden?
Nein - und das erwischt Anfänger, die einen Block auskommentieren wollen, der bereits /* ... */ enthält. Das erste */ innen schließt den äußeren Kommentar und lässt den Rest des Blocks als aktiven Code stehen. Nutze // in jeder Zeile oder umfasse den Bereich mit \ifdef SOMETHING_FALSE/`endif`, wenn du wirklich einen Abschnitt deaktivieren musst.
Was sollte ein Verilog-Header-Kommentar enthalten?
Die meisten Teams setzen oben in jede Datei einen kleinen Header: Modulname, Ein-Satz-Zweck, Port-Übersicht, Autor/Datum und eine Revisions-Historie. Das genaue Format variiert; wichtig ist, dass jeder, der die Datei öffnet, ohne den Body zu lesen, weiß, was sie tut. Große Designs ergänzen pro-Signal-Kommentare neben jeder Port-Deklaration.