Menu
Coddy logo textTech

Folha de Consulta Verilog

Última atualização

Estrutura de módulo e portas

Um módulo é o bloco de construção básico - tem um nome e uma lista de portas.

SintaxeSignificado
module adder(...); ... endmoduleDefine um módulo e seu corpo
input clk;Uma porta de entrada
output q;Uma porta de saída
output reg q;Uma saída acionada a partir de um bloco always
input [7:0] data;Um barramento de entrada de 8 bits (vetor)
inout sda;Uma porta bidirecional
adder u1 (.a(x), .b(y), .sum(s));Instancia um módulo por portas nomeadas

Tipos de dados

wire modela uma conexão; reg guarda um valor que o código procedural atribui.

ElementoO que faz
wire w;Um net acionado por assign ou por uma saída de módulo
reg r;Guarda um valor atribuído dentro de um bloco always/initial
wire [3:0] bus;Um vetor de 4 bits (bits 3 a 0)
reg [7:0] count;Um registrador de 8 bits
bus[2]Seleciona um único bit
bus[3:1]Seleciona uma fatia de bits (part-select)
reg mem [0:255];Uma memória: um array de registradores
parameter WIDTH = 8;Uma constante nomeada para o módulo

Literais numéricos

O formato é <size>'<base><value> - tamanho em bits, base como b/o/d/h.

SintaxeSignificado
4'b1010Binário de 4 bits, valor 10
8'hFFHex de 8 bits, valor 255
8'hffO mesmo - os dígitos hex não diferenciam maiúsculas/minúsculas
16'd255Decimal de 16 bits, valor 255
3'o7Octal de 3 bits, valor 7
8'b1010_1100Underscores agrupam dígitos para legibilidade
1'bxUm valor de bit desconhecido (x)
1'bzUm valor de bit de alta impedância (z)

Operadores

Operadores bit a bit, lógicos, de comparação e de redução.

OperadorO que faz
& | ^ ~AND, OR, XOR, NOT bit a bit
&& || !AND, OR, NOT lógico (retornam 1 bit)
== != < > <= >=Operadores de comparação
<< >>Deslocamento à esquerda e à direita
+ - * / %Operadores aritméticos
&busAND de redução (AND de todos os bits)
|busOR de redução (OR de todos os bits)
^busXOR de redução (paridade de todos os bits)
{a, b}Concatenação; {4{1'b1}} replica para 4'b1111

Atribuição contínua

assign aciona um wire continuamente - use-o para lógica combinacional.

SintaxeSignificado
assign y = a & b;Aciona y com o AND de a e b
assign sum = a + b;Calcula uma soma continuamente
assign y = sel ? a : b;Ternário - um multiplexador 2-para-1
assign {c, s} = a + b;Captura o carry e a soma juntos
assign y = ~en;Aciona um wire a partir de um sinal invertido

Blocos procedurais

always e initial executam instruções; a lista de sensibilidade controla quando.

SintaxeSignificado
always @(*) begin ... endLógica combinacional (qualquer mudança de entrada)
always @(posedge clk)Executa a cada borda de subida do clock (sequencial)
always @(negedge clk)Executa a cada borda de descida do clock
always @(posedge clk or posedge rst)Bloco com clock e reset assíncrono
initial begin ... endExecuta uma vez no tempo 0 (testbenches, apenas simulação)
begin ... endAgrupa várias instruções
#10Atraso de 10 unidades de tempo (apenas simulação)

Blocking vs non-blocking

Use = para lógica combinacional e <= para lógica sequencial com clock.

SintaxeSignificado
a = b;Blocking - executa em ordem, imediatamente
a <= b;Non-blocking - todos os RHS são lidos primeiro, depois atribuídos
always @(*) y = a & b;Combinacional: use o blocking =
always @(posedge clk) q <= d;Um flip-flop: use o non-blocking <=
Misturar = e <= em um mesmo blocoEvite - uma fonte comum de bugs

Controle de fluxo

Condicionais e ramificações de múltiplos caminhos dentro de blocos procedurais.

SintaxeSignificado
if (cond) ... else ...Instrução condicional
if (a) x = 1; else x = 0;If/else de uma linha
case (sel) ... endcaseRamificação de múltiplos caminhos por valor
2'b00: y = a;Um item de case
default: y = 0;Item de case de fallback
for (i = 0; i < 8; i = i + 1)Laço (geralmente dentro de generate ou simulação)
repeat (4) @(posedge clk);Repete uma instrução N vezes

Padrões comuns

Blocos de construção que você escreve repetidamente, além de tarefas de testbench.

PadrãoSintaxe
Flip-flop Dalways @(posedge clk) q <= d;
Registrador com resetalways @(posedge clk) if (rst) q <= 0; else q <= d;
Contadoralways @(posedge clk) count <= count + 1;
Registrador de estado da FSMalways @(posedge clk) state <= next_state;
Lógica de próximo estado da FSMalways @(*) case (state) ... endcase
Exibir um valor$display("q = %b", q);
Exibir ao mudar$monitor("t=%0t q=%b", $time, q);
Encerrar a simulação$finish;

Cada pedaço da sintaxe de Verilog que você usa, em uma única página. Esta folha de consulta Verilog é uma referência rápida para a linguagem de descrição de hardware - declarar módulos e portas, escolher tipos de dados, escrever lógica combinacional e sequencial, e os padrões de bloco always que descrevem circuitos reais.

A sintaxe aqui é Verilog padrão (IEEE 1364) e funciona em simuladores comuns como o Icarus Verilog e o Verilator. Copie o que precisar ou teste ao vivo no playground de Verilog - escreva um módulo, simule-o e veja a saída no seu navegador.

Perguntas frequentes sobre a folha de consulta Verilog

Esta folha de consulta Verilog é gratuita?
Sim. Esta folha de consulta Verilog é totalmente gratuita, sem necessidade de cadastro. Salve nos favoritos e volte sempre que precisar consultar uma sintaxe, um operador ou um padrão de bloco always.
Qual é a diferença entre wire e reg?
Um wire modela uma conexão física e precisa ser acionado continuamente - por uma instrução assign ou por uma saída de módulo - então você o usa para nets combinacionais. Um reg mantém seu valor até que o código procedural o altere, então você o usa para qualquer coisa atribuída dentro de um bloco always ou initial. Apesar do nome, um reg nem sempre se torna um registrador de hardware; ele apenas significa que o valor é definido proceduralmente.
Qual é a diferença entre atribuição blocking e non-blocking?
A atribuição blocking (=) executa imediatamente e em ordem, como uma instrução de programação normal, então use-a para lógica combinacional em blocos always @(*). A atribuição non-blocking (<=) avalia primeiro todos os lados direitos e depois atualiza os lados esquerdos juntos, o que modela corretamente flip-flops - então use-a em blocos always @(posedge clk) com clock. Misturar os dois em um mesmo bloco é uma fonte clássica de bugs de simulação.
Posso praticar Verilog online?
Sim. Abra o playground de Verilog para escrever um módulo, simulá-lo e ver a saída no seu navegador - sem nada para instalar. Quando quiser estrutura, o curso interativo e gratuito de Verilog da Coddy leva você passo a passo de módulos e tipos de dados a blocos always e máquinas de estados finitos.
Esta folha de consulta é boa para iniciantes?
Sim. Ela está organizada dos fundamentos (módulos, portas e tipos de dados) até a lógica sequencial e os padrões de FSM, de modo que você pode começar pelas seções de cima e ir avançando até descrever circuitos reais.
Coddy programming languages illustration

Aprenda Verilog com a Coddy

COMEÇAR