Os dispositivos lógicos digitais modernos são geralmente (*) projetados com "prática de projeto síncrona": um estilo de design de transferência de registro (RTL) acionado por borda síncrona globalmente: todos os circuitos sequenciais são divididos em registradores acionados por borda conectados ao sinal de relógio global CLK e lógica combinacional pura.
Esse estilo de design permite que as pessoas projetem rapidamente sistemas lógicos digitais sem levar em consideração o tempo. O sistema deles "funcionará" desde que haja tempo suficiente de uma extremidade do relógio para a próxima para que o estado interno se estabilize.
Com esse estilo de design, a inclinação do relógio e outros problemas relacionados ao tempo são irrelevantes, exceto para descobrir "Qual é a taxa máxima de clock para este sistema?".
O que exatamente é o desvio do relógio?
Por exemplo:
...
R1 - register 1 R3
+-+
->| |------>( combinational ) +-+
...->| |------>( logic )->| |--...
->|^|------>( )->|^|
+-+ ( ) +-+
| +--->( ) |
CLK | +->( ) CLK
| |
R2: | |
+-+ | |
...->| |->+ |
->|^|->--+
+-+
|
CLK
Em hardware real, o sinal "CLK" nunca muda exatamente ao mesmo tempo em todos os registros. A inclinação do relógio Tskew é o atraso do relógio a jusante em relação ao relógio a montante ( a ):
Tskew (origem, destino) = hora_do_destino - hora_de_origem
em que source_time é o horário de uma borda do relógio ativa no registro de origem (neste caso, R1 ou R2), e destination_time é o horário da "mesma" borda do relógio ativo em algum registro de destino a jusante (nesse caso, R3) .
- inclinação negativa do relógio: o CLK em R3 muda antes do relógio em R1.
- inclinação positiva do relógio: o CLK em R3 muda após o relógio em R1.
Qual é o efeito da inclinação do relógio?
(talvez um diagrama de tempo aqui torne isso mais claro)
Para que as coisas funcionem corretamente, mesmo no pior caso, as entradas do R3 não devem mudar durante o tempo de configuração ou o tempo de espera do R3. Em outro caso, para que as coisas funcionem corretamente, precisamos projetar coisas que:
Tskew (R1, R3) <Tco - Th.
Tclk_min = Tco + Tcalc + Tsu - Tskew (R1, R3).
Onde:
- Tcalc é o tempo máximo de acomodação, no pior dos casos, de qualquer bloco de lógica combinatória em qualquer lugar do sistema. (Às vezes, podemos reprojetar o bloco de lógica combinacional que está no caminho crítico, empurrando as peças para montante ou para jusante ou inserindo outro estágio de pipelining, para que o novo design tenha um Tcalc menor, o que nos permite aumentar a taxa de clock) .
- Tclk_min é o período mínimo de tempo de um limite do relógio ativo até o próximo limite do relógio ativo. Nós calculamos a partir da equação acima.
- Tsu é o tempo de configuração do registro. O fabricante do registro espera que usemos um relógio lento o suficiente para sempre atender a esse requisito.
- Th é o tempo de espera do registro. O fabricante do registro espera que controlemos a inclinação do relógio o suficiente para sempre atender a esse requisito.
- Tco é o atraso do relógio para a saída (tempo de propagação). Após cada borda do relógio ativo, R1 e R2 continuam a direcionar os valores antigos para a lógica combinacional por um curto período de tempo antes de mudar para os novos valores. Isso é definido pelo hardware e garantido pelo fabricante, mas apenas enquanto atendermos aos requisitos de Tsu e Th e outros requisitos especificados pelo fabricante para operação normal.
Muita inclinação positiva é um desastre absoluto. Muita inclinação positiva pode (com algumas combinações de dados) causar "sneak caminhos", de modo que, em vez de R3 travar os "dados corretos" no relógio N + 1 (uma função determinística dos dados anteriormente travados em R1 e R2 no relógio N) , os novos dados travados em R1 e R2 no relógio N + 1 podem vazar, perturbar a lógica combinacional e fazer com que dados incorretos sejam travados em R3 na "mesma" borda do relógio N + 1.
Qualquer quantidade de inclinação negativa pode ser "fixa" diminuindo a velocidade do relógio. É apenas "ruim" no sentido em que nos obriga a executar o sistema em uma taxa de clock mais lenta, a fim de dar às entradas de R3 tempo para se estabelecerem depois que R1 e R2 travam novos dados na borda do relógio N e depois R3 trava o resultado na "próxima" borda do relógio N + 1.
Muitos sistemas usam uma rede de distribuição de clock que tenta reduzir o desvio para zero. Contra-intuitivamente, adicionando cuidadosamente atrasos ao longo do caminho do relógio - o caminho do gerador de relógio para a entrada CLK de cada registro - é possível aumentar a velocidade aparente que a frente de onda da borda do relógio viaja fisicamente da entrada CLK de um registro para o entrada CLK do próximo registro para mais rápido que a velocidade da luz.
A documentação da Altera menciona
"Evite usar a lógica combinacional nos caminhos do relógio, pois contribui para o desvio do relógio".
Isso se refere ao fato de que muitas pessoas escrevem HDL que são compiladas em um FPGA de uma maneira que de alguma forma faz com que algo diferente do sinal CLK global direcione a entrada CLK local de alguns registros. (Pode ser uma lógica de "clock gating"), de modo que novos valores sejam carregados em um registro somente quando determinadas condições forem atendidas; ou lógica de "divisor de clock" que permite apenas 1 entre N relógios, etc.). Esse CLK local geralmente é derivado do CLK global de alguma forma - o CLK global funciona e, em seguida, o CLK local não muda, ou (um pequeno atraso após o CLK global para o sinal se propagar através desse "algo diferente") o CLK local muda uma vez.
Quando essa "outra coisa" aciona o CLK do registrador a jusante (R3), torna a inclinação mais positiva. Quando esse "algo diferente" aciona o CLK do registro upstream (R1 ou R2), torna a inclinação mais negativa. Ocasionalmente, o que aciona o CLK do registro upstream e o que aciona o CLK do registro downstream têm praticamente o mesmo atraso, tornando a inclinação entre eles praticamente zero.
A rede de distribuição de clock dentro de alguns ASICs é projetada deliberadamente com pequenas quantidades de inclinação positiva de clock em alguns registros, o que dá à lógica combinacional upstream um pouco mais de tempo para resolver e, portanto, todo o sistema pode ser executado em uma taxa de clock mais rápida. Isso é chamado de "otimização da inclinação do relógio" ou "agendamento da inclinação do relógio" e está relacionado à " reimpressão ".
Ainda estou confuso com o set_clock_uncertainty
comando - por que eu desejaria "especificar manualmente" a inclinação?
(*) Uma exceção:
sistemas assíncronos .