Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Verilog

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

  1. Domine o Verilog: Tutorial Completo para Projeto de Circuitos Digitais
  2. Dominando Concatenação Verilog: Guia Prático
  3. Entendendo Atribuições em Verilog: Tipos, Sintaxe e Boas Práticas
  4. Verilog Blocking vs Non-Blocking: Diferenças Essenciais Explicadas
  5. Entendendo Controle de Atraso em Verilog: Técnicas de Timing e Boas Práticas
  6. Entendendo Atrasos Inter- e Intra-Atribuição em Verilog
  7. Modelagem em Nível de Porta: Conectando Esquemas de Hardware a Código Verilog
  8. Design Prático em Nível de Porta Verilog: Portas AND, OR, NOT e Multiplexador 2x1
  9. Gerador de Clock Verilog: Guia de Design e Implementação
  10. Dominando Funções Matemáticas do Verilog para Design de Hardware Eficiente