Verilog Essencial: Visão Geral Concisa
Todo código comportamental é escrito dentro de module e endmodule. Portanto, qualquer design digital que você pretenda criar, entrará dentro de um bloco module. Ele pode ou não ter portas definidas - permitindo que sinais entrem no bloco como input ou saiam do bloco como output.
Módulo
O módulo vazio no exemplo abaixo é chamado testbench. Você pode nomeá-lo como quiser, exceto que deve ser alfanumérico e pode conter '_'.
module testbench;
endmodule
Vamos olhar para outro módulo. Ele tem alguns sinais (d, clk, rstb) declarados como entradas e q declarado como uma saída.
module dff (input d, clk, rstb, output q);
endmodule
Tipos de Dados
Agora que vimos como um módulo se parece, vamos ver o que pode ser colocado dentro de um módulo, olhando para o módulo testbench mais uma vez. Existem principalmente dois tipos de tipos de dados em verilog:
- reg
- wire
Um tipo de dado reg é usado para reter valores como uma variável, enquanto um wire é apenas análogo a um fio elétrico, que tem que ser conduzido continuamente. Então tipicamente wire é usado para conectar entre múltiplos módulos e outros sinais.
module testbench;
reg d;
reg rst_b;
reg clk;
wire q;
endmodule
Atribuições
Verilog tem três blocos básicos:
always @ (condição) |
sempre executado quando a condição é satisfeita |
initial |
será executado apenas uma vez, quando a simulação começa |
assign [LHS] = [RHS] |
Valor de LHS será atualizado sempre que RHS mudar |
Existem algumas regras para manter em mente ao escrever Verilog:
regpode ser atribuído apenas em blocosinitialealwayswirepode ser atribuído um valor apenas via instruçãoassign- Se houver múltiplas instruções em um bloco initial/always, elas devem ser envolvidas em
begin .. end
module testbench;
reg d;
reg rst_b;
reg clk;
wire q;
initial begin
d = 0;
rst_b = 0;
clk = 0;
#100 $finish;
end
always begin
#10 clk = ~clk;
end
endmodule
Note o seguinte do exemplo mostrado acima:
- Como há múltiplas linhas para o bloco
initial, begin e end são usados - Sinais d, rst_b e clk são atribuídos dentro de um bloco initial, porque são do tipo
reg - Código dentro do bloco initial será executado em 0ns, ou seja, início da simulação
- Como não há condição para o bloco
always, ele rodará como um loop infinito em C - # é usado para representar atraso de tempo. #10 diz ao simulador para avançar o tempo de simulação em 10 unidades.
clk = ~clk;irá alternar o valor do clock, e porque #10 é colocado antes da instrução, o clock será alternado a cada 10 unidades de tempo.$finishé a maneira de terminar uma simulação. Neste caso, rodará por 100 unidades de tempo e sairá.
Verilog
- Domine o Verilog: Tutorial Completo para Projeto de Circuitos Digitais
- Dominando Concatenação Verilog: Guia Prático
- Entendendo Atribuições em Verilog: Tipos, Sintaxe e Boas Práticas
- Verilog Blocking vs Non-Blocking: Diferenças Essenciais Explicadas
- Dominando Funções em Verilog para Design RTL Eficiente
- Entendendo Tasks em Verilog: Funções vs Tasks, Sintaxe e Uso
- Dominando Referência Hierárquica em Verilog: Evite Colisão de Nomes em Módulos e Blocos
- Gerador de Clock Verilog: Guia de Design e Implementação
- Dominando Funções Matemáticas do Verilog para Design de Hardware Eficiente
- Dominando $timeformat do Verilog: Precisão e Controle de Exibição