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 — exatamente 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 é executado continuamente — ele se repete para sempre assim que a simulação é iniciada. Ele é usado para descrever hardware que precisa continuar executando, como flip-flops, contadores e lógica combinacional.

Sintaxe básica:

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

O @(sensitivity_list) diz ao block quando executar. Sem ele (e sem nenhum atraso como #5 dentro), o block entraria em loop infinito e travaria a simulação.

Exemplo de Bloco Always: Counter

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

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 ir de 0 para 1 (borda de subida)
count <= count + 1Pegue o valor atual de count, adicione 1 e armazene-o de volta

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

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

Bloco Always com Múltiplos Sinais

Você pode listar sinais específicos:

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

Isso executa quando a ou b muda.

challenge icon

Desafio

Adicione o bloco always que está faltando para fazer este módulo funcionar.

Como funciona:

  • A cada borda de subida do clock, out1 altera seu estado de 0 para 1 ou de 1 para 0
  • out2 segue out1 (mesmo valor de 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 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