Sensitivity List
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 list de sensibilidade é um conjunto de signals ou eventos que aciona o bloco always. when qualquer signal na list changes, o bloco executes.
Sintaxe:
always @(sensitivity_list) begin
// O código é executado quando os sinais na lista mudam
endTipos de lista de sensibilidade
| Tipo | Sintaxe | when o bloco executes |
|---|---|---|
| Todos os signals (combinacional) | always @(*) | when qualquer signal interno changes |
| signals específicos | always @(a or b) | when a ou b changes |
| Disparo por edge (Sequential) | always @(posedge clk) | Na rising edge de clock |
| Vários edge | always @(posedge clk or posedge reset) | Na edge de clock ou na edge de 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, o output não será atualizado na simulação quando esse sinal mudar, então 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;
endRuns na edge de clock ou edge de reset.
Erros comuns
| Erro | Por que está errado |
|---|---|
always @(a or b or c), mas usa d | d ausente → output fica desatualizado na simulação (incompatibilidade entre sim/synth) |
always @(posedge clk or reset) | posedge ausente para reset |
always @(clk) | Deve 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 projeto4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicPratique por conta própria: Compilador de Verilog online