Entendendo Atrasos de Porta em Verilog: Timing Preciso para Designs Digitais Confiáveis
Elementos digitais são entidades binárias que guardam apenas 0 ou 1. Porém a transição de 0 para 1 e 1 para 0 tem atraso transicional, assim como cada elemento de porta para propagar valor da entrada para saída.
Exemplo: porta AND de duas entradas deve comutar saída para 1 se ambas entradas tornam-se 1 e voltar a 0 quando qualquer entrada torna-se 0. Esses atrasos de porta e pino-a-pino podem ser especificados em Verilog ao instanciar primitivas lógicas.
Atrasos de Subida, Descida e Desligamento
Tempo para saída de porta mudar de algum valor para 1 = rise delay (atraso de subida). Tempo para mudar para 0 = fall delay (atraso de descida). Tempo para mudar para alta impedância = turn-off delay (atraso de desligamento).
Estes atrasos aplicam-se a qualquer sinal (todos podem subir/descer em circuitos reais), não restritos a saídas de portas. Três formas de representar atrasos de porta; formato de dois atrasos aplica-se a maioria das primitivas cujas saídas não transicionam para alta impedância. Formato de três atrasos não se aplica a porta AND pois saída não vai para Z para nenhuma combinação de entrada.
// Atraso único - usado para os três tipos de transição
or #(<atraso>) o1 (out, a, b);
// Dois atrasos - Rise e Fall
or #(<rise>, <fall>) o1 (out, a, b);
// Três atrasos - Rise, Fall e Turn-off
or #(<rise>, <fall>, <turn_off>) o1 (out, a, b);
Se apenas um atraso especificado, todos três tipos usam o mesmo valor. Se dois, primeiro = rise, segundo = fall. Se três, representam rise, fall e turn-off respectivamente.
Formato de Um Atraso
module des (
input a, b,
output out1, out2
);
// AND gate com 2 unidades de atraso
and #(2) o1 (out1, a, b);
// BUFIF0 gate com 3 unidades de atraso
bufif0 #(3) b1 (out2, a, b);
endmodule
module tb;
reg a, b;
wire out1, out2;
des d0 (.out1(out1), .out2(out2), .a(a), .b(b));
initial begin
{a, b} <= 0;
$monitor ("T=%0t a=%0b b=%0b and=%0b bufif0=%0b", $time, a, b, out1, out2);
#10 a <= 1;
#10 b <= 1;
#10 a <= 0;
#10 b <= 0;
end
endmodule
Veja que saída de AND muda 2 unidades após entrada mudar. Ex: b=1 enquanto a=1 em T=20, saída=1 só em T=22. a=0 em T=30, saída=0 em T=32.
Atraso de gate especificado como 3 para BUFIF0: quando b muda 0->1 com a=1, saída leva 3 unidades para atualizar para Z em T=23.
Log de Simulação
ncsim> run T=0 a=0 b=0 and=x bufif0=x T=2 a=0 b=0 and=0 bufif0=x T=3 a=0 b=0 and=0 bufif0=0 T=10 a=1 b=0 and=0 bufif0=0 T=13 a=1 b=0 and=0 bufif0=1 T=20 a=1 b=1 and=0 bufif0=1 T=22 a=1 b=1 and=1 bufif0=1 T=23 a=1 b=1 and=1 bufif0=z T=30 a=0 b=1 and=1 bufif0=z T=32 a=0 b=1 and=0 bufif0=z T=40 a=0 b=0 and=0 bufif0=z T=43 a=0 b=0 and=0 bufif0=0 ncsim: *W,RNQUIE: Simulation is complete.
Formato de Dois Atrasos
Aplicando mesmo testbench a modelo com rise/fall explícitos:
module des (
input a, b,
output out1, out2
);
and #(2, 3) o1 (out1, a, b);
bufif0 #(4, 5) b1 (out2, a, b);
endmodule
Log de Simulação
ncsim> run T=0 a=0 b=0 and=x bufif0=x T=3 a=0 b=0 and=0 bufif0=x T=5 a=0 b=0 and=0 bufif0=0 T=10 a=1 b=0 and=0 bufif0=0 T=14 a=1 b=0 and=0 bufif0=1 T=20 a=1 b=1 and=0 bufif0=1 T=22 a=1 b=1 and=1 bufif0=1 T=24 a=1 b=1 and=1 bufif0=z T=30 a=0 b=1 and=1 bufif0=z T=33 a=0 b=1 and=0 bufif0=z T=40 a=0 b=0 and=0 bufif0=z T=45 a=0 b=0 and=0 bufif0=0 ncsim: *W,RNQUIE: Simulation is complete.
Formato de Três Atrasos
module des (
input a, b,
output out1, out2
);
and #(2, 3) o1 (out1, a, b);
bufif0 #(5, 6, 7) b1 (out2, a, b);
endmodule
Log de Simulação
ncsim> run T=0 a=0 b=0 and=x bufif0=x T=3 a=0 b=0 and=0 bufif0=x T=6 a=0 b=0 and=0 bufif0=0 T=10 a=1 b=0 and=0 bufif0=0 T=15 a=1 b=0 and=0 bufif0=1 T=20 a=1 b=1 and=0 bufif0=1 T=22 a=1 b=1 and=1 bufif0=1 T=27 a=1 b=1 and=1 bufif0=z T=30 a=0 b=1 and=1 bufif0=z T=33 a=0 b=1 and=0 bufif0=z T=40 a=0 b=0 and=0 bufif0=z T=46 a=0 b=0 and=0 bufif0=0 ncsim: *W,RNQUIE: Simulation is complete.
Atrasos Min/Typ/Max
Atrasos não são iguais em diferentes partes do chip fabricado nem para diferentes temperaturas/variações. Verilog fornece controle extra para cada tipo de atraso. Cada célula de porta/transistor digital tem atraso mínimo, típico e máximo baseado no nó de processo, tipicamente fornecido por bibliotecas da foundry.
Para cada tipo de atraso (rise, fall, turn-off), três valores min, typ, max podem ser especificados.
module des (
input a, b,
output out1, out2
);
and #(2:3:4, 3:4:5) o1 (out1, a, b);
bufif0 #(5:6:7, 6:7:8, 7:8:9) b1 (out2, a, b);
endmodule
Log de Simulação
ncsim> run T=0 a=0 b=0 and=x bufif0=x T=4 a=0 b=0 and=0 bufif0=x T=7 a=0 b=0 and=0 bufif0=0 T=10 a=1 b=0 and=0 bufif0=0 T=16 a=1 b=0 and=0 bufif0=1 T=20 a=1 b=1 and=0 bufif0=1 T=23 a=1 b=1 and=1 bufif0=1 T=28 a=1 b=1 and=1 bufif0=z T=30 a=0 b=1 and=1 bufif0=z T=34 a=0 b=1 and=0 bufif0=z T=40 a=0 b=0 and=0 bufif0=z T=47 a=0 b=0 and=0 bufif0=0 ncsim: *W,RNQUIE: Simulation is complete.
Verilog
- Domine o Verilog: Tutorial Completo para Projeto de Circuitos Digitais
- Dominando Concatenação Verilog: Guia Prático
- Entendendo Atribuições em Verilog: Tipos, Sintaxe e Boas Práticas
- Verilog Blocking vs Non-Blocking: Diferenças Essenciais Explicadas
- Entendendo Controle de Atraso em Verilog: Técnicas de Timing e Boas Práticas
- Entendendo Atrasos Inter- e Intra-Atribuição em Verilog
- Modelagem em Nível de Porta: Conectando Esquemas de Hardware a Código Verilog
- Design Prático em Nível de Porta Verilog: Portas AND, OR, NOT e Multiplexador 2x1
- Gerador de Clock Verilog: Guia de Design e Implementação
- Dominando Funções Matemáticas do Verilog para Design de Hardware Eficiente