Verilog - Em uma casca de noz
Todo o código comportamental é escrito dentro de
module
e endmodule
. Portanto, seja qual for o design digital que você pretende criar, ele ficará dentro de um module
quadra. Pode ou não ter portas definidas - permite que os sinais entrem no bloco como input
ou escape do bloco como output
. Módulo
O módulo vazio no exemplo abaixo é chamado de testbench . Você pode nomeá-lo como quiser, exceto que deve ser alfanumérico e pode conter '_'.
module testbench;
endmodule
Vejamos outro módulo. Tem alguns sinais (d, clk, rstb ) declarados como entradas e q declarado como 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 o módulo testbench mais uma vez. Existem basicamente dois tipos de tipos de dados em verilog:
- reg
- fio
reg
tipo de dados é usado para manter valores como uma variável, enquanto um wire
é apenas análogo a um fio elétrico, que deve ser acionado continuamente. Então, normalmente wire
é usado para conectar vários módulos e outros sinais.
module testbench;
reg d;
reg rst_b;
reg clk;
wire q;
endmodule
Tarefas
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çar |
assign [LHS] =[RHS] | O valor do LHS será atualizado sempre que o RHS for alterado |
Existem algumas regras a serem lembradas ao escrever Verilog:
reg
pode ser atribuído apenas eminitial
ealways
blocoswire
pode ser atribuído um valor somente viaassign
declaração- Se houver várias instruções em uma inicial/sempre bloco, eles devem ser encapsulados 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
Observação o seguinte do exemplo mostrado acima:
- Como há várias linhas para
initial
bloquear, começar e fim são usados - Os sinais d, rst_b e clk são atribuídos em um bloco inicial, pois são do tipo
reg
- O código dentro do bloco inicial será executado em 0ns, ou seja, no início da simulação
- Como não há condição para o
always
bloco, ele será executado como um loop infinito em C - # é usado para representar o atraso de tempo. #10 diz ao simulador para avançar o tempo de simulação em 10 unidades.
clk = ~clk;
irá alternar o valor de clock, e porque #10 for colocado antes da instrução, o relógio será alternado a cada 10 unidades de tempo.$finish
é a maneira de terminar uma simulação. Nesse caso, ele será executado por 100 unidades de tempo e será encerrado.
Verilog