Menu

Comentários em Verilog: linha única, múltiplas linhas e estilo de documentação

Como escrever comentários de linha única e múltiplas linhas em Verilog, mais os padrões de documentação que projetistas digitais usam para manter modules legíveis conforme crescem.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

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:

  1. Prefixe cada linha com //. A maioria dos editores faz isso com um atalho.

  2. 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.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR