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.
| Sintaxe | Significado |
|---|---|
module adder(...); ... endmodule | Define 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.
| Elemento | O 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.
| Sintaxe | Significado |
|---|---|
4'b1010 | Binário de 4 bits, valor 10 |
8'hFF | Hex de 8 bits, valor 255 |
8'hff | O mesmo - os dígitos hex não diferenciam maiúsculas/minúsculas |
16'd255 | Decimal de 16 bits, valor 255 |
3'o7 | Octal de 3 bits, valor 7 |
8'b1010_1100 | Underscores agrupam dígitos para legibilidade |
1'bx | Um valor de bit desconhecido (x) |
1'bz | Um valor de bit de alta impedância (z) |
Operadores
Operadores bit a bit, lógicos, de comparação e de redução.
| Operador | O 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 |
&bus | AND de redução (AND de todos os bits) |
|bus | OR de redução (OR de todos os bits) |
^bus | XOR 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.
| Sintaxe | Significado |
|---|---|
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.
| Sintaxe | Significado |
|---|---|
always @(*) begin ... end | Ló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 ... end | Executa uma vez no tempo 0 (testbenches, apenas simulação) |
begin ... end | Agrupa várias instruções |
#10 | Atraso de 10 unidades de tempo (apenas simulação) |
Blocking vs non-blocking
Use = para lógica combinacional e <= para lógica sequencial com clock.
| Sintaxe | Significado |
|---|---|
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 bloco | Evite - uma fonte comum de bugs |
Controle de fluxo
Condicionais e ramificações de múltiplos caminhos dentro de blocos procedurais.
| Sintaxe | Significado |
|---|---|
if (cond) ... else ... | Instrução condicional |
if (a) x = 1; else x = 0; | If/else de uma linha |
case (sel) ... endcase | Ramificaçã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ão | Sintaxe |
|---|---|
| Flip-flop D | always @(posedge clk) q <= d; |
| Registrador com reset | always @(posedge clk) if (rst) q <= 0; else q <= d; |
| Contador | always @(posedge clk) count <= count + 1; |
| Registrador de estado da FSM | always @(posedge clk) state <= next_state; |
| Lógica de próximo estado da FSM | always @(*) 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?
Qual é a diferença entre wire e reg?
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?
=) 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.