Menu
Coddy logo textTech

Always Block

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

O @(sensitivity_list) informa ao block quando executar. Sem ele (e sem nenhum atraso, como #5 dentro dele), o block entraria em um 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 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 + 1Obtenha o valor atual de count, adicione 1 e armazene-o novamente

O bloco é executado a cada rising da clock. A cada vez, count aumenta em 1.

A lista de sensibilidade @(posedge clk) faz com que ele seja executado apenas nas bordas do clock, não continuamente. Sem isso, o loop seria executado 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 é executado quando a ou b changes.

challenge icon

Desafio

Add o bloco always ausente para fazer este module funcionar.

Como funciona:

  • A cada rising clock edge, out1 toggles (inverte) de 0 para 1 ou de 1 para 0
  • out2 follows out1 (tem o mesmo valor que out1)

O que fazer:

  1. Add um bloco always @(posedge clk)
  2. Dentro dele, faça com que out1 toggles (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