Menu
Coddy logo textTech

Atribuição Não Bloqueante

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

Na lição anterior, abordamos a atribuição bloqueante (=), que é executada passo a passo. Agora abordaremos a atribuição não bloqueante (<=), que é executada toda de uma vez, em paralelo.

A atribuição não bloqueante usa o operador <=. Ela é chamada de "não bloqueante" porque não bloqueia a execução da próxima instrução. Todas as atribuições não bloqueantes em um bloco são executadas ao mesmo tempo.

Sintaxe:

variable <= expression;

Quando usar atribuição não bloqueante

A atribuição não bloqueante (<=) é usada para lógica sequencial: circuitos que usam um clock e têm memória. As saídas mudam somente em uma borda do clock (geralmente na borda de subida).

Exemplos de lógica sequencial:

  • Flip-flops
  • Registradores
  • Contadores
  • Máquinas de estados
  • Registradores de deslocamento

Exemplo de Verilog:

initial begin
  a <= 5;      // Agendado, mas ainda não executado
  b <= a + 2;  // Agendado, usa o valor ANTIGO de a
  c <= b * 3;  // Agendado, usa o valor ANTIGO de b
end

As três atribuições acontecem ao mesmo tempo usando os valores antigos. No final do passo de tempo, todas as atualizações acontecem juntas.

Não bloqueante em blocos Always (lógica sequencial)

Não bloqueante é usado para lógica sequencial: circuitos que usam um clock e têm memória (flip-flops, registradores, contadores).

always @(posedge clk) begin
  q <= d;           // q recebe d na borda do clock
  count <= count + 1; // count incrementa na borda do clock
end

Ambas as atribuições acontecem ao mesmo tempo, usando os valores anteriores à borda do clock.

Resumo

RegraExplicação
Use <= para lógica sequencialalways @(posedge clk)
Use = para lógica combinacionalalways @(*)
A atribuição não bloqueante é executada em paraleloTodas as atribuições acontecem ao mesmo tempo
Os valores são atualizados no final do passo de tempoNão imediatamente
challenge icon

Desafio

Conclua a atribuição não bloqueante

Adicione as atribuições não bloqueantes que faltam para fazer este registrador de deslocamento de 2 bits funcionar.

Como funciona:

  • Em cada borda do clock, q1 recebe d
  • q2 recebe o valor antigo de q1

O que fazer:

  1. Atribua d a q1 (não bloqueante)
  2. Atribua q1 a q2 (não bloqueante)

Experimente você mesmo

module shift_register (
  input clk,
  input reset,
  input d,
  output reg q1,
  output reg q2
);
  
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      q1 <= 0;
      q2 <= 0;
    end else begin
      // TODO: Adicionar lógica de deslocamento
      // Passo 1: Atribuir d a q1 (non-blocking)
      // Passo 2: Atribuir q1 a q2 (non-blocking)
    end
  end
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