Dominando Fluxo de Controle em Verilog: IF-ELSE, Case, Loops e Mais
Comportamento de hardware não pode ser implementado sem instruções condicionais e outras formas de controlar o fluxo de lógica. Verilog possui um conjunto de blocos e mecanismos de controle de fluxo para isso.
if-else-if
Esta instrução condicional decide se certas instruções devem ser executadas ou não. Muito semelhante ao if-else-if em C. Se a expressão for verdadeira, a primeira instrução executa. Se falsa e existir parte else, esta será executada.
// if sem parte else
if (expressao) [instrucao]
// if com parte else
if (expressao) [instrucao] else [instrucao]
// if-else para múltiplas instruções deve usar begin-end
if (expressao) begin [múltiplas instruções] end
else begin [múltiplas instruções] end
// if-else-if
if (expressao) [instrucao]
else if (expressao) [instrucao]
else [instrucao]
A parte else é opcional e pode causar confusão se omitida em if aninhados. Para evitar isso, associe o else ao if anterior que não tem else, ou use blocos begin-end. O último else trata o caso padrão onde nenhuma condição foi satisfeita.
Clique aqui para ler mais sobre if-else-if
Loops permitem executar instruções simples ou múltiplas dentro de um bloco uma ou mais vezes. Existem quatro tipos de loops em Verilog.
Loop forever
Executa continuamente as instruções dentro do bloco.
forever [instrucao]
forever begin [múltiplas instruções] end
Exemplo
module my_design;
initial begin
forever begin
$display ("Isto será impresso para sempre, a simulação pode travar ...");
end
end
endmodule
Log de Simulação
ncsim> run This will be printed forever, simulation can hang ... This will be printed forever, simulation can hang ... ... This will be printed forever, simulation can hang ... Result reached the maximum of 5000 lines. Killing process.
Loop repeat
Executa instruções um número fixo de vezes. Se a expressão for X ou Z, trata como zero e não executa.
repeat ([num_vezes]) begin [instruções] end
repeat ([num_vezes]) @ ([algum_evento]) begin [instruções] end
Exemplo
module my_design;
initial begin
repeat(4) begin
$display("Esta é uma nova iteração ...");
end
end
endmodule
Log de Simulação
ncsim> run This is a new iteration ... This is a new iteration ... This is a new iteration ... This is a new iteration ... ncsim: *W,RNQUIE: Simulation is complete.
Loop while
Executa instruções enquanto uma expressão for verdadeira e sai quando a condição se torna falsa. Se a condição for falsa desde o início, as instruções não executam.
while (expressao) begin [instruções] end
Exemplo
module my_design;
integer i = 5;
initial begin
while (i > 0) begin
$display ("Iteração#%0d", i);
i = i - 1;
end
end
endmodule
Log de Simulação
ncsim> run Iteration#5 Iteration#4 Iteration#3 Iteration#2 Iteration#1 ncsim: *W,RNQUIE: Simulation is complete.
Loop for
for (atribuicao_inicial; condicao; incremento_variavel) begin [instruções] end
Controla instruções em três etapas:
- Inicializa variável de contador do loop
- Avalia a expressão, geralmente envolvendo o contador
- Incrementa contador para que a expressão se torne falsa e o loop saia
Exemplo
module my_design;
integer i = 5;
initial begin
for (i = 0; i < 5; i = i + 1) begin
$display ("Loop #%0d", i);
end
end
endmodule
Log de Simulação
ncsim> run Loop #0 Loop #1 Loop #2 Loop #3 Loop #4 ncsim: *W,RNQUIE: Simulation is complete.
Clique aqui para ler mais sobre loops for.
Verilog
- Expressões, Instruções e Blocos em C#: Guia Completo com Exemplos Práticos
- Entendendo Expressões, Instruções e Blocos em Java
- 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 Fluxo de Controle em Verilog: IF-ELSE, Case, Loops e Mais
- Dominando Funções em Verilog para Design RTL Eficiente
- Entendendo Tasks em Verilog: Funções vs Tasks, Sintaxe e Uso
- Entendendo Controle de Atraso em Verilog: Técnicas de Timing e Boas Práticas