\chapter{Conclusões}
    \label{chap:conclusoes}
    \epigraph{``Otimização prematura é a raiz de todo o mal''}
    {Donald Knuth, criador do \LaTeX , sistema usado para formatar este relatório}

    O objetivo principal deste trabalho foi avaliar a viabilidade de se utilizar síntese de alto nível para a
    implementação de algoritmos de propósito geral em hardware reconfigurável. Tendo em vista os resultados
    alcançados podemos dizer que, com uma escolha razoável de configurações, uma ferramenta de síntese de alto
    nível pode chegar a resultados bastante próximos dos alcançados por um experiente projetista de hardware.
    
    Apesar de, em termos absolutos, a solução sintetizada automaticamente ter ocupado uma área bastante maior
    (cerca de 30\% de acréscimo), em termos de porcentagem de ocupação do dispositivo FPGA a diferença não
    foi significativa. Cremos que essa é uma tendência, e que com o aumento do poder computacional dos
    FPGAs a síntese de alto nível se tornará de fato cada vez mais viável.

    Nosso estudo de caso, um escalonador de recursos, normalmente seria considerado um mau candidato a
    beneficiar-se de síntese de alto nível, pois é relativamente pobre em computação e possui um estado
    interno significativo. Mesmo assim conseguimos demonstrar que, com uma boa engenharia de domínio e
    separação de responsabilidades entre os componentes de um sistema, é possível se ter código genérico
    suficiente a ponto de executar com poucas modificações tanto em software quanto em hardware.

    O principal argumento que esperamos ter ajudado a sustentar neste trabalho é de que as técnicas e
    ferramentas de síntese de alto nível são um passo largo na direção de \emph{separar} o
    \emph{comportamento} de um algoritmo dos aspectos relativos ao seu \emph{cenário de implementação}
    (hardware ou software). Não procuramos alegar, de maneira alguma, que o conhecimento de
    arquitetura de hardware fica desnecessário com o uso de ferramentas de síntese de alto nível. Usando
    tais ferramentas, porém, o projetista evita que preocupações relativas a desempenho venham afetar
    a sua \emph{modelagem} do algoritmo sendo implementado. Com a síntese de alto nível, o projetista
    consegue mais facilmente se afastar do abismo já profetizado por Donald Knuth em sua célebre frase:
    \begin{quote}
        ``Otimização prematura é a raiz de todo o mal''
    \end{quote}

    Nas seções seguintes procuramos destacar as principais contribuições técnico-científicas do trabalho e
    enumerar alguns dos pontos que poderiam ser explorados em trabalhos futuros.

    \section{Principais contribuições}
        \label{sec:contribuicoes}
        Compreendemos que a modelagem do problema estudado e a utilidade dos artefatos desenvolvidos
        não se restringe ao algoritmo que desenvolvemos (um escalonador). Em particular, ressaltamos
        as seguintes principais contribuições deste trabalho:
        \begin{description}
            \item[Camadas de adaptação de um objeto para implementação em hardware] Em nosso desenvolvimento
                do escalonador proposto, fomos guiados sobretudo pelas restrições da ferramenta de síntese
                de alto nível. Essas restrições nos levaram a modelar uma arquitetura \emph{em camadas}, que
                encapsula um objeto, responsabilizando-se pelo gerenciamento de recursos necessários à sua
                execução e pela comunicação com o mundo externo. Os componentes descritos nas seções
                \ref{subsec:maybe}, \ref{subsec:escalonador-prealloc} e \ref{subsec:escalonador-wrapper}
                são genéricos, e podem encapsular outras classes de objetos além do escalonador.

            \item[Adaptador Plasma / AMBA] Como ambiente de execução do escalonador desenvolvido, escolhemos
                o processador \emph{softcore} Plasma MIPS. O principal motivo dessa escolha foi o fato de que
                o Plasma MIPS é um processador de código aberto, livremente modificável. Já nossa escolha de
                barramento para o SoC onde o escalonador executaria recaiu sobre a família
                AMBA\textregistered, da fabricante ARM\textregistered . Como o Plasma MIPS não possuía
                interface AMBA\textregistered , nós desenvolvemos um componente adaptador, o qual torna
                um processador Plasma mestre em um barramento AXI4Lite (barramento
                AMBA\textregistered  simplificado). Este adaptador foi desenvolvido em linguagem VHDL
                e seu código-fonte, documentação e testes foram publicados no repositório de hardware
                livre \emph{OpenCores}\footnote{\url{http://www.opencores.org}}.
        \end{description}

    \section{Trabalhos futuros}
        \label{sec:trabalhos-futuros}
        Como principais trabalhos futuros que poderiam explorar avanços na mesma temática deste trabalho
        ressaltamos:
        \begin{itemize}
            \item Fazer do escalonador proposto um protótipo de componente de SO efetivamente híbrido, segundo
                a visão de longo prazo do EPOS, como descrita em \citeonline{marcondes-hybrid}. Isto é,
                através de alguns avanços no sistema de compilação do EPOS toda a camada de adaptação para
                hardware deveria ser acrescentada a um componente, sempre que fosse escolhido pelo usuário
                sua implementação em hardware.
            \item Modelar outras estruturas de dados e algoritmos em hardware, utilizando-se também de síntese
                de alto nível. Seria particularmente interessante uma pesquisa sobre estruturas de dados
                paralelas, sua descrição em alto nível de abstração e implementação em hardware.
            \item Partir das contribuições deste trabalho em direção a um protocolo de comunicação
                entre objetos independentes de implementação. Objetos em hardware teriam um protocolo
                padronizado para troca de mensagens entre si, assim como com objetos em software. De certa
                forma, essa linha de trabalho está relacionada à temática de invocação remota e objetos
                distribuídos.
        \end{itemize}
