Lista de Sensibilidade
Parte da seção Fundamentos do Journey de Verilog da Coddy. Lição 48 de 90.
A lista de sensibilidade informa ao bloco always quando executar. Ela é escrita dentro de parênteses após o símbolo @.
A lista de sensibilidade é um conjunto de sinais ou eventos que acionam o bloco always. Quando qualquer sinal da lista muda, o bloco é executado.
Sintaxe:
always @(sensitivity_list) begin
// O código é executado quando os sinais na lista mudam
endTipos de lista de sensibilidade
| Tipo | Sintaxe | Quando o bloco é executado |
|---|---|---|
| Todos os sinais (combinacional) | always @(*) | Quando qualquer sinal interno muda |
| Sinais específicos | always @(a or b) | Quando a ou b muda |
| Disparo por borda (sequencial) | always @(posedge clk) | Na borda de subida do clock |
| Múltiplas bordas | always @(posedge clk or posedge reset) | Na borda do clock ou na borda do reset |
Opção 1: Todos os sinais (*)
A opção mais segura e comum para lógica combinacional.
always @(*) begin
out = a & b; // Executa quando a ou b mudam
endO * inclui automaticamente todos os sinais lidos no bloco.
Opção 2: Sinais específicos
always @(a or b) begin
out = a & b; // Executa quando a ou b mudam
endSe você esquecer um sinal, a saída não será atualizada na simulação quando esse sinal mudar, portanto a simulação não corresponderá mais ao hardware sintetizado.
Opção 3: Disparo por borda (posedge)
always @(posedge clk) begin
q <= d; // Executa na borda de subida do clock
endUse posedge para a borda de subida e negedge para a borda de descida.
Opção 4: Múltiplas Bordas
always @(posedge clk or posedge reset) begin
if (reset)
q <= 0;
else
q <= d;
endÉ executado na borda do clock ou na borda de reset.
Erros comuns
| Erro | Por que está errado |
|---|---|
always @(a or b or c) mas usa d | d ausente → a saída fica desatualizada na simulação (incompatibilidade entre simulação e síntese) |
always @(posedge clk or reset) | Falta posedge para o reset |
always @(clk) | Deveria usar posedge clk para flip-flops |
Desafio
O que fazer:
- Adicione a lista de sensibilidade correta para fazer este flip-flop funcionar. O bloco deve ser executado na borda de subida de
clk.
Experimente você mesmo
module flipflop (
input clk,
input d,
output reg q
);
always @(______) begin
q <= d;
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. SoftwareSeu primeiro móduloComentáriosNíveis de abstração de projeto4Operadores Parte 1
Operadores aritméticosOperador móduloOperadores de comparaçãoRecapitulação - Matemática simplesOperadores bit a bit7Atribuições e Portas
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ões
Declaração IfIf - ElseRevisão - Comparador SimplesDeclaração CaseCasex e CasezRevisão - Projeto de ALU2Tipos de Dados
Tipo WireTipo RegInteiro e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores - Parte 2
Operadores lógicosOperadores de reduçãoOperadores de deslocamentoOperador de concatenaçãoOperador condicionalRevisão - Desafio de operadores3Sistema Numérico
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRevisão - Formatos Numéricos6Módulos
Estrutura de MódulosPortas de Entrada e SaídaPortas InoutInstanciação de MódulosMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação — Construindo um Módulo9Blocos Procedurais
Bloco AlwaysBloco InitialLista de SensibilidadeAtribuição BloqueanteAtribuição Não BloqueanteRevisão - Always vs InitialPratique por conta própria: Compilador de Verilog online