As duas formas
Verilog suporta exatamente duas sintaxes de comentário, ambas copiadas do C:
Essa é toda a sintaxe. Não há # como Python, nem -- como VHDL, nem estilo Lisp. Apenas // e /* ... */.
Quando usar cada um
// é o que você usa quase toda vez. É mais curto, não pode ser acidentalmente deixado sem terminar e combina naturalmente com a forma como você escreve Verilog (uma declaração por linha, com o comentário na mesma linha ou adjacente):
output reg [7:0] data, // byte que deslocamos pelo tx_serial
output reg valid, // alto enquanto data está sendo transmitido
input wire ready // consumidor downstream está pronto para aceitar
/* ... */ é principalmente para duas coisas: blocos de cabeçalho grandes no topo de um arquivo e temporariamente desabilitar um trecho de código enquanto depura. O caso de desabilitar é perigoso - continue lendo.
A pegadinha do "sem aninhamento"
Comentários de bloco não aninham. Se você tentar comentar uma região que já contém um comentário de bloco, o primeiro */ fecha o bloco externo, não o interno:
/* externo
/* interno */ // <-- este */ fecha o comentário externo
ainda ativo no fonte para o parser
*/
Resultado: um erro de sintaxe em algum lugar inesperado, numa linha que parece correta.
Quando precisar desabilitar uma região, prefira uma de:
-
Prefixe cada linha com
//. A maioria dos editores faz isso com um atalho. -
Use uma guarda de pré-processador:
`ifdef DISABLED // código que não deve compilar `endif
O segundo padrão também é como você mantém múltiplas configurações de build em um arquivo.
Pragmas de síntese: comentários que não são comentários
Ferramentas de fornecedores usam comentários com formato especial como instruções fora-de-banda. O simulador ainda os ignora, mas a ferramenta de síntese os lê:
// synthesis translate_off
initial begin
$display("setup só para o simulador");
end
// synthesis translate_on
Os dois pragmas dizem à ferramenta de síntese "pule tudo entre estes marcadores". As ortografias exatas variam por fornecedor (synthesis, synopsys, pragma, xilinx, etc.) - veja a documentação da sua ferramenta. O que importa saber: comentários em Verilog às vezes carregam carga.
Convenções de bloco de cabeçalho
Arquivos Verilog de longa duração quase sempre começam com um bloco de cabeçalho. O formato exato é política de equipe, mas um exemplo típico:
// -----------------------------------------------------------------------------
// Module : uart_tx
// Description : Transmissor UART 8-N-1. Aceita um byte em `data` quando `valid`
// é asserido e o desloca em `serial_out`. `baud_tick`
// precisa pulsar uma vez por período de baud.
// Ports : clk - clock do sistema
// reset_n - reset síncrono ativo-baixo
// baud_tick - pulso de 1 ciclo a cada intervalo de baud
// data - byte a transmitir
// valid - asserido para iniciar uma transmissão
// serial_out - o wire que sai do FPGA
// busy - alto enquanto um frame está em trânsito
// Author : example@team
// Revision : 2026-05-26 - versão inicial
// -----------------------------------------------------------------------------
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
);
// ... corpo ...
endmodule
O ponto não é a decoração. O ponto é que alguém abrindo este arquivo daqui a um ano - provavelmente você - pode ler quatro linhas e saber o que ele faz, o que espera e o que produz. Esse retorno escala com o tamanho do projeto.
Comentários inline que ganham o pão
Um erro comum é comentar o que uma linha faz quando o código já mostra:
// ruim - o comentário repete o código
count <= count + 1; // incrementa count
// melhor - o comentário explica por que esta linha está aqui
count <= count + 1; // contador de ciclos free-running para timestamping
A coisa em que comentários são unicamente bons é em explicar o porquê que o código não consegue mostrar por si só: qual seção da spec uma codificação esquisita segue, por que um register é um bit mais largo do que parece, por que um caso default é definido como 'x em vez de '0. Apoie-se neles para isso. Deixe o óbvio para o código.
Experimente
O bloco abaixo contém todas as formas de comentário. Execute-o - a saída não vai surpreender, mas a estrutura do arquivo deve:
Você agora viu todas as formas de comentário que o Verilog suporta. O resto dos docs os usa como você esperaria: blocos de cabeçalho no topo de modules longos, // de linha única ao lado de ports e comentários de bloco só quando há um parágrafo de raciocínio para capturar.
Perguntas frequentes
Como escrevo um comentário em Verilog?
Verilog suporta dois estilos de comentário, ambos herdados do C. // inicia um comentário que vai até o final da linha. /* ... */ envolve um bloco multi-linha. O compilador ignora tudo entre os marcadores; ambos os estilos são igualmente válidos em qualquer arquivo sintetizável ou apenas de simulação.
Comentários em Verilog são sintetizáveis?
Comentários não existem depois do parsing - a ferramenta de síntese os descarta assim como o simulador faz. A única exceção são pragmas de síntese: comentários com formato especial como // synthesis translate_off que ferramentas de fornecedores reconhecem como diretivas. A sintaxe de pragma é específica de ferramenta e não faz parte do Verilog padrão.
Comentários em Verilog podem ser aninhados?
Não - e isso pega iniciantes que tentam comentar um bloco que já contém /* ... */. O primeiro */ de dentro fecha o comentário de fora, deixando o resto do bloco como código vivo. Use // em cada linha, ou envolva a região inteira em \ifdef ALGO_FALSO/`endif` se realmente precisar desabilitar um trecho.
O que um cabeçalho Verilog deve incluir?
A maioria das equipes coloca um pequeno cabeçalho no topo de cada arquivo: nome do module, propósito em uma frase, resumo de ports, autor/data e um histórico de revisões. O formato exato varia; o que importa é que qualquer um abrindo o arquivo consiga dizer o que ele faz sem ler o corpo. Designs grandes adicionam comentários por sinal ao lado de cada declaração de port.