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 onde as instruções são executadas uma após a outra, em sequência — assim como em linguagens de programação de software como C ou Python. O Verilog possui dois blocos procedurais: initial (executa uma vez) e always (executa continuamente). Vamos começar com o bloco always.

O bloco always executa 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 executa repetidamente
end

O @(sensitivity_list) informa ao bloco quando executar. Sem isso, o bloco entraria em 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
alwaysExecuta este código repetidamente, para sempre
@(posedge clk)Aguarda o clock ir de 0 para 1 (borda de subida)
count = count + 1Pega o valor atual de count, adiciona 1 e o armazena de volta

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

A lista de sensibilidade @(posedge clk) diz para executar apenas nas bordas de clock, não continuamente. Sem isso, o loop rodaria para sempre sem atraso.

Bloco Always com Múltiplos 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 que falta para fazer este módulo funcionar.

Como funciona:

  • Em cada borda de subida do clock, out1 alterna (inverte) de 0 para 1 ou de 1 para 0
  • out2 segue 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 igual a out1

Folha de consulta

O bloco always executa continuamente e é usado para descrever hardware como flip-flops e contadores.

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

@(posedge clk) dispara na borda de subida do clock; @(a or b) dispara quando qualquer sinal listado muda.

// Contador: incrementa a cada borda de subida do clock
always @(posedge clk) count = count + 1;

// Combinacional: executa quando a ou b muda
always @(a or b) begin
  out = a & b;
end

Nota: saídas acionadas por blocos always devem ser declaradas como reg.

Experimente você mesmo

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

  initial begin
    out1 = 0;
    out2 = 0;
  end

  // TODO: Adicionar 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