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
endTodas 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
endAmbas as atribuições acontecem ao mesmo tempo, usando values de antes da clock edge.
Resumo
| Regra | Explicação |
|---|---|
Use <= para lógica sequencial | always @(posedge clk) |
Use = para lógica combinacional | always @(*) |
| Não bloqueante executa em paralelo | Todas as atribuições acontecem de uma vez |
| Os valores atualizam no final do passo de tempo | Não imediatamente |
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,q1recebed q2recebe o valor antigo deq1
O que fazer:
- Atribua
daq1(não-bloqueante) - Atribua
q1aq2(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
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