Menu
Coddy logo textTech

Atribuição Bloqueante

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

Verilog tem dois tipos de atribuições procedurais: bloqueante (=) e não bloqueante (<=). Nesta lição, vamos nos concentrar 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 Atribuição Bloqueante

A atribuição bloqueante (=) é usada para lógica combinacional: circuitos em que 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

Atribuição bloqueante 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 é adequado para a lógica combinacional.

Bloqueante vs. no bloqueante

 Bloqueante (=)No bloqueante (<=)
ExecuçãoUma após a outraTodas ao mesmo tempo
A próxima linha espera?SimNão
UsosLógica combinacionalLógica sequencial (flip-flops)

Importante: não use atribuição bloqueante para flip-flops

challenge icon

Desafio

Adicione as atribuições bloqueantes ausentes 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)

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

Pratique por conta própria: Compilador de Verilog online