As Matrices de Portas Programáveis em Campo, ou FPGAs, tornaram-se ubíquas entre sistemas digitais em tempo real de alta velocidade. Elas podem ser usadas para aplicações críticas em tempo, processamento de sinais digitais ou até mesmo mineração de criptomoedas. Sua eficiência em velocidade e consumo de energia as torna perfeitas para aplicações de alta velocidade reutilizáveis. A velocidade com que os FPGAs operam continua a aumentar a um ritmo vertiginoso, mas sua adoção em pipelines de Integração Contínua (CI) parece não acompanhar esse crescimento. Neste artigo, revisaremos o conceito de pipelines de CI, sua aplicação aos FPGAs e analisaremos exemplos de como configurá-los.
Se você ainda não percebeu, eu praticamente respiro, durmo e como Integração Contínua. Seja CI para design de PCB ou CI para Sistemas Embutidos, estou sempre procurando maneiras de melhorar continuamente e automatizar builds para qualquer tipo de sistema. Um feedback recente que recebi de algumas pessoas foi que não houve muito progresso com FPGAs e sistemas de CI. O verdadeiro princípio por trás de CI e FPGAs segue a mesma lógica de todos os outros sistemas de CI: criar um ambiente de build repetível que possa fazer todo o trabalho pesado para nós. Em um sistema de CI baseado em FPGA, normalmente veríamos as seguintes três etapas:
Figura 1: Etapas de um Pipeline de CI para FPGA
Cada etapa é importante por si só e todas requerem sua própria configuração. Vamos analisar cada etapa para entender o que elas representam e como implementá-las.
A simulação é uma parte integral do design de FPGAs. Construir uma imagem de FPGA para carregar em um alvo pode levar muito tempo. Em vez de escrever código, compilar e testá-lo em hardware, a simulação nos dá a capacidade de testar rapidamente nosso código, ou Nível de Registro de Transferência (RTL), dentro de um ambiente que simula o comportamento de um FPGA. Geralmente, isso é feito em nível de usuário, mas está se tornando cada vez mais popular integrar a simulação de FPGA em pipelines de CI. Isso significa que alguém enviaria seu código para seu repositório e um pipeline seria acionado para executar a simulação (auto-verificada) em algum lugar na nuvem. Para realmente fazer isso “em algum lugar na nuvem”, é necessário criar um ambiente que possa ser encapsulado, ou containerizado, em um ambiente autossuficiente. Fazemos isso usando algo chamado containers Docker. Esses containers agem quase como máquinas virtuais que podem ser executadas em qualquer lugar. Este container Docker em particular, como exemplo, cria um ambiente containerizado que permite a um usuário executar Icarus Verilog em qualquer sistema Linux. Em seguida, pegamos esse container e o usamos para criar nosso pipeline de simulação FPGA. Neste exemplo, você pode ver um simples pipeline de “Hello World” ocorrendo na nuvem usando Icarus Verilog. Observe que isso pode ser feito com qualquer ferramenta de simulação FPGA.
Figura 2: Execução do pipeline de simulação FPGA usando Gitlab CI
Uma segunda etapa, também muito importante, dentro do pipeline FPGA é a etapa de build. Queremos ser capazes de sintetizar, posicionar e roteirizar, e gerar um bitstream para nosso design de FPGA. Isso também é tipicamente feito por usuários dentro da ferramenta fornecida pelo fornecedor (por exemplo, Xilinx, Intel, Microchip, etc.). Em vez de ter essa build localmente, gostaríamos que a build ocorresse em outro lugar. No entanto, isso pode ser um pouco complicado, já que as ferramentas FPGA costumam ser muito grandes. Uma abordagem que muitos usuários adotam é ter uma “máquina de build” dedicada que execute todos os pipelines de build. Essa abordagem não é ruim, mas também não escala e pode se tornar um ponto único de falha. Outros tentaram containerizar ferramentas FPGA, mas essas imagens podem ultrapassar 100 GB, o que, essencialmente, as torna inutilizáveis para aplicações na nuvem. Um meio-termo que encontrei que funciona bem é o método de instalação em rede. Como exemplo, criei um container que executa o Vivado 2019.1, mas a ferramenta em si não está instalada na imagem (portanto, o tamanho da imagem é inferior a 300 MB). O que fiz foi instalar o Vivado em um drive de rede (neste caso, EFS na AWS) e depois montá-lo dentro do meu container Docker. Como estou executando meu pipeline na AWS, a latência entre o EFS e a instância EC2 (Nó Kubernetes) é insignificante.
Neste exemplo, estou usando um dispositivo Arty A7 da Digilent para criar um filtro digital. Estou usando um script de build automatizado para gerar o arquivo de bitstream para meu dispositivo a cada push para meu repositório. Como você pode ver na saída, chamo com sucesso o Vivado, mesmo que ele não exista dentro do container Docker (ou seja, está montado como um drive externo).
Figura 3: Execução do pipeline de build FPGA usando Gitlab CI
A fase de teste realmente vai depender de cada indivíduo e projeto. O objetivo do teste dentro de um pipeline de CI é automatizar o máximo possível. Assim como eu automatizei meu exemplo de DSP para Arduinos com meu Analog Discovery 2, eu também poderia fazer o mesmo aqui. Cobrir uma solução de teste automatizado para FPGAs seria um pouco fora do escopo deste artigo. O princípio principal aqui é garantir que isso possa ser repetido e executado dentro de um ambiente encapsulado ou containerizado. É importante lembrar que o teste é uma parte importante do pipeline de CI e deve ser implementado em qualquer nível que o usuário possa lidar.
Neste artigo, cobrimos o conceito de pipelines de CI para FPGAs. Revisamos as três etapas críticas que compõem os pipelines de FPGA: simulação, build e teste. Analisamos exemplos de pipelines de simulação e build e discutimos a importância dos testes. Após revisar este artigo e os exemplos, o usuário deve ser capaz de entender a composição básica do que é necessário para criar um pipeline de CI baseado em FPGA.
Quando você estiver pronto para construir sua placa FPGA personalizada para suportar seu sistema embutido, use o conjunto completo de recursos de design e layout de PCB no Altium Designer®. Uma vez que você tenha concluído sua PCB e esteja pronto para compartilhar seus designs com colaboradores ou seu fabricante, você pode compartilhar seus designs completos através da plataforma Altium 365™. Tudo o que você precisa para projetar e produzir eletrônicos avançados pode ser encontrado em um único pacote de software.
Nós apenas arranhamos a superfície do que é possível fazer com o Altium Designer no Altium 365. Comece seu teste gratuito do Altium Designer + Altium 365 hoje.