Dwie formy
Verilog obsługuje dokładnie dwie składnie komentarzy, obie skopiowane z C:
To cała składnia. Nie ma # jak w Pythonie, -- jak w VHDL ani stylu z Lispa. Tylko // i /* ... */.
Kiedy używać której
Po // sięgasz prawie zawsze. Jest krótszy, nie da się go przypadkiem zostawić niezamkniętego i naturalnie pasuje do sposobu pisania w Verilogu (jedna deklaracja na linię, z komentarzem w tej samej lub sąsiedniej linii):
output reg [7:0] data, // bajt, który wysyłamy przez tx_serial
output reg valid, // wysoki, dopóki data jest nadawany
input wire ready // odbiorca dalej w torze jest gotowy przyjąć dane
/* ... */ służy głównie do dwóch rzeczy: dużych bloków nagłówkowych na początku pliku i tymczasowego wyłączania fragmentu kodu podczas debugowania. Wyłączanie jest ryzykowne, o czym dalej.
Pułapka: brak zagnieżdżania
Komentarze blokowe się nie zagnieżdżają. Jeśli spróbujesz zakomentować fragment, który zawiera już komentarz blokowy, pierwsze */ zamknie blok zewnętrzny, a nie wewnętrzny:
/* zewnętrzny
/* wewnętrzny */ // <-- to */ zamyka zewnętrzny komentarz
dla parsera to wciąż aktywny kod źródłowy
*/
Efekt: błąd składni w nieoczekiwanym miejscu, w linii, która wygląda poprawnie.
Gdy musisz wyłączyć fragment kodu, wybierz raczej jedno z poniższych:
-
Poprzedź każdą linię przez
//. Większość edytorów robi to jednym skrótem klawiszowym. -
Użyj osłony preprocesora:
`ifdef DISABLED // kod, który nie powinien się kompilować `endif
Drugi wzorzec pozwala też trzymać kilka konfiguracji builda w jednym pliku.
Pragmy syntezy: komentarze, które nie są komentarzami
Narzędzia producentów używają specjalnie sformatowanych komentarzy jako dodatkowych instrukcji. Symulator nadal je ignoruje, ale narzędzie do syntezy je czyta:
// synthesis translate_off
initial begin
$display("simulator-only setup");
end
// synthesis translate_on
Te dwie pragmy mówią narzędziu do syntezy "pomiń wszystko między tymi znacznikami". Dokładna pisownia zależy od producenta (synthesis, synopsys, pragma, xilinx itd.), więc sprawdź dokumentację swojego narzędzia. Warto wiedzieć jedno: komentarze w Verilogu czasem naprawdę coś robią.
Konwencje bloków nagłówkowych
Pliki Verilog, które mają długo żyć, prawie zawsze zaczynają się od bloku nagłówkowego. Dokładny format to kwestia zasad zespołu, ale typowy przykład wygląda tak:
// -----------------------------------------------------------------------------
// Module : uart_tx
// Description : Nadajnik UART 8-N-1. Przyjmuje bajt z `data`, gdy `valid`
// jest aktywny, i wysuwa go przez `serial_out`. `baud_tick`
// musi dać jeden impuls na każdy okres bodu.
// Ports : clk - zegar systemowy
// reset_n - synchroniczny reset aktywny niskim stanem
// baud_tick - impuls trwający 1 cykl w każdym interwale bodu
// data - bajt do wysłania
// valid - aktywowany, żeby rozpocząć transmisję
// serial_out - wire, który wychodzi z FPGA
// busy - wysoki, dopóki ramka jest w drodze
// 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
Nie chodzi o ozdobniki. Chodzi o to, żeby ktoś, kto otworzy ten plik za rok (prawdopodobnie ty), mógł przeczytać cztery linie i wiedzieć, co moduł robi, czego oczekuje i co zwraca. Ta korzyść rośnie razem z rozmiarem projektu.
Komentarze w linii, które są coś warte
Częsty błąd to komentowanie, co robi linia, gdy kod już to pokazuje:
// źle: komentarz powtarza kod
count <= count + 1; // zwiększ count
// lepiej: komentarz wyjaśnia, po co jest ta linia
count <= count + 1; // licznik cykli działający bez przerwy, do znaczników czasu
Komentarze wyjątkowo dobrze wyjaśniają dlaczego, czego kod sam nie pokaże: którą sekcję specyfikacji realizuje dziwne kodowanie, czemu rejestr jest o bit szerszy, niż się wydaje, czemu przypadek default ustawiono na 'x zamiast na '0. Używaj ich właśnie do tego. Oczywiste rzeczy zostaw kodowi.
Wypróbuj
Poniższy blok zawiera wszystkie formy komentarzy. Uruchom go: wynik cię nie zaskoczy, ale struktura pliku powinna dać do myślenia:
Znasz już wszystkie kształty komentarzy, które obsługuje Verilog. Pozostałe strony dokumentacji używają ich tak, jak można się spodziewać: bloki nagłówkowe na początku długich modułów, jednoliniowe // przy portach, a komentarze blokowe tylko wtedy, gdy trzeba zapisać cały akapit rozumowania.
Najczęściej zadawane pytania
Jak napisać komentarz w Verilogu?
Verilog obsługuje dwa style komentarzy, oba odziedziczone po C. // zaczyna komentarz, który trwa do końca linii. /* ... */ obejmuje blok wieloliniowy. Kompilator ignoruje wszystko między znacznikami, a oba style są równie poprawne w każdym pliku, zarówno syntezowalnym, jak i przeznaczonym tylko do symulacji.
Czy komentarze w Verilogu są syntezowalne?
Po parsowaniu komentarze przestają istnieć: narzędzie do syntezy je odrzuca, tak samo jak symulator. Jedynym wyjątkiem są pragmy syntezy: specjalnie sformatowane komentarze, takie jak // synthesis translate_off, które narzędzia producentów rozpoznają jako dyrektywy. Składnia pragm zależy od narzędzia i nie należy do standardowego Veriloga.
Czy komentarze w Verilogu można zagnieżdżać?
Nie, i to często zaskakuje początkujących, którzy próbują zakomentować blok zawierający już /* ... */. Pierwsze */ w środku zamyka zewnętrzny komentarz, a reszta bloku zostaje aktywnym kodem. Użyj // w każdej linii albo otocz cały fragment przez \ifdef SOMETHING_FALSE/`endif`, jeśli naprawdę musisz wyłączyć kawałek kodu.
Co powinien zawierać komentarz nagłówkowy w Verilogu?
Większość zespołów umieszcza na początku każdego pliku krótki nagłówek: nazwę modułu, cel w jednym zdaniu, podsumowanie portów, autora i datę oraz historię zmian. Dokładny format bywa różny. Liczy się to, żeby każdy, kto otworzy plik, wiedział, co on robi, bez czytania ciała modułu. Duże projekty dodają też komentarz przy deklaracji każdego portu.