Reduza o tempo de desenvolvimento de projetos em FPGA com o novo Quartus Prime da Altera
Um ciclo de desenvolvimento de projeto para FPGA deve ser dividido em etapas, e a forma mais usual de se fazer esta divisão pode ser vista, de forma simplificada, na figura Figura 1 abaixo.
A primeira etapa é a de definição do projeto, onde se especifica a função do projeto, como o projeto será dividido, quais módulos devem ser criados, como os módulos serão interligados, que recursos são necessários para o projeto (Interfaces com dispositivos externos, recursos especiais da FPGA, como blocos de DSP, interfaces rápidas, interface com memória externa, …). Uma vez definido o projeto, a próxima etapa é a de criação do código RTL (Register Transfer Level), usando-se uma linguagem de descrição de hardware para esta etapa, sendo as mais usadas hoje o VHDL, Verilog, SystemVerilog e SystemC.
Finalizada a codificação de cada bloco do projeto, deve ser feita uma verificação funcional do bloco criado, usando-se um simulador para fazer esta verificação. A Altera disponibiliza, para esta etapa, duas versões diferentes da ferramenta de simulação da Mentor Graphics, o ModelSim. A próxima etapa do desenvolvimento é a compilação em si do projeto, processo no qual o código fonte, em geral composto por vários arquivos, será compilado e convertido em um arquivo de gravação que será usado para configurar a FPGA com o circuito implementado.
Uma vez que o projeto tenha compilado sem erro, é necessária uma verificação funcional do mesmo, que pode ser feita de duas formas: Uma nova simulação do projeto, mas agora usando, ao invés do código fonte RTL original, um novo código gerado durante a compilação com um modelo do circuito da forma como o mesmo foi implementado na FPGA, inclusive com os atrasos incorridos em cada conexão no componente (chamada simulação Gate Level); ou usando-se uma ferramenta de verificação formal, como a ferramenta da Mentor Graphics Questa Formal. Como parte da verificação funcional, deve-se também analisar os resultados da análise de tempos de propagação feita pela ferramenta de compilação para verificar se o circuito implementado é realmente capaz de operar nas frequências especificadas para o projeto. No caso da Altera, a ferramenta usada nesta etapa é o TimeQuest.
Finalmente, depois de todas estas etapas terem sido concluídas com sucesso, o dispositivo é gravado e, se necessário, depurado no sistema. No software de desenvolvimento da Altera há várias ferramentas disponíveis para fazer a depuração no sistema, como o SignalTap (um analisador lógico implementado usando recursos da FPGA), In-System Sources and Probes, recurso que permite escrever e ler registradores via interface JTAG, External Memory Interface Tool Kit, que permite avaliar e testar interfaces com memórias externas do tipo DDR/DDR2/DDR3/DDR4, Transceiver Toolkit, que permite controlar transceivers de alta velocidade via interface JTAG, e muitas outras.
Figura 1 – Diagrama simplificado das etapas de desenvolvimento de um projeto para FPGA
Um dos principais desafios hoje em projetos envolvendo FPGAs, principalmente as de maior densidade, é o tempo de compilação. Para se compilar projetos complexos, utilizando-se todos os recursos de hardware disponíveis nas novas FPGAs, incluindo blocos de memória, PLLs, interfaces de entrada e saída e recursos de lógica em si (LUTs e flip-flops), além dos recursos mais avançados, como blocos de processadores, transceivers de alta velocidade (atingindo taxas de transferência de ate 56 Gbps por transceiver), controladores integrados de memoria (DDR2, LPDDR2, DDR3, LPDDR3, DDR4, HMC, …), interfaces prontas (PCIe Gen1, Gen2 ou Gen3, até x16), interfaces JTAG, sistemas de reconfiguração via PCIe e reconfiguração parcial, etc …, os tempos de compilação hoje podem chegar a valores bem maiores que 24 horas de processamento. A maior parte deste tempo (Em geral, mais de 95% do tempo total de compilação) é gasta nas etapas de síntese e de posicionamento e roteamento do dispositivo.
Figura 2 – Aumento de densidade das FPGA Altera ao longo to tempo
A principal razão para este aumento considerável no tempo de processamento é que o número total de possibilidades de posicionamento existentes em dispositivos mais novos, de densidade muito alta, ser muito, muito grande. Como pode ser visto na figura Fig.2, no final da década de 1990 a maior FPGA da Altera disponível no mercado tinha pouco mais de 50K LEs (50.000 elementos lógicos, sendo cada elemento lógico composto por um flip-flop e uma tabela verdade simples de quatro entradas e uma saída), tinha apenas memória interna, um ou dois PLLs simples e pinos de I/O com recursos limitados. No final dos anos 2000, a maior FPGA já tinha mais de 500K LEs, múltiplos PLLs bem mais complexos, blocos de memória de tamanhos variados, blocos de DSP (processamento digital de sinais, com multiplicadores, somadores e registradores incluídos no bloco), transceivers de alta velocidade, interfaces com memórias externas complexas (DDR, DDR2, DDR3, QDR, entre outras) e interfaces PCIe em hardware. Hoje, ainda mais recursos estão disponíveis nas novas FPGAs, com a densidade chegando a 5.5M LEs em um único dispositivo monolítico, interfaces de alta velocidades com capacidade de transferência chegando a 56 Gbps por transceiver (e até 196 transceivers por dispositivo), múltiplas interfaces com memória externas (DDR3/DDR4/HMC), múltiplos processadores de 64 bits implementados em hardware no dispositivo, capacidade de processamento DSP acima de 10 TFLOPs e frequência interna de operação acima de 1 GHz.
Motivação para a mudança
O principal desafio de um software de desenvolvimento para compilar projetos para estes dispositivos é que o número de possibilidades de posicionamento de um projeto em um dispositivo cresce de acordo como número de recursos disponíveis e com quanto destes recursos está sendo efetivamente utilizado, seguindo a equação combinatória sem repetição (Número de posicionamentos possíveis = n! / ((n - m)! * m!), onde n é o número de recursos disponíveis no dispositivo e m é o número de recursos efetivamente usados). Assim, para se ter uma ideia, para um projeto considerado bem pequeno hoje, em um dispositivo hipotético de mesmo tamanho (Apenas 171 LEs), usando-se 100% dos LEs do dispositivo, o número de possibilidades de posicionamento de um projeto deste tamanho em tal dispositivo é da ordem de 10380, que já é muito maior que o número estimado de átomos existentes no universo (em torno de 1082). Um software de desenvolvimento para FPGA não pode, como é possível imaginar, testar todas as opções possíveis de posicionamento e roteamento de um projeto em uma FPGA, pois o tempo para testar todas as alternativas tornaria o tempo de compilação absolutamente inviável.
Quanto mais eficiente for o algoritmo de posicionamento e roteamento usado, menor será o tempo gasto em posicionar e rotear os LEs para um mesmo resultado em termos de frequência de operação do circuito.Usando os algoritmos atuais de posicionamento e roteamento, baseado no conceito de “Annealing”, hoje projetos com 1M LEs, operando em frequências em torno de 350 a 400 MHz, demoram mais de 24 horas para concluir o processo completo de compilação, um tempo bastante grande, principalmente se considerarmos que as novas FPGAs terão densidades muito maiores (ate 5.5M LEs), aumentando em muito este tempo de compilação.
Principais inovações
A forma encontrada pela Altera reduzir os tempos de compilação de projetos para dispositivos mais novos foi utilizar novos algoritmos, mais eficientes, para implementar cada etapa da compilação de um projeto. Estes novos algoritmos foram reunidos, no Quartus Prime, sob o nome de “Spectra-Q Engine”, o “motor” desta nova versão de Quartus.
As principais vantagens deste novo conjunto de algoritmos são:
No processo de síntese:
- Permite fazer a síntese de forma distribuída, usando múltiplos computadores em paralelo para sintetizar um mesmo projeto (Até 16 processadores, cada um com até 16 núcleos, operando em paralelo);
- Maior suporte a linguagens de última geração, em particular SystemVerilog-2005 e VHDL-2008;
- Novo algoritmo de análise da linguagem RTL, que permite maior aderência das construções do arquivo RTL às definições do IEEE das linguagens VHDL, SystemVerilog e Verilog;
- Use de um novo algoritmo que permite estimar com mais precisão a frequência de operação do projeto após a síntese, sem necessidade de fazer o posicionamento e roteamento do projeto no dispositivo;
- Suporte completo à Compilação Incremental, no qual um projeto grande e dividido em partições, e cada partição é tratada como um projeto individual, com suas próprias bases de dados, sendo a síntese de cada participação feita de forma independente, e os resultados da síntese de cada partição também são mantidos em bases de dados independentes. Usando-se o particionamento de um projeto, cada partição pode ser sintetizada em um computador diferente, e um grid de computadores pode ser usado para acelerar muito o processo de síntese de um projeto particionado, reduzindo o tempo de síntese em até 4X;
- Suporte à Compilação Rápida, modo de compilação em que apenas uma parte pequena de um projeto é alterada em relação a uma compilação anterior. Neste modo, na etapa de síntese as diferenças entre a versão anterior e a atual são marcadas na base de dados, e esta informação é passada para a etapa de posicionamento e roteamento, e somente os elementos envolvidos nesta modificação serão novamente posicionados e roteados, sendo todo o restante do projeto já compilado anteriormente mantido como estava, reduzindo assim em até 10 vezes o tempo total de processamento necessário para compilar o projeto novamente, comparado a um processo completo de posicionamento e roteamento de todo o circuito.
No processo de posicionamento e roteamento:
- Foi criado um novo algoritmo de posicionamento global, que permite ao software avaliar o projeto como um todo, e posicionar os átomos do projeto (LE, blocos de memória, blocos de DSP, …) levando em conta tanto a Fmax necessária como a facilidade de roteamento do projeto como um todo. Permite assim que se consiga uma maior frequência de operação para projetos densos e com alta taxa de utilização do componente por facilitar o roteamento do projeto. O novo algoritmo é escalável para densidades muito superiores a 5.5M LEs;
- Novo algoritmo de roteamento, que permite o roteamento de projetos complexos, com utilização do dispositivo acima de 90%, e reduz o congestionamento de roteamento do dispositivo em áreas de alta utilização dos caminhos de roteamento, aumenta a Fmax de projetos com alta taxa de utilização do componente, e apresenta consistência de roteamento para densidades superiores a 5.5M LEs;
- Suporte à Recompilação Rápida, onde, ao se recompilar um projeto onde alterações pequenas foram efetuadas (<5% da lógica do projeto foi alterado), a maior parte dos resultados do roteamento anterior são reutilizados, evitando assim o tempo necessário para fazer o roteamento de todo o projeto e focando apenas no posicionamento e no roteamento das alterações feitas. Permite reduzir o tempo de posicionamento e roteamento de projetos já previamente compilado e com pequenas alterações em até 90%. Na média, a redução do tempo de compilação é de 66% para alterações no código fonte;
- Suporte completo à Compilação Incremental, no qual um projeto grande e dividido em partições, e cada partição é tratada como um projeto individual, com suas próprias bases de dados, seu roteamento sendo feito de forma independente, e os resultados da compilação de cada partição também são mantidos em bases de dados independentes. Usando-se o particionamento de um projeto, cada partição pode ser compilada em um computador diferente, e um grid de computadores pode ser usado para acelerar muito o processo de compilação de um projeto, onde cada partição pode ser enviada para ser compilada em um computador diferente, e os resultados depois são recebidos pelo computador que está coordenando o processo de compilação e consolidado, reduzindo o tempo de compilação em ate 4X;
- Suporte à Compilação Rápida, modo de compilação em que apenas uma parte pequena de um projeto é alterada em relação a uma compilação anterior. Neste modo, na etapa de síntese as diferenças entre a versão anterior e a atual são marcadas na base de dados, e esta informação é passada para a etapa de posicionamento e roteamento, e somente os elementos envolvidos nesta modificação serão novamente posicionados e roteados, sendo todo o restante do projeto já compilado anteriormente mantido como estava, reduzindo assim em até 10 vezes o tempo total de processamento necessário para compilar o projeto novamente, comparado a um processo completo de posicionamento e roteamento de todo o circuito;
- Suporte à integração de IPs pré-compilados ao projeto. Permite que se insira em um projeto existente um modulo (IP – Propriedade Intelectual) já previamente compilado, mantendo-se o desempenho e o roteamento deste módulo. Desta forma, ao se inserir um IP pré-compilado ao projeto, tem-se a certeza de que o posicionamento e o roteamento do IP foram mantidos no novo projeto, permitindo assim otimizar um modulo apenas uma vez e “carimbá-lo” em novos projetos com a garantia de que o desempenho deste módulo não será degradado na compilação.
No processo de análise de tempos do projeto:
- Novo algoritmo de análise de tempos de propagação do projeto, chamado TimeQuest 2, que permite que o processo de análise de tempos de propagação do projeto seja feito de forma paralela. O processo pode ser feito por até 16 processadores por nó de processamento, e múltiplos nós podem ser usados para fazer a análise de um projeto particionado;
- O novo algoritmo é muito mais rápido, permitindo que a análise de tempos do projeto seja feita em um terço do tempo, quando comparada com a mesma análise de tempos feita pelo algoritmo anterior com os mesmos recursos de processamento;
- Melhor suporte à análise de tempos de propagação em projetos complexos, que usam múltiplos relógios.
Versões disponíveis do Quartus Prime
Na versão anterior do Quartus, o Quartus II, havia apenas duas versões distintas de Quartus II disponíveis, as versões Web e Subscription. A versão Web era uma versão mais simples, gratuita, mas com restrições na otimização do projeto, de recursos e ferramentas disponíveis e de suporte às famílias de mais alto desempenho de FPGA. A versão Subscription era a versão completa, paga, com todos os recursos habilitados e com suporte a todas as famílias de dispositivos CPLD e FPGA mais novos da Altera.
No Quartus Prime, foram criadas três versões distintas de software, a versão sem custo Lite Edition (Equivalente à versão Web do Quartus II), a versão Standard Edition (Equivalente à versão Subscription do Quartus II) e a versão Pro, que suporta apenas dispositivos mais novos, da geração 10 de FPGAs (Hoje suporta as famílias Arria 10 e Stratix 10 de FPGA), sendo as últimas duas versões pagas.
Na tabela Tab. 1 são mostrados os recursos disponíveis em cada versão diferente do Quartus Prime. Na primeira linha onde são mostrados o suporte às famílias de FPGA, C significa família Cyclone (CV, por exemplo, indica a família Cyclone V), M significa família MAX de CPLDs, A significa família Arria e S significa família Stratix. Onde esta marcado com Versão inicial indica que aquele recurso é novo nesta versão de Quartus e ainda é considerado Beta para a Altera, e 16.0 indica a primeira versão do Quartus Prime que terá este recurso.
Conclusão
A Altera lançou recentemente o Quartus Prime, a nova versão de ferramenta integrada de desenvolvimento, e o principal foco desta nova versão do Quartus é a redução significativa no tempo de processamento necessário para a compilação de um projeto para CPLD e/ou FPGA. Para alguns projetos, esta redução de tempo pode chegar a oito vezes. A ferramenta foi também otimizada para atingir frequências de operação elevadas mesmo em projetos de alta densidade e com componentes maiores, sendo os algoritmos desenvolvidos e testados para garantir bom desempenho, tanto em termos de frequência de operação quanto de tempo de compilação, para as próximas gerações de FPGA, onde a densidade deve ultrapassar os 10 milhões de elementos lógicos.