Menu
Coddy logo textTech

Atribuição Bloqueante

Parte da seção Fundamentos do Journey de Verilog da Coddy — lição 49 de 90.

O Verilog possui dois tipos de atribuições procedimentais: bloqueante (=) e não-bloqueante (<=). Nesta lição, focamos na atribuição bloqueante.

A atribuição bloqueante usa o operador =. Ela é chamada de "bloqueante" porque bloqueia a execução da próxima instrução até que a atribuição atual seja concluída. O código é executado passo a passo, em ordem.

Sintaxe:

variable = expression;

Quando usar a atribuição bloqueante

A atribuição bloqueante (=) é usada para lógica combinacional — circuitos onde as saídas mudam imediatamente quando as entradas mudam, sem clock e sem memória.

Exemplos de lógica combinacional:

  • Portas AND / OR / XOR
  • Somadores e subtratores
  • Multiplexadores
  • Decodificadores

Exemplo de Verilog:

always @(*) begin
  sum = a + b;      // Atribuição bloqueante
  carry = a & b;    // Atribuição bloqueante
end

Bloqueio em Blocos Always (Lógica Combinacional)

always @(*) begin
  temp = a & b;    // Passo 1
  out = temp | c;  // Passo 2 (usa temp do passo 1)
end

A ordem importa. Isso funciona bem para lógica combinacional.

Bloqueante vs Não-Bloqueante

 Bloqueante (=)Não-bloqueante (<=)
ExecuçãoUm após o outroTodos de uma vez
A próxima linha espera?SimNão
UsosLógica combinacionalLógica sequencial (flip-flops)

Importante: Não use atribuições bloqueantes para Flip-Flops

challenge icon

Desafio

Adicione as atribuições bloqueantes que faltam para trocar os valores de x e y usando uma variável temporária.

O que fazer:

  1. Atribua o valor de x a temp (salve x em temp)
  2. Atribua o valor de y a x (mova y para x)
  3. Atribua o valor de temp a y (mova o x salvo para y)

Folha de consulta

Atribuição bloqueante (=) executa sequencialmente — cada instrução é concluída antes que a próxima comece. Usada para lógica combinacional dentro de blocos always @(*).

always @(*) begin
  temp = a & b;    // Passo 1
  out = temp | c;  // Passo 2 (usa temp atualizado)
end
Bloqueante (=) Não bloqueante (<=)
Execução Uma após a outra Todas de uma vez
Uso para Lógica combinacional Lógica sequencial (flip-flops)

Experimente você mesmo

module swap;
  reg x, y;
  reg temp;
  
  initial begin
    x = 1;
    y = 0;
    
    $display("Before swap: x=%d, y=%d", x, y);
    
    // TODO: Passo 1 - Atribuir x a temp
    
    // TODO: Passo 2 - Atribuir y a x
    
    // TODO: Passo 3 - Atribuir temp a y
    
    $display("After swap: x=%d, y=%d", x, y);
    $finish;
  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