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
endBloqueio em Blocos Always (Lógica Combinacional)
always @(*) begin
temp = a & b; // Passo 1
out = temp | c; // Passo 2 (usa temp do passo 1)
endA ordem importa. Isso funciona bem para lógica combinacional.
Bloqueante vs Não-Bloqueante
Bloqueante (=) | Não-bloqueante (<=) | |
|---|---|---|
| Execução | Um após o outro | Todos de uma vez |
| A próxima linha espera? | Sim | Não |
| Usos | Lógica combinacional | Lógica sequencial (flip-flops) |
Importante: Não use atribuições bloqueantes para Flip-Flops
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:
- Atribua o valor de
xatemp(salve x em temp) - Atribua o valor de
yax(mova y para x) - Atribua o valor de
tempay(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)
endBloqueante (=) |
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
endmoduleEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1Introdução
O que é VerilogHardware vs SoftwareNíveis de Abstração de ProjetoSeu Primeiro MóduloComentários4Operadores Parte 1
Operadores AritméticosOperador de MóduloOperadores de ComparaçãoRecapitulação - Matemática SimplesOperadores Bitwise7Atribuição e Portas Lógicas
Atribuição ContínuaAtribuição com OperadoresPrimitivas de Portas IntegradasPortas AND, OR e NOTPortas XOR e XNORRecapitulação - Circuito de Portas Lógicas10Tomada de Decisão
Instrução IfIf - ElseRecapitulação - Comparador SimplesInstrução CaseCasex e CasezRecapitulação - Projeto de ALU2Tipos de Dados
Tipo WireTipo RegInteger e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores Parte 2
Operadores LógicosOperadores de ReduçãoOperadores de DeslocamentoOperador de ConcatenaçãoOperador CondicionalRecapitulação - Desafio de Operadores3Sistemas de Numeração
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRecapitulação - Formatos de Números6Módulos
Estrutura de MóduloPortas de Entrada e SaídaPortas InoutInstanciação de MóduloMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação - Construa um Módulo9Blocos Procedurais
Bloco AlwaysBloco InitialLista de SensibilidadeAtribuição BloqueanteAtribuição Não BloqueanteRecapitulação - Always vs Initial