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, cobrimos a atribuição bloqueante (=), que é executada passo a passo. Agora vamos cobrir a atribuição não bloqueante (<=), que é executada toda de uma vez — em paralelo.

A atribuição não bloqueante usa o operador <=. É 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 Non-Blocking

Atribuição non-blocking (<=) é usada para lógica sequencial — circuitos que usam um clock e possuem memória. Saídas mudam apenas em uma borda de clock (geralmente a borda de subida).

Exemplos de lógica sequencial:

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

Exemplo em 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

Todas 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.

Non-Blocking em Bloco Always (Lógica Sequencial)

Non-blocking é usado para lógica sequencial — circuitos que usam um clock e possuem 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 values de antes da clock edge.

Resumo

RegraExplicação
Use <= para lógica sequencialalways @(posedge clk)
Use = para lógica combinacionalalways @(*)
Não bloqueante executa em paraleloTodas as atribuições acontecem de uma vez
Os valores atualizam no final do passo de tempoNão imediatamente
challenge icon

Desafio

Complete 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 de 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 (não-bloqueante)
      // Passo 2: Atribuir q1 a q2 (não-bloqueante)
    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