UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE CENTRO DE TECNOLOGIA DEPARTAMENTO DE ENGENHARIA DE COMPUTAÇÃO E UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE AUTOMAÇÃO Projeto e Implementação de um Field-Programmable Gate Array (FPGA) Yang Azevedo Tavares Orientador: Prof. Dr. Diomadson Rodrigues Belfort Co-orientador: Prof. Dr. Sebastian Yuri Cavalvanti Catunda Trabalho de Conclusão de Curso apre- sentado ao Departamento de Engenharia de Computação e Automação da Universidade Federal do Rio Grande do Norte em cumpri- mento às exigências legais e requisito parcial à obtenção do título de Bacharel em Enge- nharia de Computação. Natal, RN, novembro de 2018 Divisão de Serviços Técnicos Catalogação da publicação na fonte. UFRN / Biblioteca Central Zila Mamede Tavares, Yang Azevedo. Projeto e Implementação de um Field-Programmable Gate Array (FPGA) / Yang Azevedo Tavares - Natal, RN, 2018 82 p. Orientador: Diomadson Rodrigues Belfort Co-orientador: Sebastian Yuri Cavalvanti Catunda Trabalho de Conclusão de Curso - Universidade Federal do Rio Grande do Norte. Centro de Tecnologia. 1. Circuito Reconfigurável - Field Programmable Gate Array. 2. Implemen- tação - Desenvolvimento do circuito. I. Tavares, Yang Azevedo. III. Título. RN/UF/BCZM CDU 004.932(043.2) Projeto e Implementação de um Field-Programmable Gate Array (FPGA) Yang Azevedo Tavares Trabalho de Conclusão de Curso aprovada em 30 de novembro de 2018 pela banca exa- minadora composta pelos seguintes membros: Prof. Dr. Diomadson Rodrigues Belfort (orientador) . . . . . . . . . . . . . ELE/UFRN Prof. Dr. Sebastian Yuri Cavalvanti Catunda (co-orientador) . . . . . DCA/UFRN Prof. Dr. Danilo De Santana Pena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DCO/UFRN Prof. Me. Antonio Wallace Antunes Soares . . . . . . . . . . . . . . . . . . . . IMD/UFRN Aos nobres professores da vida. Agradecimentos À todos os professores que fizeram parte de minha carreira acadêmica até então, sou grato pelo conhecimento adquirido em todos os estágios de aprendizado e todas as conquistas obtidas. Em especial, ao professor Amaral por me introduzir ao fascinante mundo da engenharia antes de me tornar universitário, ao professor Aquiles por me introduzir à pes- quisa acadêmica no início de minha vida universitária, ao professor Júlio por toda sua paciência e humildade na ajuda de assuntos diversos, ao professor Tandon por todo sua consideração ao acolher um estudante internacional em suas pesquisas e por me introdu- zir à microeletrônica, ao professor Lee por me receber calorosamente no seu laboratório durante meu estágio, ao meu co-orientador e professor Yuri por todos os seus conselhos e atenção quanto aos assuntos acadêmicos, e finalmente, ao meu orientador e professor Diomadson por toda sua humildade e consideração quanto à assuntos acadêmicos e in- dicações de oportunidades extraordinárias durante minha graduação. Por todo carinho, posso considerar os professores citados como membros de minha família. Aos professores e colegas de laboratório Wallace, Danilo, Vincent, Bruno, Sales, Adauto, Jadilson, Rafael, Luiz, Taunaí, Dimitri, Carol, Vitor, Nayana, Alberto e Raphaela, e tam- bém Aos grandes amigos conhecidos na escola, universidade e academia, por todo seu apoio. Aos meus pais Dalmo e Socorro, pela excelente educação fornecida. Ao meu irmão Tárik, por todo seu companheirismo e suporte. Aos meus tios Arthur e André, por todo o carinho e atenção. Aos meus primos Hugo, Milena, Larissa junto com os meus tios Dircineu e Conceição, por toda a sua solidariedade e acolhimento. À minha namorada Inhwa, por toda sua delicadeza e assistência. À todos os meus familiares que através do seu amor, proporcionaram todas as condições para minha ascensão pessoal. Não existem palavras para descrever a nobreza dos seus atos. Resumo Este trabalho apresenta o desenvolvimento de um FPGA do tipo ilha com memória SRAM, envolvendo todas as informações necessárias e os passos requeridos na imple- mentação em hardware, configuração por bitstream e alternativas de projeto para facilitar o esforço da realização do circuito como um todo, de um ponto de vista acadêmico. Para alcançar produtos no estado da arte, FPGAs comerciais podem demandar uma grande equipe, grande tempo de implementação e alto custo de mão de obra. Em contraste, ao se tomar o desafio de construir um FPGA com um número reduzido de pesquisadores, o desenvolvimento da arquitetura e tamanho são focados na prova de conceito. Resultados obtidos a partir desta metodologia podem ser usados como referência para a implementa- ção de outras arquiteturas comumente utilizadas, assim também para novas configurações de FPGA ou aprimoramentos de circuito. Palavras-chave: Arquiteturas reconfiguráveis, Síntese de circuito, Memória SRAM. Abstract This work presents the development of a custom SRAM island-style FPGA, covering the information needed and the steps involved in hardware implementation, bitstream configuration and design alternatives to facilitate the overall implementation effort from an academic point of view. To achieve state of the art products, commercial FPGAs can employ a large team, a high time-to-market, and high non-recurring engineering costs. In contrast, by taking the challenge of building a custom FPGA with a small team of resear- chers, the development of a custom architecture and size focuses on the proof of concept. Results from this baseline methodology can be used for benchmarking against the deve- lopment of other commonly used architectures, as well as for new FPGA configurations or circuit enhancements. Keywords: Reconfigurable architectures, Circuit synthesis, SRAM memory. Sumário Sumário i Lista de Figuras iii Lista de Tabelas v Lista de Símbolos e Abreviaturas 1 1 Introdução 1 2 Detalhes da arquitetura 3 2.1 Programador de SRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2 Arquitetura alvo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3 Implementação em VLSI 15 3.1 Automatização do projeto . . . . . . . . . . . . . . . . . . . . . . . . . . 20 4 Programação e testes 25 4.1 Interpretador do VTR . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 4.2 Interface de configuração . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.3 Simulação do FPGA feito pelo fluxo analógico . . . . . . . . . . . . . . 28 4.4 Testes com o chip fabricado pela MOSIS pelo fluxo digital . . . . . . . . 29 5 Conclusão e Trabalhos Futuros 35 Referências bibliográficas 35 A Utilização do dispositivo NI 6351 com o Matlab 41 A.1 Considerações de funcionamento . . . . . . . . . . . . . . . . . . . . . . 45 B Fluxo Digital no ambiente Cadence 47 B.1 Algumas considerações . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 i Lista de Figuras 1.1 Representação do conteúdo deste documento. . . . . . . . . . . . . . . . 2 2.1 Ilustração de um FPGA do tipo ilha, adaptado do VTR (Betz & Rose 1997). 4 2.2 Mux implementando uma Look-Up Table. . . . . . . . . . . . . . . . . . 4 2.3 Esquemático de uma célula SRAM com 6 transistores. . . . . . . . . . . 5 2.4 Multiplexador de uma Look-Up Table Multiplexer implementado como uma árvore binária de transmission gates. . . . . . . . . . . . . . . . . . 6 2.5 Unidade lógica básica e seu cluster (Kuon et al. 2008). . . . . . . . . . . 7 2.6 Topologias Wilton e Disjoint para o SB (Kuon et al. 2008). . . . . . . . . 8 2.7 Diagrama do configurador de SRAM. . . . . . . . . . . . . . . . . . . . 9 2.8 Esquemático do circuito sense amplifier. . . . . . . . . . . . . . . . . . . 10 2.9 Sinais de configuração da SRAM. . . . . . . . . . . . . . . . . . . . . . 11 2.10 FPGA baseado em “Tiles”(Chiasson & Betz 2013). . . . . . . . . . . . . 11 2.11 Esquemático de um CLB. . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.12 Esquemático do canal de roteamento, com o SB em verde e o CB em azul. 13 3.1 Exemplo da geração do diagrama butterfly retirado de (HE & others 2006). 16 3.2 Diagrama butterfly para o modo de armazenamento. . . . . . . . . . . . . 16 3.3 Diagrama butterfly para o modo de leitura. . . . . . . . . . . . . . . . . . 17 3.4 Diagrama butterfly para o modo de escrita. . . . . . . . . . . . . . . . . . 17 3.5 Esquemático de um SB. . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.6 Células principais do FPGA com mesma altura. . . . . . . . . . . . . . . 19 3.7 Layout de um CLB com configurador de SRAM. . . . . . . . . . . . . . 19 3.8 Verilog estrutural de um BLE. . . . . . . . . . . . . . . . . . . . . . . . 21 3.9 Matriz 2x2 de um FPGA colocado no Cadence SoC Encounter. . . . . . . 22 3.10 Layout de um CLB desenvolvido pelo fluxo digital com a biblioteca digi- tal da NCSU. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.11 Matriz de CLBs colocados no Encounter. . . . . . . . . . . . . . . . . . 24 4.1 Fluxograma do software desenvolvido. . . . . . . . . . . . . . . . . . . . 26 4.2 Circuito de um contador gerado na ferramenta VPR Viewer. . . . . . . . 27 4.3 Interface de configuração da SRAM através de um SPI e PSI. . . . . . . . 28 4.4 Código verilog de um contador de 4 bits. . . . . . . . . . . . . . . . . . 29 4.5 Resultado da simulação para um contador de 4 bits programado no FPGA. 30 4.6 Especificações do chip fabricado. . . . . . . . . . . . . . . . . . . . . . . 31 4.7 Arranjo para testes do chip. . . . . . . . . . . . . . . . . . . . . . . . . . 32 4.8 Resultados para diferentes funções de portas no mesmo chip. . . . . . . . 33 iii 4.9 Resultados para um circuito contador de 4 bits configurado. . . . . . . . . 33 B.1 Visualização da simulação para o contador de 8 bits na ferramenta Sim- Vision. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 B.2 Configurações para o uso da ferramenta Encounter. . . . . . . . . . . . . 54 B.3 Visualização do resultado das configurações iniciais no Encounter. . . . . 55 B.4 Configurações para o floorplan. . . . . . . . . . . . . . . . . . . . . . . . 55 B.5 Floorplan com pads rotacionados e espaçamento para alimentação. . . . . 56 B.6 Visualização dos anéis alimentação do chip. . . . . . . . . . . . . . . . . 56 B.7 Visualização das tiras alimentação do chip. . . . . . . . . . . . . . . . . 57 B.8 Visualização das células digitais posicionadas. . . . . . . . . . . . . . . . 57 B.9 Visualização do enchimento para bom funcionamento do chip fabricado. . 58 B.10 Visualização das camadas do layout no Virtuoso. . . . . . . . . . . . . . 59 B.11 Visualização do layout do chip no Virtuoso. . . . . . . . . . . . . . . . . 59 Lista de Tabelas 3.1 Comparação entre os fluxos analógico e digital. . . . . . . . . . . . . . . 22 v Capítulo 1 Introdução Com a sua introdução em 1984, Field-Programmable Gate Arrays (FPGA) inovaram a implementação de circuitos digitais, trazendo flexibilidade e otimização de tempo de design quando comparados com métodos antigos como a prototipação utilizando portas lógicas “Small Scale” (In the Beginning n.d.). Desde então, uma grande variedade de aplicações surgiram por suas vantagens e o mercado cresce paralelamente com a demanda elevada ao passar dos anos. Os principais benefícios do FPGA vem da sua característica reconfigurável, na qual possibilita o projeto rápido de circuitos digitais em comparação com a fabricação de circuitos de aplicação específica (ASIC) (Parvez & Mehrez 2010). O desenvolvimento de um ASIC passa por vários processos antes de ser integrado em um produto final, e considera as despesas de desenvolvimento e fabricação. O chip fabricado também tem chance de não funcionar devido à erros de implementação ou vari- ações no processo de fabricação, aumentando o custo final. Todavia, FPGAs comerciais “off-the-shelf” (COTS) podem ser utilizados em um produto final, se tornando mais ba- ratos para aplicações de pequena e média escala. Eles são vastamente empregados para propósitos educacionais e em data centers, broadcast, computação de alta performance, medicina, e na área espacial (Xilinx FPGA Applications n.d.). Apesar de não configuráveis, ASICs são otimizados para sua aplicação específica, permitindo-se alcançar uma performance mais alta quando comparado com o FPGA para o mesmo trabalho. No entanto, à medida que a tecnologia de circuitos integrados avança e o nó tecnológico diminui, a performance dos FPGAs cresce proporcionalmente, e a lacuna com o ASIC se torna menor para diversas aplicações, trazendo os FPGAs em destaque no cenário de implementação de arquiteturas, como exemplo uma unidade de aceleramento para processadores (Maybe It’s Time to Go Custom n.d.). Infelizmente, a competição acirrada entre os gigantes da indústria esconde os conhecimentos mais recentes adquiridos para propósitos econômicos, que pode criar uma lacuna entre os recursos acadêmicos e industriais, como o exemplo mostrado em (Hung 2015). A importância de desmistificar o conhecimento relacionado ao FPGA se destaca por seu comportamento genérico e por seu poder de melhorar o custo total de um determinado projeto. Os desafios principais em implementar a arquitetura do FPGA está relacionado à sua complexidade e configuração, além disso, seu projeto pode requerer um grande time de engenheiros, como exemplo da indústria. Então, o desenvolvimento de métodos para alavancar a realização da arquitetura em ambientes acadêmicos se torna importante. 1 2 CAPÍTULO 1. INTRODUÇÃO Este trabalho ilustra os diferentes passos e desafios para a construção de um FPGA. O capítulo 2 descreve uma visão geral de trabalhos relacionados na arquitetura de um FPGA do tipo ilha, considerando soluções ótimas para diferentes escolhas de circuitos e topologias. Além de descrever um programador genérico de SRAM que pode ser utili- zado em diversas arquiteturas de FPGA. O capítulo 3 ilustra o trabalho dos autores para implementar a arquitetura utilizando ferramentas comerciais robustas, destacando alter- nativas ótimas e seus gargalos. O capítulo 4 mostra a geração de bitstreams baseados na ferramenta open-source Verilog-to-Routing, assim também como as simulações e resulta- dos para diferentes configurações do projeto. O capítulo 5 conclui o trabalho e apresenta possíveis trabalhos futuros. A Figura 1.1 ilustra o conteúdo dos capítulos deste trabalho. Revisão Conclusão e Bibliográfica Trabalhos Arquitetura Futuros (Capítulo 2) (Capítulo 5) Métodos de Métodos de Síntese Implementação (Capítulo 4) do hardware (Capítulo 3) Software Desenvolvido Arquitetura Resultados (Capítulo 4) Alvo (Capítulo 4) (Capítulo 2) Bitstream Figura 1.1: Representação do conteúdo deste documento. Capítulo 2 Detalhes da arquitetura O FPGA consiste em um circuito totalmente reconfigurável, no qual se pode obter qualquer comportamento digital. Já as Unidades Centrais de Processamento (CPU), fun- cionarão apenas com o conjunto de instruções pré-estabelecidas desde sua fabricação, por exemplo. O FPGA consiste em uma matriz de blocos reconfiguráveis, interligados com uma certa lógica. A literatura tem destacado duas principais maneiras de interligação des- tes blocos lógicos (roteamento global ou alocação macroscópica dos fios), denominados de hierárquico ou do tipo ilha. Dependendo da arquitetura escolhida, o projetista se afron- tará com decisões sobre a implementação em hardware (VLSI), configuração em software e performance do dispositivo (Kuon et al. 2008). Comercialmente, os FPGAs baseados em SRAM do tipo ilha são predominantes de- vido à sua notável capacidade de roteamento. Esta arquitetura está representada na Fi- gura 2.1 e consiste de Blocos Lógicos Configuráveis (CLB) cercados de buses de rotea- mento, responsáveis por conectar as portas dos blocos lógicos entre si. Nesta arquitetura de FPGA, também são destacados os blocos de roteamento, dentre eles, o Bloco de Cone- xão (CB), que consiste em chaves programáveis responsáveis por conectar as portas dos CLB aos buses de roteamento, e o outro bloco responsável pela interligação dos buses de roteamento (SB). Entre os diferentes blocos caraterizados no FPGA, os blocos responsáveis por im- plementar a lógica programável são essenciais, pois tornam sua versatilidade real. Ape- sar de arquiteturas recentes possuírem diversos nomes para sua lógica reconfigurável, a maior parte deles compartilham um bloco bem conhecido chamado de “Look-Up Table” (LUT) ou tabela lookup (Logic Array Blocks and Adaptive Logic Modules in Stratix III Devices n.d.). A LUT consiste em uma memória para armazenar os dados programá- veis e um multiplexador (Mux) para realizar uma função lógica reconfigurável. O Mux, mostrado na Figura 2.2a usa suas portas de endereço como entradas de um circuito con- figurado e suas portas de entrada como os dados reconfiguráveis para realizar uma deter- minada tabela verdade. A Figura 2.2b exemplifica uma LUT de duas portas, programada para se comportar como uma porta AND. 3 4 CAPÍTULO 2. DETALHES DA ARQUITETURA Bloco Lógico Bloco de Bloco de Bloco de Configurável Conexão Chaves Portas Figura 2.1: Ilustração de um FPGA do tipo ilha, adaptado do VTR (Betz & Rose 1997). Endereçamento Entrsadas Lógicas 0 0 Mux Saída Saída 0 1 (a) (b) Figura 2.2: Mux implementando uma Look-Up Table. Entradas Dados Programáveis (Tabela Verdade) 5 Após a definição da LUT, a memória é requirida para implementar as entradas pro- gramáveis (assim como os estados das chaves de roteamento). A memória SRAM é uma escolha excelente, pois seu conteúdo não estará constantemente sendo alterado após a configuração do FPGA. Assim também, uma célula SRAM pode ser designada com ape- nas 6 transistores (Figura 2.3), diminuindo a área total do circuito e seu consumo, quando comparada com outras alternativas de memória, como um “D-latch”. WL Vdd M2 M4 M5 Q Q M6 M1 M3 BL BL Figura 2.3: Esquemático de uma célula SRAM com 6 transistores. A área total do FPGA está diretamente relacionada com a quantidade de LUTs que possui. Neste sentido, é necessário otimizar o tamanho de uma LUT para permitir que o FPGA tenha mais capacidade lógica. A Figura 2.4 mostra um multiplexador de uma LUT implementado como uma árvore binária de “transmission gates”, que é uma boa solução para a otimização de área. Outra possibilidade de implementação consiste em utilizar “pass transistors”, mas ela requer circuitos extras para lidar com as tensões mais elevadas na sua porta, necessárias para controlar o consumo. O trabalho em (Chiasson & Betz 2013) mostra a relação entre as duas abordagens. O número de portas de uma LUT também é um tópico de aprimoramento. O artigo (Ahmed & Rose 2004) explorou o efeito de um número de entradas para uma LUT (K) na área e performance de um circuito configurado. Ele comparou o número de LUTs reque- ridos, a área final e o caminho crítico para implementar 28 circuitos diferentes utilizando número variados de entradas para as LUTs. Os resultados do estudo mostraram que a utilização de 4 portas na entrada da LUT é ótimo considerando um FPGA homogêneo. Arquiteturas de FPGA heterogêneas podem atingir melhor performance quando com- parado com as arquiteturas homogêneas (Parvez & Mehrez 2010). Os FPGAs comer- ciais heterogêneos procuram implementar os blocos lógicos mais comumente utilizados como somadores e unidades de processamento digital (Digital Signal Processing Blocks in Stratix Series FPGAs n.d.) para criar circuitos dedicados, aperfeiçoando a performance e consumo dos circuitos configurados. Até mesmo no projeto de um FPGA homogê- neo, circuitos dedicados como o D flip-flop (DFF) são utilizados na saída de cada LUT, tornando mais prático a configuração de circuitos combinacionais ou sequenciais. A es- 6 CAPÍTULO 2. DETALHES DA ARQUITETURA I0 I1 SRAM SRAM Saída SRAM SRAM Figura 2.4: Multiplexador de uma Look-Up Table Multiplexer implementado como uma árvore binária de transmission gates. trutura composta por uma LUT e um DFF é conhecida como Elemento Lógico Básico (BLE), e está ilustrada na Figura 2.5a. BLEs podem ser interconectadas para formar CLBs, como mostra a Figura 2.5b. É importante concentrar BLEs dentro de um CLB para reduzir o número de buses de rote- amento no FPGA, pois nc roteamento pode tomar grande parte da área final do circuito. O roteamento interno do CLB também possui suas limitações com a sua escalabilidade, principalmente quando utilizando uma arquitetura totalmente conectada, onde todas as entradas e saídas do CLB podem se conectar a qualquer entrada de qualquer BLE (Fi- gura 2.5b) (Kuon et al. 2008). O estudo presente em (Betz et al. 2012) mostrou que não é necessário ter todas as en- tradas das BLEs acessíveis pelo CLB, porque algumas entradas podem não ser utilizadas, ou compartilhar um mesmo sinal para diferentes portas dentro do mesmo cluster. Uma uti- lização lógica de 98% é atingida quando aproximadamente 60% das entradas de BLE são acessadas individualmente dos buses de roteamento do FPGA, equivalentemente, 2N+2 entradas, onde N é o número de BLEs em um cluster. Para a topologia do CB, o número de chaves para os trilhos de roteamento também é outro tópico a ser considerado. Um número grande de chaves trará mais flexibilidade, contudo, resultará em uma área total e consumo maiores. Por outro lado, um número reduzido de chaves torna o FPGA menos “roteável” e limitando sua capacidade. O estudo (Betz et al. 2012) mostra que uma boa flexibilidade é alcançada quando a porcentagem de saídas conectadas (Fc) é FC = W/N, onde W representa o número de trilhas de roteamento em um bus de roteamento, e N o número de BLEs em um CLB. A conectividade das entradas deve ser um valor relativamente maior. 7 K Saída Entradas LUT DFF Clock (a) Elemento Lógico Bá sico (BLE) BLE 1 N N I BLEs N Saídas BLE N I Entradas Clock (b) Cluster totalmente conectado Figura 2.5: Unidade lógica básica e seu cluster (Kuon et al. 2008). O SB conecta os buses de roteamento do FPGA entre si (Figura 2.6). O número de conexões possíveis que uma trilha pode fazer para outras dentro do SB é chamado de flexibilidade do SB. Ao passo que esse número muda, relações entra area e roteamento variam, da mesma maneira para o CB. O comprimento de um fio em um bus de roteamento representa a quantidade de CLBs que este fio atravessa, neste sentido, os blocos SB podem ter caminhos dedicados para conectar dois buses de roteamento. Esta abordagem pode aprimorar a performance e consumo ao remover os circuitos relacionados à sua suposta chave, mas ao mesmo tempo, também diminui sua rotabilidade. Da mesma forma, podem existir diversas maneiras para a conexão dos fios dentro de um SB. Topologias comumente utilizadas como a de Wilton (Wilton 1997) e Disjoint (Wu 1995) foram investigadas por seus caminhos críticos (Betz et al. 2012). Para um comprimento de fio de 1 (atravessando apenas um CB), as duas topologias apresentaram performances similares. Todavia, à medida que os comprimentos de fio aumentam, a 8 CAPÍTULO 2. DETALHES DA ARQUITETURA topologia Disjoint mostra-se mais adequada quando comparada com a de Wilton. 0 1 2 3 0 1 2 3 3 3 3 3 2 2 2 2 1 1 1 1 0 0 0 0 0 1 2 3 0 1 2 3 (a) Disjoint (b) Wilton Figura 2.6: Topologias Wilton e Disjoint para o SB (Kuon et al. 2008). 2.1 Programador de SRAM A lógica programável do FPGA para tabelas verdade e chaves pode ser implemen- tada pela SRAM. Consequentemente, a programação e especificações dos circuitos da SRAM compõem partes importantes no FPGA que devem ser levadas em consideração detalhadamente. Existem algumas desvantagens em utilizar a SRAM que devem ser consideradas. Por exemplo, a sua volatilidade traz a necessidade de dispositivos externos para mater a con- figuração no FPGA. Esta programação repetitiva expõe o sistema para problemas de se- gurança onde a informação pode ser interceptada (Kuon et al. 2008). Assim também, a SRAM precisa de circuitos para manusear a natureza analógica dos sinais para as ope- rações de leitura e escrita de dados. Além disso, os transistores devem ser apropriada- mente dimensionados para evitar que o ruído presente na célula ocasione a inversão do bit armazenado, e ao mesmo tempo, deve permitir que os dados sejam escritos (HE & others 2006). Para programar as células da SRAM, o configurador (Figura 2.7) é composto por 4 estruturas diferentes: • Um bloco composto por buffers para escrever os dados desejados na memória. • Um decodificador para selecionar o endereço de acesso. • Um bloco composto por transistores de pull-up, para preparas as linhas de bit para leitura. • Um array de “Sense Amplifiers” para leitura dos dados armazenados na memória. Como experimentado pela implementação do sistema, um endereçamento comum de SRAM, onde cada célula possui uma coordenada x e y na matriz, leva para uma integra- ção complexa entre a descrição do hardware do FPGA e as ferramentas de síntese para 2.1. PROGRAMADOR DE SRAM 9 Bus de Entrada Bus de Saída Bus de Endereçamento Enable Enable Enable Enable Drivers de Sense Transistores fi DecodificadorEscrita Ampli ers Pull-Up SRAM SRAM SRAM Figura 2.7: Diagrama do configurador de SRAM. configuração. Neste trabalho foi implementado um endereçamento hierárquico da me- mória, tornando o acesso à posições específicas mais prático. As diferentes estruturas, como as LUTs e chaves, podem ser selecionadas por seu endereço específico, pertencen- tes à um determinado bloco da arquitetura. A SRAM é programada utilizando palavras de 16-bits por vez, no qual corresponde ao número de células de SRAM requeridas para implementar uma LUT de 4 entradas. Na indústria, grande parte dos FPGAs são integrados com uma circuitaria especial para manusear dados inesperados na SRAM. Os erros podem vir de fontes variadas, como o próprio processo de configuração de um circuito, um “Single-Event Upset” (Villa et al. 2017) ou “soft errors” (Srinivasan et al. 2004). Um método simples para lidar com estes dados inesperados é a checagem constante dos valores armazenados na memória com operações de leitura. Se um erro for observado, o configurador de SRAM pode reconfigurar apenas a parte danificada, salvando tempo de execução do sistema. Vale ressaltar que o dimensionamento das células SRAM não só influenciam a funcionalidade das operações de leitura, escrita e armazenamento, mas também da probabilidade de erro nas informações armazenadas. O livro (HE & others 2006) indica um dimensionamento padrão que foi utilizado no projeto. A análise do tamanho dos transistores também é rea- lizada no livro, mas não foi feita neste trabalho, pois o próprio livro indica que as células SRAM são providenciadas pelos fabricantes das novas tecnologias e as células fornecidas são comumente utilizadas na indústria. De qualquer forma, os diagramas “butterfly” para as células foram gerados, e estão ilustrados no próximo capítulo. O circuito “sense amplifier” é utilizado para a leitura da SRAM (Figura 2.8). Ele pode discernir pequenas diferenças entre as linhas de bit em uma operação de leitura, pois a célula SRAM transfere seus dados lentamente para as linhas de bit devido à capacitância 10 CAPÍTULO 2. DETALHES DA ARQUITETURA total, gerada pelo array de células. O nível lógico ’0’ escrito na porta “SE” do circuito gera um estado de flutuação com as linhas de bit, e então, quando o nível lógico ’1’ é escrito na porta “SE”, a linha com maior carga irá trazer o resultado (Baker 2008). Antes do circuito “sense amplifier” operar, transistores de pull-up devem trazer as linhas de bit para um nível lógico alto, tornando a comparação justa. Vdd M2 M4 BL M5 M6 BL Q Q M1 M3 SE M7 Figura 2.8: Esquemático do circuito sense amplifier. A Figura 2.9 mostra um exemplo de um configurador de memória SRAM operando um bit para leitura e escrita. No “t1”, o “Write Driver” está escrevendo o nível lógico ’1’ para a célula selecionada quando sua respectiva “palavra” está habilitada. No “t2”, todos as linhas de bit são elevadas com o “Transistor Pull-Up” sendo controlado pelo nível lógico ’0’, pois eles são controlados pela transistor pMOS. Finalmente, no “t3” o nível lógico ’0’ no “Sense Enable” permite que a leitura com os transistores de acesso pMOS. Os “sense amplifiers” eventualmente medem qual é a linha de bit com maior carga, e mostra o resultado na porta “Data”. 2.2. ARQUITETURA ALVO 11 t1 t2 t3 Word Driver de Escrita Transistor Pull-Up Sense Enable Dado Tempo (s) Figura 2.9: Sinais de configuração da SRAM. 2.2 Arquitetura alvo Neste trabalho, a escolha da melhor maneira para diminuir o tempo requerido de im- plementação foi feita, preservando a prova de conceito e utilizando as estruturas mais utilizadas nas últimas décadas (Betz et al. 2012, Kuon et al. 2008). Foi considerada a arquitetura do tipo ilha, na qual pode ser facilmente dividida em “Tiles”. Como pode ser observado na Figura 2.10, cada “Tile” contém os blocos necessários para implementar tanto a lógica reconfigurável quanto o roteamento. Uma arquitetura homogênea de FPGA foi escolhida, significando que todos os blocos lógicos são iguais na matriz do FPGA. Esta abordagem melhora o tempo de implementação da estrutura total. Tile do FPGA Roteamento Global CLB CB Configurador de SRAM CB SB Bus de Roteamento Figura 2.10: FPGA baseado em “Tiles”(Chiasson & Betz 2013). 12 CAPÍTULO 2. DETALHES DA ARQUITETURA BLE 4 BLE 3 SRAM Array BLE 2 SRAM Array 16 16 BLE 1 SRAM Array 16 16 SRAM 10 16 16 4-input DFF Saídas LUT Entradas 10 16 16 4-input LUT DFF 10 4-input 4 LUT DFF 10 4 LUT DFF 4 4 4 Clock Figura 2.11: Esquemático de um CLB. A estrutura alvo para o CLB é composta de 4 BLEs em uma configuração totalmente conectada (Figura 2.11), significando todas as entradas e saídas do CLB podem ser co- nectadas à qualquer entrada de qualquer LUT dentro do CLB. Cada LUT é implementada com 4 possíveis entradas. As portas do CLB são igualmente distribuídas pelo perímetro do CLB, com 10 entradas logicamente equivalentes e 4 saídas. Para a otimização de área, os multiplexadores são implementados como uma árvore binária de “transmission gates” ou chaves em paralelo. A Figura 2.12 mostra a estrutura de roteamento. Para o CB, as conexões são requeridas para as portas do CLB. O CB pode conectar até 25% dos fios no canal de roteamento para as entradas e saídas do CLB. O SB é do tipo Wilton, e cada fio dos canais pode conectar-se até 3 fios de outros canais. “Tri-state buffers” são utilizados para os switches de roteamento. Para os propósitos deste trabalho, os fios do bus de roteamento tem comprimento de apenas um CLB. O número de fios num canal de roteamento foi escolhido para ser 16, uma potência de 2 para facilitação da implementação, e que também engloba os piores casos reportados em (Betz et al. 2012, Kuon et al. 2008). 2.2. ARQUITETURA ALVO 13 In_0 In_4 In_8 Out_2 Out_3 Out_1 In_9 In_7 CLB In_5 In_3 In_1 In_2 In_6 Out_2 SRAM Figura 2.12: Esquemático do canal de roteamento, com o SB em verde e o CB em azul. 14 CAPÍTULO 2. DETALHES DA ARQUITETURA Capítulo 3 Implementação em VLSI A princípio, o sistema foi implementado pelo fluxo analógico na ferramenta comercial robusta “Virtuoso” parte do pacote Cadence, com o intuito de testar as funcionalidades de cada componente com modelos precisos de MOSFET na tecnologia 0.5 um. Os diagramas “butterfly” foram gerados para o dimensionamento das células SRAM, a fim de verificar a sua robustez. Como ilustrado na Figura 3.1, para a criação do gráfico, varia-se a tensão nos dois nós de entrada e então sobrepõe-se os resultados, o importante é observar qual é a largura do maior quadrado que se encaixa nos espaços abertos das curvas, a largura deste quadrado indica o quanto a tensão do ruído proveniente de diversas fontes pode oscilar sem que o conteúdo presente na memória inverta. A Figura 3.2 mostra o diagrama gerado para o modo de armazenamento, ou seja, quando a célula não está sendo lida nem escrita. A Figura 3.3 e a Figura 3.4 são os diagramas para a operação de leitura e escrita respectivamente. Os espaços em branco demonstram que o ruído precisa ter um nível de tensão considerável para que possa alterar a informação armazenada na célula. 15 16 CAPÍTULO 3. IMPLEMENTAÇÃO EM VLSI Figura 3.1: Exemplo da geração do diagrama butterfly retirado de (HE & others 2006). Figura 3.2: Diagrama butterfly para o modo de armazenamento. 17 Figura 3.3: Diagrama butterfly para o modo de leitura. Figura 3.4: Diagrama butterfly para o modo de escrita. Além da memória, também foram inspecionados os efeitos da árvore binária com “transmission gates” para os multiplexadores das LUTs, e os “tri-state buffers” nos canais de roteamento. Todavia, à medida que o projeto cresceu, mais nós foram integrados no esquemático, trazendo mais variáveis para a simulação, aumentando o tempo de execução e tornando a progressão do projeto lenta. Outro problema de implementar a estrutura pelo fluxo analógico, vem da alta chance de erros cometidos pela conexão manual dos fios em um canal de roteamento, por exem- plo. Esses erros podem ser apenas analisados nos resultados das simulações de um bits- 18 CAPÍTULO 3. IMPLEMENTAÇÃO EM VLSI tream configurado no FPGA, que pode levar algumas horas ou dias dependendo do tama- nho da matriz. 1111 11 11 1 1 1 1 1 1 1 1 Figura 3.5: Esquemático de um SB. Uma matriz de 4-CLBs foi implementada em uma tecnologia 0.5 um com 3 camadas de metal, utilizando o fluxo analógico de projeto e verificando as funcionalidades de di- versos circuitos. O “Tile” foi criado com os blocos essenciais e levando em conta as suas variações no perímetro do FPGA. A Figura 3.5 mostra o esquemático de um SB feito no Virtuoso com cada fio conectado à mão. Um dos principais desafios para o layout é a criação das células do núcleo com altura e largura similares para a conexão das portas. Estas escolhas influenciam o quanto as peças se encaixam, podendo salvar tempo de implementação e área total. A Figura 3.6 mostra o dimensionamento feito para as principais células que compõem o FPGA, o layout de um 19 CLB com o configurador de SRAM está ilustrado na Figura 3.7 para exemplificação do projeto feito no fluxo analógico. Figura 3.6: Células principais do FPGA com mesma altura. Figura 3.7: Layout de um CLB com configurador de SRAM. 20 CAPÍTULO 3. IMPLEMENTAÇÃO EM VLSI A tecnologia de 3 camadas de metal trouxe certa dificuldade de implementação devido a alta conectividade que o FPGA precisa. É visível na figura que existem grandes espaços em branco, apesar dos esforços para otimização de área. 3.1 Automatização do projeto Um projeto complexo pode trazer trabalho exaustivo, alto custo de mão-de-obra, e um grande tempo de entrega para o mercado (Parvez & Mehrez 2010). A construção manual pode ser impraticável para FPGAs maiores, nos quais atualmente podem ter mais de 5 milhões de elementos lógicos (Stratix 10 Overview n.d.). (Padalia et al. 2003) reportou que FPGAs modernos podem consumir de 50 a 200 anos para um trabalhador concluir, apenas no processo de layout. Uma boa maneira de reduzir custos no processo está na automatização da implemen- tação. O projeto GILES (Padalia et al. 2003) demonstrou uma automação completa do FPGA com redução significante do trabalho manual. (Kim & Anderson 2015) mostrou um fluxo de projeto que toma informações de uma ferramenta “open-source” para trans- formar seus recursos em um layout de FPGA junto com sua configuração. As duas abor- dagens utilizam ferramentas comerciais e não são necessariamente gratuitas. (Parvez & Mehrez 2010) implementou diversas arquiteturas de FPGA baseadas nas ferramentas gratuitas Alliance e Coriolis, combinando uma biblioteca de células e uma colocação dinâmica de layout a partir de softwares inclusos no pacote. Este método possui grande valor acadêmico, pois permite o pesquisador explorar novas arquiteturas sem a necessidade de gastar recursos financeiros em ferramentas comerciais. No entanto, a biblioteca de células digitais não é compatível com a fabricação na indústria por acordos de não divulgação. A dificuldade então cresce a partir da inviabilidade de criação de uma nova biblioteca de células digitais compatível com o software. Neste trabalho, a automatização do projeto também foi desenvolvida no pacote Ca- dence, através do fluxo digital. A metodologia começa pela descrição da arquitetura em um código Verilog estrutural, instanciando os módulos básicos do FPGA (como os mul- tiplexadores, d-flip-flops) até as estruturas mais complexas. A Figura 3.8 apresenta um exemplo do código Verilog desenvolvido para uma BLE. O circuito descrito em Verilog serve então para o “Encounter RTL compiler”, que transforma a biblioteca digital de células básicas em um Verilog sintetizado. A implemen- tação utiliza a biblioteca digital da X-FAB 0.6 um, esta biblioteca foi feita para propósito geral, e portando não é otimizada para a construção do FPGA. Assim também, a biblio- teca não contém células de SRAM. Para substituir a memória, foram utilizados latches do tipo D. Estas discrepâncias são aceitas para o intuito de prova de conceito. O layout pode então ser gerado a partir do Verilog sintetizado. Cadence SoC En- counter recebe a descrição em HDL, coloca e roteia as células automaticamente com seus algoritmos de otimização. Para ilustrar as diferenças entre a implementação feita no fluxo analógico e digital, a Tabela 3.1 compara o tempo requerido e a área de apenas um CLB. Os resultados obtidos foram baseados no desenvolvimento de uma pessoa, e o layout feito à mão não está oti- mizado para área por não utilizar os tamanhos mínimos de transistores nem a quantidade 3.1. AUTOMATIZAÇÃO DO PROJETO 21 module ble4( ble_logic, // LUT programmable logic sel, // Mux selection registered, // Registered or not clk, reset, ble_out // Mux output ); input [15:0] ble_logic; input [3:0] sel; input registered; input clk, reset; output ble_out; wire mux_out, dff_out; mux_16x1 U0( .din (ble_logic), .sel (sel), .mux_out (mux_out) ); dff_async_reset U1( .data (mux_out), .clk (clk), .reset (reset) , .q (dff_out) ); mux_2x1 U2( .din_0 (mux_out), .din_1 (dff_out), .sel (registered), .mux_out (ble_out) ); endmodule Figura 3.8: Verilog estrutural de um BLE. mínima de vias para conexões. Posteriormente, foi desenvolvido um CLB para implementação física em fábrica (Fi- gura 3.10), utilizando o mesmo fluxo digital para o FPGA desenvolvido. A biblioteca digital de células pertence à universidade estadual da carolina do norte (NCSU), com a tecnologia 0.5 um e o seu uso é gratuito. O Apêndice B detalha o fluxo digital feito no laboratório de instrumentação e microeletrônica. Assim como no fluxo analógico, a descrição de toda a arquitetura do FPGA por HDL pode tornar-se exaustiva, se desenvolvida de maneira manual. Desta maneira, uma meto- 22 CAPÍTULO 3. IMPLEMENTAÇÃO EM VLSI Figura 3.9: Matriz 2x2 de um FPGA colocado no Cadence SoC Encounter. dologia para a geração do HDL do FPGA foi desenvolvida baseada no projeto “Verilog- to-Routing” (VTR, detalhado no Capítulo 4). Em resumo, um arquivo que descreve a arquitetura do FPGA alvo é processado pelo VTR, no qual irá retornar um grafo com os respectivos blocos da arquitetura, suas localizações e conexões. A criação do HDL foi possível devido ao nível de detalhamento do grafo obtido. Esta abordagem também faci- lita a integração do hardware com os arquivos de configuração de saída do VTR. A figura Figura 3.11 mostra uma matriz de CLBs, colocados no Encounter com uma metodologia “bottom-up”, permitindo o discernimento dos blocos da hierarquia da arquitetura, assim também como suas posições. (Kim & Anderson 2015) discute metodologias de síntese que podem ser consideradas em trabalhos futuros utilizando a mesma linha de raciocínio. Projeto Manual / Automático / Schematic edi- Verilog tor Tempo de im- semanas segundos plementação no esquemá- tico Desenho meses segundos do layout Área do layout 859000 λ2 302588 λ2 Tabela 3.1: Comparação entre os fluxos analógico e digital. 3.1. AUTOMATIZAÇÃO DO PROJETO 23 Figura 3.10: Layout de um CLB desenvolvido pelo fluxo digital com a biblioteca digital da NCSU. A Figura 3.9 mostra o FPGA colocado e roteado no Encounter utilizando uma síntese “top-down”, na qual abstrai a posição de toda a hierarquia da arquitetura. No geral, a metodologia “bottom-up” prevalece, pois ela permite um menor tempo de execução das ferramentas de layout, além de tornar a análise dos caminhos críticos viável, para possí- veis circuitos configurados no FPGA. 24 CAPÍTULO 3. IMPLEMENTAÇÃO EM VLSI Figura 3.11: Matriz de CLBs colocados no Encounter. Capítulo 4 Programação e testes O planejamento de configuração, desde a síntese do Verilog até sua colocação e ro- teamento para implementar um circuito no FPGA é crucial para a sua eficiência final, e melhorias significantes em consumo e performance dependem como cada caminho e ló- gica é configurada (Betz et al. 2012). A descrição em alto nível do circuito deve passar por uma séria de algoritmos e otimizações antes que o sintetizador seja capaz de gerar um bitstream final. Apesar de haverem alguns softwares capazes de gerar bitstream (Soni et al. 2013, Coole & Stitt 2010, Lagadec et al. 2001), eles são dependentes de arquiteturas comerciais já implementadas. Enquanto estas ferramentas são interessantes para explorar o ponto de vista da configuração do estado da arte, elas não são compatíveis com a arqui- tetura especificada neste trabalho. Neste sentido, existe uma necessidade de desenvolver um gerador de bitstream compatível com o FPGA desenvolvido. Verilog-to-Routing (VTR) é um bom ponto de partida para o estudo de síntese de HDL para arquiteturas customizáveis de FPGA. O VTR tem como entrada o circuito descrito em Verilog, e retorna como saída arquivos descrevendo como cada lógica e conexão de- vem ser configuradas, baseados na arquitetura do FPGA. O software começa convertendo o código Verilog em uma lista de conexões de portas, considerando os possíveis blocos que a arquitetura contém. Uma otimização lógica é inserida para mapear as conexões em LUTs e registradores. As unidades lógicas são concentradas em clusters, que serão colo- cadas por um algoritmo de arrefecimento simulado, atingindo uma solução ótima próxima da solução global, e no final os blocos são roteados (Rose et al. 2012, Luu et al. 2014). VTR é uma ferramenta gratuita projetada para fins acadêmicos Suas saídas são des- critas em alto nível para a configuraçao do FPGA, e portanto não estão apropriadas para a programação direta do FPGA projetado, precisando então serem interpretadas. 4.1 Interpretador do VTR A Figura 4.1 ilustra o fluxo do intepretador desenvolvido. Ele é capaz de ler arquivos de saída do VTR e converte-los em um bitstream compatível com o FPGA feito neste trabalho. O VTR retorna 4 tipos diferentes de arquivos: um arquivo com extensão “.blif” que contém informações referentes às interligações das LUTs, suas tabelas verdade e se utilizam seus registradores; Um arquivo “.net” que descreve as interconexões dentro de um CLB; outros dois arquivos “.place” e “.route” que informam as posições que os CLBs 25 26 CAPÍTULO 4. PROGRAMAÇÃO E TESTES devem ser colocados na matriz e suas interconexões, respetivamente. Verilog HDL Fluxo Verilog-to-Routing arquivos .net, .blif, .place e .route Software Desenvolvido: Síntese das Conexões de Hardware e Geração do Bitstream Digital Vector file Figura 4.1: Fluxograma do software desenvolvido. O fluxo do interpretador começa utilizando um analisador de XML (Veillard 2003) para transformar o arquivo .net em uma tabela com as informações de nome, valor e pro- fundidade na hierarquia dos blocos lógicos. Depois, o arquivo .blif é lido, com suas infor- mações das tabelas verdade das LUTs e se essas LUTs são registradas ou não. O sistema então lê o arquivo .place todas as identificações de blocos na arquitetura do FPGA, no formato “Identificador do bloco, coordenada X, coordenada Y”, e junta essa informação com as dos outros arquivos lidos até então. O próximo passo é a leitura do arquivo .route, resgatando as informações relacionadas ao roteamento dos blocos descritos no arquivo .place. Finalmente, o interpretador do VTR utiliza um arquivo auxiliar extra, contendo dados sobre o hardware desenvolvido, e assim possibilitando a geração do bitstream de configuração. Para ajudar na associação entre o VTR e a arquitetura implementada (caso a referên- cia do grafo da arquitetura não seja gerado), o desenvolvedor pode utilizar a ferramenta “VPR-Viewer” (Betz & Rose 1997), disponível no pacote do VTR. A ferramenta pos- sibilita a verificação da arquitetura descrita para o VTR visualmente, para que então se 4.2. INTERFACE DE CONFIGURAÇÃO 27 possa realizar a associação do hardware. A Figura 4.2 mostra um exemplo de um circuito contador gerado utilizando o VPR-Viewer. out:top^out~1 top^reset 3 2 3 33 out:top^out~2 n28 n13 out:top^out~0 clb clb 3 3 4 4 3 out:top^out~3 clb clb top^clk Routing succeeded with a channel width factor of 16. Figura 4.2: Circuito de um contador gerado na ferramenta VPR Viewer. 4.2 Interface de configuração Conforme o número de portas necessárias para configurar o FPGA se tornaram expres- sivas, uma interface serial-para-paralelo (SPI) e paralelo-para-serial (PSI) foram criadas (Figura 4.3). Para escrita de dados, o bitstream de configuração é deslocado nos registra- dores em série do SPI, preparando os dados para serem inseridos ao mesmo tempo por outro clock, garantindo a consistência da programação. Já para leitura, o PSI lê os da- dos da SRAM em uma outra corrente de registradores com a ativação do multiplexador para leitura, em seguida, os dados armazenados são adquiridos. No total são necessários 2 clocks diferentes para cada interface, o primeiro tem a função de deslocar os bits na corrente de registradores, e o outro de transferir as informações para o configurador de SRAM ao mesmo tempo. 28 CAPÍTULO 4. PROGRAMAÇÃO E TESTES Registrador de Deslocamento Serial_IN D Q D Q D Q Bit0 Bit1 Bitn Shift_Clock CLR CLR CLR Clear D Q D Q D Q Hold_Clock CLR CLR CLR Registrador Hold Entradas de Configuração Configurador de SRAM Saída de Dados Load Registrador de Deslocamento 2x1 2x1 D Q MUX D Q MUX D Q Serial_OUT CLR CLR CLR Figura 4.3: Interface de configuração da SRAM através de um SPI e PSI. Trabalhos futuros poderiam implementar a interface JTAG, que é comumente utilizada para a programação e teste de FPGAs e outros sistemas digitais (Gruwell et al. 2016). 4.3 Simulação do FPGA feito pelo fluxo analógico A arquitetura de um FPGA com 4 CLBs feito no fluxo analógico, apresentada no capítulo 3, e o fluxo de geração de bitstream deste foram colocados à prova. O arquivo descrito em Verilog (Figura 4.4) com a funcionalidade de um contador com 4 bits foi programada no FPGA desenvolvido no Cadence Virtuoso através do for- mato “digital vector file”. O roteamento do contador está representado na Figura 4.2. O contador foi programado no FPGA, e analisado através do Cadence Virtuoso Analog En- vironment, para maior aproximação dos resultados em um cenário real. Os resultados da simulação pode ser vistos na Figura 4.5, onde os dois primeiros sinais foram gerados e os quatro últimos são as saídas do contador A partir dos resultados da simulação, é possível verificar o funcionamento correto do contador de 4 bits, que corresponde ao sucesso do fluxo de programação e funcionalidade 4.4. TESTES COM O CHIP FABRICADO PELA MOSIS PELO FLUXO DIGITAL 29 do FPGA. Alguns “glitches” podem ser observados nas saídas, que são recorrentes da simulação analógica. Todavia, as não-idealidades não comprometem o funcionamento do sistema. module up_counter( out, clk, reset ); output [3:0] out; input clk, reset; reg [3:0] out; always @(posedge clk) if (reset) begin out <= 3’b0 ; end else begin out <= out + 1; end endmodule Figura 4.4: Código verilog de um contador de 4 bits. 4.4 Testes com o chip fabricado pela MOSIS pelo fluxo digital O chip desenvolvido é composto de apenas um bloco lógico configurável (CLB), o seu esquemático interno está ilustrado na Figura 2.11. O CLB contém quatro elementos lógicos básicos (BLE). Cada BLE pode escolher quatro entradas diferentes das 10 entradas que o chip possui, além das próprias saídas das BLEs ou o nível lógico 0 fixo (que não está ilustrado na figura), totalizando 15 diferentes possibilidades de entrada para cada entrada de cada BLE. O chip foi desenvolvido pelo fluxo digital, consequentemente, a memória SRAM foi substituída por células de D-latch. Também existe a opção de tornar a saída das LUTs registradas, com um bit de ativação. A interface de configuração utilizada está ilustrada na Figura 4.3. No total, o chip fabricado possui 28 pinos. O mapeamento dos pinos com o seu encapsulamento estão descritos na Figura 4.6. O chip foi testado em uma protoboard em conjunto com uma fonte de alimentação, o dispositivo NI 6351 (Figura 4.7) e o Matlab. A tecnologia do chip fabricado é a ON 0.5 um, na qual trabalha com 5V de alimentação. Todas as portas foram devidamente conectadas, com a exceção de algumas saídas ou entradas digitais, dependendo do circuito configurado. 30 CAPÍTULO 4. PROGRAMAÇÃO E TESTES reset clk out[0] out[1] out[2] out[3] Tempo (s) Figura 4.5: Resultado da simulação para um contador de 4 bits programado no FPGA. Para verificar a funcionalidade do sistema, foi feito um script no Matlab para configu- rar um circuito desejado e testar a resposta do circuito com entradas também programadas. No exemplo seguinte (Figura 4.8), 3 BLEs foram utilizadas, a primeira foi configurada para se comportar como a porta AND, a segunda a porta OU e a terceira a porta XOR, todas de duas entradas. Na figura, foi possível observar o atraso de uma amostra na re- lação das entradas com as saídas, devido ao tempo de propagação do circuito. O circuito contador também foi programado no chip, suas saídas estão ilustradas na Figura 4.9. Mais detalhes sobre a utilização do NI 6351 com o Matlab podem ser vistos no Apêndice A. Análises quanto ao consumo e máxima frequência de operação não foram profun- damente feitas. Todavia, o contador programado no chip fabricado atingiu a frequência máxima de operação da placa NI 6351 de 1 MHz, assim também, o consumo estático observado na fonte de alimentação foi de 10 mA. 4.4. TESTES COM O CHIP FABRICADO PELA MOSIS PELO FLUXO DIGITAL 31 Figura 4.6: Especificações do chip fabricado. 32 CAPÍTULO 4. PROGRAMAÇÃO E TESTES Figura 4.7: Arranjo para testes do chip. 4.4. TESTES COM O CHIP FABRICADO PELA MOSIS PELO FLUXO DIGITAL 33 En t ra d a 0 1 .5 1 0 .5 0 -0 .5 En t ra d a 1 1 .5 1 0 .5 0 -0 .5 S a íd a 0 1 .5 1 0 .5 0 -0 .5 S a íd a 1 1 .5 1 0 .5 0 -0 .5 S a íd a 2 1 .5 1 0 .5 0 -0 .5 0 0 .5 1 1 .5 Tempo (s) -5 # 1 0 Figura 4.8: Resultados para diferentes funções de portas no mesmo chip. Clock de entrada 1.5 1 0.5 0 -0.5 Saída 0 1.5 1 0.5 0 -0.5 Saída 1 1.5 1 0.5 0 -0.5 Saída 2 1.5 1 0.5 0 -0.5 Saída 3 1.5 1 0.5 0 -0.5 0 0.5 1 1.5 2 2.5 3 Tempo (s) -4 10 Figura 4.9: Resultados para um circuito contador de 4 bits configurado. Nivel lógico Nivel lógico 34 CAPÍTULO 4. PROGRAMAÇÃO E TESTES Capítulo 5 Conclusão e Trabalhos Futuros Neste trabalho, foi apresentado o desenvolvimento de um FPGA do tipo ilha que uti- liza a SRAM para funcionalidade lógica. Diversos tópicos foram considerados, como os passos envolvendo a implementação em hardware, configuração por bitstream, e alterna- tivas de projeto para facilitar o esforço final. O trabalho apresentado pode ajudar pesquisadores na implementação ou aprimora- mento de outras arquiteturas de FPGA. Através dos detalhes apresentados, os projetistas também podem incluir FPGAs customizáveis em novas tecnologias, como em sistemas em chip (SoC) para obter performances elevadas. Apesar dos resultados mostrarem um FPGA funcional, ainda existem diversas ver- tentes que devem ser consideradas para a implementação de um FPGA comercial. A automatização do projeto apresenta desvantagens quanto à performance do circuito final. Trabalhos futuros poderiam buscar opções para a redução cada vez maior do esforço para a implementação da arquitetura, conciliando a quantidade de elementos lógicos e con- sumo do estado da arte, além de pesquisar técnicas para a redução de possíveis erros no chip fabricado. Também foi observada certa dificuldade para inovação no tópico de de- senvolvimento integral do sistema. Com o intuito de obter publicações de maneira mais suscetível, trabalhos futuros poderiam focar na melhoria de blocos específicos do FPGA ou de algorítimos de síntese. 35 36 CAPÍTULO 5. CONCLUSÃO E TRABALHOS FUTUROS Referências Bibliográficas Ahmed, Elias & Jonathan Rose (2004), ‘The effect of lut and cluster size on deep- submicron fpga performance and density’, IEEE Transactions on Very Large Scale Integration (VLSI) Systems 12(3), 288–298. Baker, R Jacob (2008), CMOS: circuit design, layout, and simulation, Vol. 1, John Wiley & Sons. Betz, Vaughn & Jonathan Rose (1997), Vpr: A new packing, placement and routing tool for fpga research, em ‘International Workshop on Field Programmable Logic and Applications’, Springer, pp. 213–222. Betz, Vaughn, Jonathan Rose & Alexander Marquardt (2012), Architecture and CAD for deep-submicron FPGAs, Vol. 497, Springer Science & Business Media. Chiasson, Charles & Vaughn Betz (2013), Should fpgas abandon the pass-gate?, em ‘2013 23rd International Conference on Field programmable Logic and Applica- tions’, IEEE, pp. 1–8. Coole, James & Greg Stitt (2010), Intermediate fabrics: Virtual architectures for cir- cuit portability and fast placement and routing, em ‘Proceedings of the eighth IE- EE/ACM/IFIP international conference on Hardware/software codesign and system synthesis’, ACM, pp. 13–22. Digital Signal Processing Blocks in Stratix Series FPGAs (n.d.). (Date last accessed 17- Jun-2017). URL: https://www.altera.com/products/fpga/features/stx-dsp-block.html Gruwell, Ammon, Peter Zabriskie & Michael Wirthlin (2016), High-speed fpga configu- ration and testing through jtag, em ‘IEEE AUTOTESTCON, 2016’, IEEE, pp. 1–8. HE, Weste Neil et al. (2006), Cmos Vlsi Design: A Circuits And Systems Perspective, 3/E, Pearson Education India. Hung, Eddie (2015), Mind the (synthesis) gap: Examining where academic fpga tools lag behind industry, em ‘Field Programmable Logic and Applications (FPL), 2015 25th International Conference on’, IEEE, pp. 1–4. In the Beginning (n.d.). (Date last accessed 16-Mar-2017). URL: https://www.altera.com/solutions/technology/system- design/articles/_2013/in-the-beginning.html 37 38 REFERÊNCIAS BIBLIOGRÁFICAS Kim, Jin Hee & Jason H Anderson (2015), Synthesizable fpga fabrics targetable by the verilog-to-routing (vtr) cad flow, em ‘Field Programmable Logic and Applications (FPL), 2015 25th International Conference on’, IEEE, pp. 1–8. Kuon, Ian, Russell Tessier & Jonathan Rose (2008), ‘Fpga architecture: Survey and chal- lenges’, Foundations and Trends in Electronic Design Automation 2(2), 135–253. Lagadec, Löic, Dominique Lavenier, Erwan Fabiani & Bernard Pottier (2001), Placing, routing, and editing virtual fpgas, em ‘International Conference on Field Program- mable Logic and Applications’, Springer, pp. 357–366. Logic Array Blocks and Adaptive Logic Modules in Stratix III Devices (n.d.). (Date last accessed 12-Jun-2017). URL: https://www.altera.com/en_US/pdfs/literature/hb/stx3/stx3_siii51002.pdf Luu, Jason, Jeffrey Goeders, Michael Wainberg, Andrew Somerville, Thien Yu, Konstan- tin Nasartschuk, Miad Nasr, Sen Wang, Tim Liu, Nooruddin Ahmed et al. (2014), ‘Vtr 7.0: Next generation architecture and cad system for fpgas’, ACM Transactions on Reconfigurable Technology and Systems (TRETS) 7(2), 6. Maybe It’s Time to Go Custom (n.d.). (Date last accessed 12-Jun-2017). URL: http://systemdesign.altera.com/maybe-time-go-custom/ Padalia, Ketan, Ryan Fung, Mark Bourgeault, Aaron Egier & Jonathan Rose (2003), Au- tomatic transistor and physical design of fpga tiles from an architectural specifica- tion, em ‘Proceedings of the 2003 ACM/SIGDA eleventh international symposium on Field programmable gate arrays’, ACM, pp. 164–172. Parvez, Husain & Habib Mehrez (2010), Application-specific mesh-based heterogeneous FPGA architectures, Springer Science & Business Media. Rose, Jonathan, Jason Luu, Chi Wai Yu, Opal Densmore, Jeffrey Goeders, Andrew So- merville, Kenneth B Kent, Peter Jamieson & Jason Anderson (2012), The vtr pro- ject: architecture and cad for fpgas from verilog to routing, em ‘Proceedings of the ACM/SIGDA international symposium on Field Programmable Gate Arrays’, ACM, pp. 77–86. Soni, Ritesh Kumar, Neil Steiner & Matthew French (2013), Open-source bitstream gene- ration, em ‘Field-Programmable Custom Computing Machines (FCCM), 2013 IEEE 21st Annual International Symposium on’, IEEE, pp. 105–112. Srinivasan, Suresh, Aman Gayasen, Narayanan Vijaykrishnan, Mahmut Kandemir, Yuan Xie & Mary Jane Irwin (2004), Improving soft-error tolerance of fpga configuration bits, em ‘Computer Aided Design, 2004. ICCAD-2004. IEEE/ACM International Conference on’, IEEE, pp. 107–110. Stratix 10 Overview (n.d.). (Date last accessed 14-Jun-2017). URL: https://www.altera.com/products/fpga/stratix-series/stratix-10/overview.html REFERÊNCIAS BIBLIOGRÁFICAS 39 Veillard, Daniel (2003), ‘The xml c parser and toolkit of gnome. libxml’, System Home page at http://xmlsoft. org . Villa, Paulo RC, Roger C Goerl, Fabian Vargas, Letícia B Poehls, Nilberto H Medina, Nemitala Added, Vitor AP de Aguiar, Eduardo LA Macchione, Fernando Aguirre, Marcilei AG da Silveira et al. (2017), Analysis of single-event upsets in a microsemi proasic3e fpga, em ‘Test Symposium (LATS), 2017 18th IEEE Latin American’, IEEE, pp. 1–4. Wilton, Steven JE (1997), Architectures and algorithms for field-programmable gate ar- rays with embedded memory, Tese de doutorado, Department of Electrical and Com- puter Engineering, University of Toronto. Wu, Malgorzata Marek-Sadowska Yu-Liang (1995), Orthogonal greedy coupling-a new optimization approach to 2-d fpga routing, em ‘Design Automation, 1995. DAC’95. 32nd Conference on’, IEEE, pp. 568–573. Xilinx FPGA Applications (n.d.). (Date last accessed 16-Jun-2017). URL: https://www.xilinx.com/applications.html 40 REFERÊNCIAS BIBLIOGRÁFICAS Apêndice A Utilização do dispositivo NI 6351 com o Matlab A utilização da placa com o Matlab se mostrou bem intuitiva, o comando (dentro do Matlab) “daq.getDevices” retorna na tela os dispositivos de aquisição de dados que estão conectados no computador: >>daq.getDevices ans = Data acquisition devices: index Vendor Device ID Description ----- ------ --------- -------------------------------------------- 1 ni Dev1 National Instruments PCIe-6351 2 ni Dev2 National Instruments PCIe-6351 3 ni SimDev1 National Instruments NI Simulated DAQ Device Assumiu-se que a identificação do dispositivo existente tem o nome de “Dev1”. Então, a partir do dispositivo selecionado, é possível observar suas portas e especificações de cada porta: >>devices = daq.getDevices; >>devices(1) ans = ni: National Instruments PCIe-6351 (Device ID: ’Dev1’) Analog input subsystem supports: 7 ranges supported Rates from 0.1 to 1250000.0 scans/sec 16 channels (’ai0’ - ’ai15’) ’Voltage’ measurement type 42 APÊNDICE A. UTILIZAÇÃO DO DISPOSITIVO NI 6351 COM O MATLAB Analog output subsystem supports: -5.0 to +5.0 Volts,-10 to +10 Volts ranges Rates from 0.1 to 2857142.9 scans/sec 2 channels (’ao0’,’ao1’) ’Voltage’ measurement type Digital subsystem supports: Rates from 0.1 to 10000000.0 scans/sec 24 channels (’port0/line0’ - ’port2/line7’) ’InputOnly’,’OutputOnly’,’Bidirectional’ measurement types Counter input subsystem supports: Rates from 0.1 to 100000000.0 scans/sec 4 channels (’ctr0’,’ctr1’,’ctr2’,’ctr3’) ’EdgeCount’,’PulseWidth’,’Frequency’,’Position’ measurement types Counter output subsystem supports: Rates from 0.1 to 100000000.0 scans/sec 4 channels (’ctr0’,’ctr1’,’ctr2’,’ctr3’) ’PulseGeneration’ measurement type Na saída do programa, é possível notar que existem 16 portas analógicas de entrada, que podem trabalhar a uma taxa de até 1.25 MHz, por exemplo. O shield NI SCB-68A é utilizado como interface para o dispositivo NI 6351 instalado no computador, portanto é necessário o conhecimento da localização de cada porta no shield. Os detalhes do shield estão especificados no arquivo em anexo “NISCB-68A.pdf” e o dispositivo em “ni6351.pdf”. Para a aquisição de dados no modo batch, cria-se um objeto que armazenará as espe- cificações dadas: analyser = daq.createSession(’ni’); Então, são atribuídas as entradas e saídas desejadas no objeto: addAnalogInputChannel(analyser,’Dev1’, ’ai0’, ’Voltage’); addDigitalChannel(analyser,’Dev1’, ’Port0/Line0:3’, ’InputOnly’); addDigitalChannel(analyser,’Dev1’, ’Port0/Line4’, ’OutputOnly’); No exemplo acima, uma porta analógica de entrada, quatro portas digitais de entrada e uma porta digital de saída são atribuídas ao objeto. No modo batch, a inserção de pelo menos uma porta analógica de entrada é necessária (mesmo que ela não seja utilizada), para que as entradas digitais utilizem o clock das entradas analógicas como referência, por isso, a maior taxa de aquisição possível é de 1.25 MHz neste modo (como especificado no datasheet e na saída do Matlab). Foi observado no datasheet e nos reports do Matlab que 43 apenas as portas no range “Port0” podem funcionar com o modo batch, as outras portas digitais funcionam somente com atribuições lógicas pontuais no código. Uma sugestão para a utilização de mais portas neste modo seria a adaptação das portas analógicas. Para testar o FPGA desenvolvido, foi programado um contador de 4 bits em sua me- mória. Um clock artificial foi criado para observar o funcionamento do contador: x = zeros(300,1); x(1:4:300,1) = 1; x(2:4:300,1) = 1; O vetor binário criado foi inserido na saída digital dentro do objeto “analyser”: queueOutputData(analyser,x); Vale salientar que é possível a programação de múltiplas saídas, o objeto considera que cada coluna de uma matriz inserida corresponde aos dados representados por deter- minado instante de tempo para cada porta. No exemplo até então, apenas uma coluna foi inserida, pois existe apenas uma saída digital no objeto. Também é possível configurar a taxa de aquisição do modo batch e o seu tempo de duração: analyser.Rate = 1e6; %analyser.DurationInSeconds = 1; Quando existe um vetor especificado para as saídas, o tempo de execução é limitado pelo seu tamanho. Neste exemplo, o vetor possui tamanho de 300 com uma taxa de 1 MHz, por isso o tempo decorrido será de 0.3 ms. Finalmente, o sistema pode ser executado com o seguinte comando: [captured_data,time] = analyser.startForeground(); %analyser.DurationInSeconds = 1; Ao fim da execução, uma matriz referente aos dados obtidos e um vetor referente aos tempos de amostragem serão retornados (Figura 4.8). Existem outras duas maneiras de trabalhar com as entradas e saídas do dispositivo. A primeira consiste em controlar as portas pelo próprio fluxo de código do Matlab. Neste sentido, as portas são lidas e escritas por linhas de comando pontuais que não necessa- riamente possuem uma taxa de aquisição bem definida, como no caso do modo batch. A leitura e escrita podem ser executadas com as seguintes linhas de comando, de ma- neira muito similar ao modo batch, com a diferença de lidar com os dados em apenas um instante de tempo. analyser.outputSingleScan(x) data = analyser.inputSingleScan() 44 APÊNDICE A. UTILIZAÇÃO DO DISPOSITIVO NI 6351 COM O MATLAB A última maneira analisada consiste na aquisição dos dados em tempo real, as con- figurações do objeto são praticamente idênticas ao modo batch descrito anteriormente. Para migrar do modo batch para a visualização em tempo real, basta substituir a linha de código “[captured_data,time] = analyser.startForeground;” por: reader = analyser.addlistener(’DataAvailable’, @(src,event) plot(event.TimeStamps, event.Data)); analyser.startBackground(); O modo “Background” é executado em segundo plano com o código principal do Ma- tlab, se comportando como um processo independente. Diferente do modo “Foreground”, o “Background” pode ser configurado para ter seu tempo de execução indeterminado: analyser.IsContinuous = true; Foi constatado que o modo “Background” chama a função “callback” especificada no terceiro parametro do handle “reader” cada vez que obtém 100 amostras de dados. Esta função de “callback” pode ser modificada para qualquer funcionalidade, como o armazenamento dos dados obtidos ou a inserção de outro vetor de dados para as saídas com o “queueOutputData(analyser,x);”. O seguinte exemplo mostra o armazenamento dos dados obtidos para cada nova sequência de amostras, assim também, mostra as saídas em tempo real e as entradas utilizadas naqueles instantes de tempo: t = []; e = []; x = zeros(300,1); x(1:4:300,1) = 1; x(2:4:300,1) = 1; save(’read_output.mat’,’t’,’e’,’x’); reader = analyser.addlistener(’DataAvailable’, @(src,event) reader_func(src,event)); analyser.startBackground(); analyser.wait(); function reader_func(src,event) %t = event.TimeStamps; %e = event.Data; %plot(t,e) load(’read_output.mat’); t = [t ; event.TimeStamps]; e = [e ; event.Data]; x([1:length(event.TimeStamps)],:) = []; plot(event.TimeStamps,event.Data,event.TimeStamps, x(1:length(event.TimeStamps),2)); save(’read_output.mat’,’t’,’e’,’x’); end A.1. CONSIDERAÇÕES DE FUNCIONAMENTO 45 A.1 Considerações de funcionamento Inicialmente, foram conectados 4 leds nas saídas do chip desenvolvido, a fim de ob- servar o funcionamento das saídas em dois lugares distintos. No entanto, foi constatado que estes leds conectados geraram certa interferência no bom funcionamento do contador programado no FPGA. Quando os leds foram retirados, a saída voltou ao comportamento esperado. Essas interferências podem ter sido causadas pela carência de corrente for- necida pela saída do chip, quando conectada nos terminais dos leds e nas entradas do shield SCB-68A paralelamente. As causas podem ser variadas, mas os efeitos não foram analisados detalhadamente. Outro comportamento foi observando com relação à interferência da rede. Quando o modo batch foi executado com uma taxa de aquisição de 1 MHz, observou-se uma modulação no sinal obtido por uma frequência de 60 Hz pertencente à rede. 46 APÊNDICE A. UTILIZAÇÃO DO DISPOSITIVO NI 6351 COM O MATLAB Apêndice B Fluxo Digital no ambiente Cadence A intenção deste apêndice é mostrar todos os passos requeridos para fabricar um chip com sucesso, através do ambiente Cadence, utilizando a biblioteca digital da NCSU 0.5um. É importante destacar que este procedimento pode ser reproduzido de maneira similar para outras tecnologias. Com exceção das ferramentas da Cadence, o chip pode ser fabricado de maneira gratuita se os outros recursos forem utilizados. O fluxo digital começa com a definição de um código HDL, especificado para o pro- jeto desejado. Para simplicidade da ilustração, o código Verilog de um contador de 8 bits será utilizado: module up_counter( out, enable, clk, reset ); output [7:0] out; input enable, clk, reset; reg [7:0] out; always @(posedge clk) if (reset) begin out <= 8’b0 ; end else if (enable) begin out <= out + 1; end endmodule E o seu testbench: ‘include "up_counter.v" 48 APÊNDICE B. FLUXO DIGITAL NO AMBIENTE CADENCE module up_counter_tb; wire [7:0] out; reg enable, clk, reset; up_counter U0( .out (out), .enable (enable), .clk (clk), .reset (reset) ); initial begin $monitor("out=%8b enable=%b clk=%b reset=%b", out,enable,clk,reset); enable=1; reset=0; clk=0; #1 reset=1; #1 clk=1; #1 reset=0; clk=0; #1 repeat(300) #20 clk = ~clk; end endmodule A simulação do código desenvolvido pode ser verificada com a ferramenta “irun” do pacote “NCSim”, executando em uma interface gráfica ou no terminal. Na GUI (SimVi- sion): irun -gui -access rwc up_counter_tb.v Após a abertura do programa, clique na instância “up_counter_tb” e depois “Send To: Waveform”. Pressione “Run” e os resultados da simulação podem ser vistos na Fi- gura B.1: O próximo passo consiste na sintetização do Verilog desenvolvido. A ferramenta “En- counter RTL Compiler” (RC) é utilizada para traduzir o Verilog em uma combinação de células digitais de uma biblioteca digital, NCSU no exemplo proposto. O arquivo con- tendo as informações das células digitais possui normalmente uma extensão “.lib”, o nome 49 Figura B.1: Visualização da simulação para o contador de 8 bits na ferramenta SimVision. do arquivo do NCSU para a tecnologia 0.5um é “osu05_stdcells.lib”, é preciso garantir que este arquivo está na mesma pasta de trabalho. Em seguida, execute o sintetizador: "path_to_RC"/bin/rc Quando o terminal do RC abrir, execute os seguintes comandos: 1. set_attribute library osu05_stdcells.lib 2. set interconnect_mode wireload 3. read_hdl up_counter.v 4. elaborate 5. synthesize -to_mapped 6. report area (optional) 7. report gates (optional) 8. report timing (optional) 9. write_hdl > up_counter_synth.v 10. exit Caso exista maior necessidade de compreensão dos comandos, pode-se consultar o manual do usuário dentro do pacote Cadence. Após seguir os passos passados, a ferra- menta irá retornar o Verilog sintetizado: 50 APÊNDICE B. FLUXO DIGITAL NO AMBIENTE CADENCE module up_counter(out, enable, clk, reset); input enable, clk, reset; output [7:0] out; wire enable, clk, reset; wire [7:0] out; wire n_0, n_1, n_2, n_3, n_4, n_5, n_6, n_7; wire n_10, n_11, n_12, n_14, n_15, n_16, n_17, n_18; wire n_19, n_20, n_21, n_22, n_23, n_24, n_25, n_26; wire n_27, n_28, n_29, n_30, n_31, n_32, n_33, n_34; wire n_35, n_36, n_37, n_38, n_39, n_40, n_52; DFFPOSX1 \out_reg[7] (.CLK (clk), .D (n_40), .Q (out[7])); NOR2X1 g129(.A (reset), .B (n_38), .Y (n_40)); DFFPOSX1 \out_reg[6] (.CLK (clk), .D (n_39), .Q (out[6])); NOR2X1 g132(.A (reset), .B (n_36), .Y (n_39)); DFFPOSX1 \out_reg[5] (.CLK (clk), .D (n_37), .Q (out[5])); AOI22X1 g131(.A (enable), .B (n_34), .C (n_35), .D (out[7]), .Y (n_38)); NOR2X1 g137(.A (reset), .B (n_32), .Y (n_37)); DFFPOSX1 \out_reg[4] (.CLK (clk), .D (n_33), .Q (out[4])); AOI22X1 g134(.A (enable), .B (n_29), .C (n_35), .D (out[6]), .Y (n_36)); OAI21X1 g133(.A (out[7]), .B (n_30), .C (n_31), .Y (n_34)); NOR2X1 g143(.A (reset), .B (n_28), .Y (n_33)); DFFPOSX1 \out_reg[3] (.CLK (clk), .D (n_27), .Q (out[3])); AOI22X1 g139(.A (enable), .B (n_26), .C (n_35), .D (out[5]), .Y (n_32)); NAND2X1 g136(.A (out[7]), .B (n_30), .Y (n_31)); DFFPOSX1 \out_reg[2] (.CLK (clk), .D (n_25), .Q (out[2])); OAI21X1 g138(.A (out[6]), .B (n_23), .C (n_24), .Y (n_29)); AOI22X1 g145(.A (enable), .B (n_19), .C (n_35), .D (out[4]), .Y (n_28)); NOR2X1 g149(.A (reset), .B (n_22), .Y (n_27)); OAI21X1 g144(.A (out[5]), .B (n_21), .C (n_20), .Y (n_26)); NOR2X1 g155(.A (reset), .B (n_18), .Y (n_25)); NAND2X1 g141(.A (out[6]), .B (n_23), .Y (n_24)); OR2X2 g142(.A (n_23), .B (n_0), .Y (n_30)); AOI22X1 g151(.A (enable), .B (n_15), .C (n_35), .D (out[3]), .Y (n_22)); OR2X2 g147(.A (n_21), .B (n_3), .Y (n_23)); NAND2X1 g148(.A (out[5]), .B (n_21), .Y (n_20)); OAI21X1 g150(.A (out[4]), .B (n_16), .C (n_17), .Y (n_19)); AOI22X1 g157(.A (enable), .B (n_52), .C (n_35), .D (out[2]), .Y (n_18)); DFFPOSX1 \out_reg[1] (.CLK (clk), .D (n_14), .Q (out[1])); 51 NAND2X1 g153(.A (out[4]), .B (n_16), .Y (n_17)); OR2X2 g154(.A (n_16), .B (n_2), .Y (n_21)); OAI21X1 g156(.A (out[3]), .B (n_11), .C (n_12), .Y (n_15)); NOR2X1 g161(.A (reset), .B (n_10), .Y (n_14)); NAND2X1 g159(.A (out[3]), .B (n_11), .Y (n_12)); OR2X2 g160(.A (n_11), .B (n_1), .Y (n_16)); DFFPOSX1 \out_reg[0] (.CLK (clk), .D (n_7), .Q (out[0])); AOI22X1 g163(.A (enable), .B (n_4), .C (n_35), .D (out[1]), .Y (n_10)); NAND2X1 g165(.A (out[2]), .B (n_6), .Y (n_11)); NOR2X1 g167(.A (reset), .B (n_5), .Y (n_7)); MUX2X1 g170(.A (n_35), .B (enable), .S (out[0]), .Y (n_5)); HAX1 g169(.A (out[1]), .B (out[0]), .YC (n_6), .YS (n_4)); INVX1 g174(.A (out[5]), .Y (n_3)); INVX1 g173(.A (out[4]), .Y (n_2)); INVX1 g171(.A (out[3]), .Y (n_1)); INVX1 g175(.A (enable), .Y (n_35)); INVX1 g172(.A (out[6]), .Y (n_0)); XOR2X1 g2(.A (out[2]), .B (n_6), .Y (n_52)); endmodule O código mostrado acima ilustra o resultado da síntese, de um HDL comportamental para um estrutural, composto das células digitais da biblioteca digital fornecida. Em sequência, é possível a verificação do código gerado pela síntese. O arquivo “osu05_stdcells.v” contém as características digitais de todas as células da biblioteca di- gital, basta então incluí-lo para realizar a nova simulação: ‘include "osu05_stdcells.v" ‘include "up_counter_synth.v" O próximo passo é o encapsulamento da instância Verilog criada com os pads do chip a ser fabricado. A orientação dos pads da NCSU está descrita no arquivo “ex_encounter.io” dentro do pacote NCSU. Para encapsular, cria-se outra instância dentro do arquivo do Verilog sintetizado, conectando os “fios” do circuito para os pads como: module up_counter_synth_pads(out_pad,enable_pad,clk_pad,reset_pad); input enable_pad, clk_pad, reset_pad; output [7:0] out_pad; wire enable, clk, reset; wire [7:0] out; up_counter CORE( .out(out), .enable(enable), 52 APÊNDICE B. FLUXO DIGITAL NO AMBIENTE CADENCE .clk(clk), .reset(reset) ); PADOUT p00 (.YPAD(out_pad[0]), .DO(out[0])); PADOUT p01 (.YPAD(out_pad[1]), .DO(out[1])); PADOUT p02 (.YPAD(out_pad[2]), .DO(out[2])); PADOUT p03 (.YPAD(out_pad[3]), .DO(out[3])); PADOUT p04 (.YPAD(out_pad[4]), .DO(out[4])); PADOUT p05 (.YPAD(out_pad[5]), .DO(out[5])); PADOUT p06 (.YPAD(out_pad[6]), .DO(out[6])); PADOUT p07 (.YPAD(out_pad[7]), .DO(out[7])); PADINC p08 (.YPAD(enable_pad), .DI(enable)); PADINC p09 (.YPAD(clk_pad), .DI(clk)); PADINC p10 (.YPAD(reset_pad), .DI(reset)); PADGND p11 (); PADVDD p12 (); PADGND p20 (); PADVDD p21 (); PADGND p30 (); PADVDD p31 (); PADNC p13 (); PADNC p14 (); PADNC p15 (); PADNC p16 (); PADNC p17 (); PADNC p18 (); PADNC p19 (); PADNC p22 (); PADNC p23 (); PADNC p24 (); 53 PADNC p25 (); PADNC p26 (); PADNC p27 (); PADNC p28 (); PADNC p29 (); PADNC p32 (); PADNC p33 (); PADNC p34 (); PADNC p35 (); PADNC p36 (); PADNC p37 (); PADNC p38 (); PADNC p39 (); PADFC c01 (); PADFC c02 (); PADFC c03 (); PADFC c04 (); endmodule O “PADOUT” e “PADINC” são os pads responsáveis pelas entradas e saídas do sis- tema, “PADNC” para “dummy”, “PADVDD” e “PADGND” para alimentação do chip, e “PADFC” para as quinas. A próxima etapa consiste na colocação do layout pela ferramenta “Cadence Encoun- ter”, é necessária a inclusão dos arquivos “ex_encounter.io”, “osu05_stdcells.stacks.lef” e “osu05_stdcells.lef” dentro do diretório de trabalho. Os arquivos com extensão “.lef” contém informação resumida dos layouts da biblioteca digital, como sua área e coordena- das das portas de entrada e saída, se assemelhando aos símbolos de um esquemático no Virtuoso, por exemplo. Em seguida, executa-se o Encounter: "path_to_Encounter"/bin/encounter E então abre-se “File->Import Design. . . ” (Figura B.2) 1. Files: up_counter_synth.v 2. By User: up_counter_synth_pads 3. LEF Files: osu05_stdcells.lef osu05_stdcells.stacks.lef 4. IO Assignment File: ex_encounter.io 5. Power Nets: vdd! 6. Power Nets: gnd! 7. OK 54 APÊNDICE B. FLUXO DIGITAL NO AMBIENTE CADENCE Figura B.2: Configurações para o uso da ferramenta Encounter. Resultando na Figura B.3 55 Figura B.3: Visualização do resultado das configurações iniciais no Encounter. Depois, configura-se a área que serão colocados os pads e células do chip. Abre- se “Floorplan->Specify Floorplan. . . ->Die/IO/Core Coordinates->subtract 100 units of space from width and height (Core LL->UR)” (Figura B.4). Figura B.4: Configurações para o floorplan. Deve-se alterar a direção dos pads, pois eles estão 180 graus rotacionados de sua posição ideal (como constatado experimentalmente) com exceção das quinas, que se- rão ajustadas posteriormente. “Floorplan->Specify Floorplan. . . ->Advanced->Bottom IO Pad Orientation->R180” 56 APÊNDICE B. FLUXO DIGITAL NO AMBIENTE CADENCE Figura B.5: Floorplan com pads rotacionados e espaçamento para alimentação. Então, insere-se os anéis e tiras de alimentação. “Power->Connect Global Nets. . . ” . 1. Tie High->Pin name:vdd->Apply All->To Global Net:vdd!->Add to List 2. Tie Low->Pin name:gnd->Apply All->To Global Net:gnd!->Add to List 3. Apply “Power->Power Planning->Add Ring. . . ” (Figura B.6). 1. Net(s): vdd! gnd! 2. Width Top/Bottom/Left/Right: 15 3. Spacing Top/Bottom/Left/Right: 10 4. Center in channel 5. OK Figura B.6: Visualização dos anéis alimentação do chip. “Power->Power Planning->Add Stripes” (Figura B.7). 57 1. Net(s): vdd! gnd! 2. Width: 15 3. Spacing: 10 4. Number of sets: 1 5. Relative from core or selected area->X from left 350 ||(1100-400)/2 6. OK Figura B.7: Visualização das tiras alimentação do chip. “Route->Special Route->Net(s): vdd! gnd!->OK” Após implementar a alimentação, coloca-se as células digitais no layout, assim como o enchimento para prevenir danos na fabricação do chip. “Place->Standard Cell->Run Full Placement->Include Pre-Place Optimization->OK” (Figura B.8). Figura B.8: Visualização das células digitais posicionadas. “Place->Physicall Cell->Add Filler->Cell Name->Select->FILL->Add” (Figura B.9). 58 APÊNDICE B. FLUXO DIGITAL NO AMBIENTE CADENCE Figura B.9: Visualização do enchimento para bom funcionamento do chip fabricado. “Route->NanoRoute->Route->OK”. Finalmente, finaliza-se o trabalho no Encounter ao salvar o projeto. “File->Save- >Netlist | File->Save->DEF”. O arquivo netlist será utilizado para importar o esquemático no Cadence Virtuoso, e o DEF para importar o layout. Para importar no Virtuoso, cria-se uma nova biblioteca para importar o projeto e anexa-se a techlib “NCSU_TechLib_ami06”. Então, na janela principal: “File->Import- >Verilog” 1. Target Library Name: counter_import 2. Reference Libraries: OSU_stdcells_ami05 NCSU_Analog_Parts 3. Verilog Files To Import: “path_to_encounter_file”/up_counter_encounter.v 4. OK Então, importa-se o layout: “File->Import->DEF” 1. DEFIn File Name: 2. “path_to_def_file”/up_counter_encounter.def 2. Target Library Name: counter_import 3. Ref. Technology Libraries: *leave it blank* 4. Target Cell Name: up_counter_synth_pads 5. Target View Name: layout 6. OK Após a importação do layout e esquemático, é possível observá-los na ferramenta. No entanto, as camadas do layout ainda não podem ser vistas pois é necessária um ma- peamento das vistas das instâncias: “Shift+s->Search for “inst” in “current cellView”- >Replace “view name”->layout->Apply->Replace All” (Figura B.10). B.1. ALGUMAS CONSIDERAÇÕES 59 Figura B.10: Visualização das camadas do layout no Virtuoso. Observar-se que as quinas estão rotacionadas 180 graus de sua posição ideal. Para realizar o ajuste adequado, basta escolher uma orientação de rotação nas propriedades dos objetos pertencentes às quinas. Figura B.11: Visualização do layout do chip no Virtuoso. B.1 Algumas considerações Por algum motivo a ser investigado, o Virtuoso não importa o layout com as vias para alimentação do chip vindo dos anéis e das tiras, também podem existir algumas portas dos pads que não estão conectadas ao circuito por pouco. A correção do projeto foi feita manualmente. Antes de estar pronto para fabricação, o chip precisa passar pela verificação das regras de design (DRC) e correspondência com o esquemático (LVS). As regras dos pads não são as mesmas para o circuito comum, por isso, os pads foram desconsiderados para realização das verificações. Criou-se uma biblioteca clone para remoção dos pads sem danos ao projeto principal. 60 APÊNDICE B. FLUXO DIGITAL NO AMBIENTE CADENCE A fabricação pode ser feita pelo programa gratuito da empresa MOSIS, para universi- dades.