Desenvolvendo hardware, técnicas de design voltadas a velocidade em FPGA!

velocidade

Olá senhores e senhoras, este artigo visa explicar os conceitos que envolvem velocidade em FPGA (Field Programmable Gate Array), para os que não sabem o que é um FPGA fiz um post introdutório aqui.

 

Quem já trabalhou na indústria com FPGA sabe como temos que tirar leite de pedra. É uma batalha constante entre espaço e tempo! Migrar para um FPGA com mais recursos sempre é bastante custoso, tanto por ter que refazer placas quanto pelo custo unitário de um FPGA melhor. O design ideal precisa ocupar poucos elementos lógicos, utilizar pouca memória, rodar em alta frequência, baixa latência, alto throughput, sem problemas de timing (violação de setup/hold ou removal/recovery) e etc. Como espaço e tempo estão intimamente ligados dentro de um chip sempre procuramos uma solução ótima que satisfaça tudo isto :), neste artigo abordaremos a parte temporal.

 

Dependendo do contexto a velocidade de um design pode se referir a throughput, latência ou timing.

 

Throughput

 

Quando nos referimos a throughput estamos falando da quantidades de bits que um módulo processa por segundo (bits/segundo). Se um circuito retorna o resultado de uma multiplicação de 64 bits por 64 bits em um registrador de 128 bits a cada pulso de clock e o clock é de 100 MHz com período de 10 ns (1/100000000)  temos 128 bits a cada 10 ns ou 12.8 giga bits por segundo!

 

Latência

 

Quando nos referimos a latência estamos falando do tempo que demora para obter a saída do módulo após receber uma entrada, normalmente medimos a latência em ciclos de clock. No caso do exemplo acima a latência é de um ciclo de clock pois temos o resultado da primeira multiplicação em um pulso de clock. 

 

Timing

 

Quando nos referimos ao timing de um módulo estamos nos referindo ao atraso gerado nos circuitos combinacionais deste módulo, quando um projeto não consegue cumprir os requisitos de timing nós estamos dizendo que o atraso em um dos caminhos é maior que o período de clock do sistema, isto acarreta em violações de setup e hold de Flip-Flops(FFs) provocando metaestabilidade, o timing é normalmente medido por período de clock e frequência.

Fmax
Formula para determinar a frequência máxima

A frequência máxima do sistema é dada pela fórmula acima, vamos entende-la:

  • Tco: É também conhecido com T clock-out, é a quantidade de tempo que demora para o dado ir do D para o Q de um FF após um borda de subida (ou descida) do clock;
  • Tcomb: É o atraso de um circuito combinacional entre dois FFs;
  • Troteamento: É o atraso no dado devido a distância entre dois FFs na placa;
  • Tsetup: É a quantidade de tempo que um dado deve se manter estável antes da chegada de um pulso de clock;
  • Tskew: É a quantidade de tempo entre a borda de lançamento de um FF e a de captura do outro FF.

Se tentarmos rodar um sistema em 100 mhz e esta equação não fechar para alguns caminhos do nosso circuito (chamados de caminhos críticos), existe a grande probabilidade do sistema não funcionar. Um dos problemas mais graves é a metaestabilidade que acontece quando os tempos de hold e setup de um FF não são respeitados. 

 

Fazer o "timing closure" é uma expressão conhecida entre desenvolvedores de FPGA e consiste em fazer esta equação fechar 🙂 como opção podemos:

  • Mexer na descrição do nosso hardware para diminuir o atraso combinacional, repensando a arquitetura do VHDL de outra forma; (Tcomb);
  • Utilizar uma ferramenta de "chip planner" para colocar os blocos de VHDL mais próximos uns dos outros, ou de recursos que ele utiliza (por exemplo: Colocar um bloco mais próximo dos blocos de FPGA de DSP e Memória) (Troteamento);
  • Diminuir a frequência máxima do sistema (Fmax);
  • Dentre outras opções

 

 Exemplo de um design em VHDL levando tudo isso em consideração

 

Vamos supor que um processador não está dando conta de processar dados rápido o suficiente! Realizamos o profile do código em C e verificamos que o que está levando mais tempo para se executar é a equação Resultado = pow(x,3.0)  (um número elevado ao cubo), para resolver o problema vamos implementa-la em hardware. (P.S: Os códigos em VHDL abaixo são apenas para exemplificar o conceito)

Primeira implementação:

Primeiramente vamos implementar de um jeito mais "software", nossa maquina de estados vai multiplicar e acumular o valor de entrada três vezes após receber um sinal de "START", vamos considerar todos os registradores sendo de 32 bits e desprezar o escalamento de bits necessário para a multiplicação.

 

 

  • Throughput: 32/3 ou 10.6  bits por clock
  • Latência: 3 ciclos de clock
  • TimingDelay de um multiplicador 

 Alto Throughput:

Vamos inserir pipeline para melhorar nosso throughput, enquanto um dado é multiplicado o registrador já esta disponível para guardar o resultado de outra multiplicação. A desvantagem neste caso é o aumento de área pois precisamos usar mais registradores para executar o mesmo algoritmo, além de utilizar um multiplicador a mais.

 

  • Throughput: 32 bits por clock.
  • Latência: 3 ciclos de clock.
  • TimingDelay de um multiplicador.

Agora vamos diminuir a latência de nossa solução!

 Baixa latência:

Para diminuir a latência vamos tirar todos os registradores da jogada! O nosso hardware vai ficar assim:

 

  • Throughput: 32 bits por clock (considerando uma nova entrada a cada pulso de clock).
  • Latência: zero pulsos de clock, somente o atraso dos multiplicadores.
  • TimingDelay de dois multiplicadores.

A penalidade neste caso é a frequência máxima de operação do sistema que será praticamente a metade das implementações anteriores pois o atraso entre dois FFs é o dobro de circuito combinacional.

Conclusão

Existem diversas técnicas para projetos em FPGA para minimizarem/maximizarem cada um dos três atributos apresentados neste artigo, porém foge ao escopo entrar nos diversos detalhes de cada uma destas técnicas :),  quem sabe em outros artigos dedicados exclusivamente a otimização de velocidade!

Este artigo foi baseado no primeiro capítulo do livro Advanced FPGA Design do Steve Kilts. 

 

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

4
Deixe um comentário

avatar
 
3 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
4 Comment authors
PAULO VICTOR PERTUSSATTIAdministradorRaphael Philipe Mendes da SilvaMatheus Quick Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Matheus Quick
Visitante
Matheus Quick

Muito bom, ainda não mexo com fpga, mas num futuro próximo pretendo.

PAULO VICTOR PERTUSSATTI
Visitante
pvpertussatti

Quando você menciona Throughput, não seria é a mesma coisa que a velocidade de resposta da mensagem enviada ou código enviado? Foi o que eu entendi.

Raphael Philipe Mendes da Silva
Visitante

Muito bom o novo site. Estava faltando um lugar para concentrar conteúdo de alta qualidade.

sugestão: deixar logar com o linkedin tbm para fazer comentários.

Administrador
Visitante
embarcados

Obrigado Raphael.

Já estamos em processo de integração com as redes sociais.

Abraços!