Menu
Coddy logo textTech

Bloco Always

Parte da seção Fundamentos do Journey de Verilog da Coddy. Lição 46 de 90.

Um bloco procedural é um bloco de código em que as instruções são executadas uma após a outra, em sequência, assim como nas linguagens de programação de software, como C ou Python. Verilog tem dois blocos procedurais: initial (é executado uma vez) e always (é executado continuamente). Vamos começar com o bloco always.

O bloco always é executado continuamente. Ele se repete para sempre assim que a simulação começa. Ele é usado para descrever hardware que precisa continuar funcionando, como flip-flops, contadores e lógica combinacional.

Sintaxe básica:

always @(sensitivity_list) begin
  // Código que é executado repetidamente
end

A @(sensitivity_list) informa ao bloco quando executar. Sem ela (e sem nenhum atraso, como #5 dentro dele), o bloco entraria em um loop infinito e travaria a simulação.

Exemplo de bloco always: contador

Aqui está um exemplo de como podemos usar o bloco always para criar um contador.

module counter (
  input clk,
  output reg [3:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

Como Este Código Funciona

ParteSignificado
alwaysExecute este código repetidamente, para sempre
@(posedge clk)Aguarde o clock passar de 0 para 1 (borda de subida)
count <= count + 1Pegue o valor atual de count, adicione 1 e armazene-o novamente

O bloco é executado a cada borda de subida do clock. A cada vez, count aumenta em 1.

A lista de sensibilidade @(posedge clk) indica que ele deve ser executado apenas nas bordas do clock, não continuamente. Sem isso, o loop seria executado para sempre, sem atraso.

Bloco always com vários sinais

Você pode listar sinais específicos:

always @(a or b) begin
  out = a & b;
end

Isso é executado quando a ou b muda.

challenge icon

Desafio

Adicione o bloco always ausente para fazer este módulo funcionar.

Como funciona:

  • A cada borda de subida do clock, out1 alterna (inverte) de 0 para 1 ou de 1 para 0
  • out2 acompanha out1 (mesmo valor que out1)

O que fazer:

  1. Adicione um bloco always @(posedge clk)
  2. Dentro dele, faça out1 alternar (use out1 = ~out1)
  3. Faça out2 ser igual a out1

Experimente você mesmo

module toggler (
  input clk,
  output reg out1,
  output reg out2
);

  initial begin
    out1 = 0;
    out2 = 0;
  end

  // TODO: Adicione o bloco always com posedge clk
  // out1 alterna a cada clock
  // out2 segue out1

endmodule
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos

Pratique por conta própria: Compilador de Verilog online