\chapter{Ambiente de validação}
    \label{sec:soc-validacao}
    Para efeitos de validação da implementação desenvolvida para o escalonador, o SoC
    com a arquitetura na figura \ref{fig:epos-soc} foi desenvolvido. Nesse cenário, todos os componentes
    do EPOS executam em software sobre um \emph{soft-processor}\footnote{um processador
    implementado na lógica programável de um FPGA}, excetuando-se unicamente o escalonador.
    \begin{figure}[h]
        \begin{center}
            \includegraphics[width=0.4\textwidth]{imagens/epos-soc.pdf}
        \end{center}
        \caption[Arquitetura do SoC usado para validação]
        {Arquitetura do SoC utilizado na validação da implementação desenvolvida}
        \label{fig:epos-soc}
    \end{figure}

    Todo o sistema foi sintetizado para um kit de desenvolvimento Virtex\textregistered 6, modelo ML605,
    da fabricante Xilinx\textregistered. O uso da Virtex\textregistered 6, em detrimento de outros
    FPGA que temos disponíveis, se deu principalmente pela maior quantidade de células lógicas que
    ele possui.
    
    Na implementação de referência (VHDL) do escalonador\cite{marcondes-hybrid} havia
    pouca área disponível no FPGA, e por isso alguns cenários de implementação com maior nível de
    paralelismo não puderam ser avaliados. Desejamos agora poder avaliar tais cenários.
    
    \label{par:soc-validacao:fpga}
    Algumas especificações do kit ML605 seguem:
    \begin{description}
        \item[FPGA] Família Virtex\textregistered 6, modelo XC6VLX240T, encapsulamento FF1156
        \item[Memórias] DDR3 SODIMM RAM, 16MB Platform Flash (configuração), 32MB BPI Flash
        \item[Entrada/Saída] CompactFlash, USB JTAG, VGA, Gigabit Ethernet, PCI Express, UART via USB
    \end{description}

    A memória utilizada pelo processador \emph{softcore} que roda O EPOS é uma BRAM de 1MB,
    interna ao próprio FPGA. Tal escolha foi tomada em parte por comodidade, pois evita a necessidade
    de se utilizar um controlador DDR3 e definir no arquivo \emph{top-level} todos os pinos necessários
    à comunicação com a memória externa ao FPGA. Além disso, a aplicação a ser executada possui
    baixa utilização de memória, e caso seja necessária mais capacidade para futuras aplicações, a
    comunicação com a memória externa ao FPGA pode ser implementada de maneira relativamente simples.

    Como barramento de sistema, conectando todos os \emph{cores}, foi utilizado o AXI4Lite, parte da
    família de protocolos de barramento AMBA, da ARM\textregistered. Também a escolha do AXI4Lite se deu
    em boa parte pela sua simplicidade, e também pelo crescente uso de barramentos da família AMBA, tendo
    sido inclusive escolhido pela Xilinx\textregistered como barramento padrão para as futuras versões
    da sua cadeia de ferramentas.
    
    A arquitetura do barramento e as modificações necessárias para que o processador e os outros blocos
    do sistema se adaptassem à ele são descritas com mais detalhes na seção \ref{sec:axi4lite}.

    \section{Barramento AMBA AXI4Lite}
        \label{sec:axi4lite}

        O protocolo de barramento utilizado foi o AMBA AXI4\cite{axi4}, mais especificamente em sua
        variante simplificada, o AXI4Lite. O AXI4Lite é um subconjunto (totalmente interoperável) do protocolo
        AXI4 voltado para a comunicação com registradores de controle mapeados em memória. Comparado ao
        AXI4, o AXI4Lite tem as seguintes limitações:
        \begin{itemize}
            \item Todas as transferências tem tamanho de 1 palavra
            \item Todos os acessos a dados são de mesmo tamanho que a largura do barramento
            \item A largura do barramento pode ser somente 32 ou 64 bits
            \item Funcionalidades de \emph{cache} e acesso exclusivo não estão implementadas
        \end{itemize}

        O AXI4 (e por extensão, o AXI4Lite) é um protocolo bastante ortogonal, e os canais de
        transmissão para operações de leitura são separados dos de escrita, assim como para transmissão
        de endereço e de dados. A tabela \ref{tab:axi4lite} lista todos os sinais do protocolo, com o
        canal ao qual cada um pertence.

        \input{tabelas/axi4lite.tex}


    \section{O processador Plasma MIPS}
        \label{sec:plasma}
        Como processador \emph{softcore} para execução do sistema em nosso cenário de validação foi
        escolhido o Plasma MIPS\cite{plasma}, disponível no repositório de código aberto
        OpenCores\footnote{\url{http://www.opencores.org}}. O Plasma MIPS é um processador que oferece
        compatibilidade binária (a nível de ABI) com processadores da arquitetura MIPS I.

        Ele é implementado em VHDL, e é sintetizável tanto em FPGAs Xilinx\textregistered quanto
        Altera\textregistered. Ele possui um pipeline configurável de dois ou três estágios, e vem
        acompanhado de controladores SRAM, DDR, UART e Ethernet.
        
        Em nossa implementação, utilizamos apenas o núcleo principal do Plasma (mlite\_cpu),
        por entender que já possuíamos os outros controladores em nosso próprio repositório de
        IPs\footnote{``IP'', é um termo normalmente utilizado para se referir a blocos de hardware
        descritos em uma HDL, significando ``Semiconductor Intellectual Property Core''}, e que
        seria mais elegante e robusto integrar o núcleo aos controladores por meio de um barramento AMBA.
        O cenário de configuração do mlite\_cpu que utilizamos é o seguinte:
        \begin{description}
            \item[Clock] 50 MHz
            \item[Pipeline] Dois estágios de \emph{pipeline}. No primeiro ocorrem as operações de
                \emph{fetch} e \emph{decode}, já no segundo estágio as etapas de
                \emph{execute} e \emph{writeback}
            \item[ALU] ALU com multiplicadores dedicados (utilizando blocos DSP do FPGA quando possível)
        \end{description}

        A figura \ref{fig:mlite_cpu}, obtida em \cite{plasma}, é o diagrama de blocos do núcleo do Plasma,
        o \emph{mlite\_cpu}. No diagrama, pode-se notar a presença do controlador de memória, assim como
        do multiplicador dedicado. Também está presente um banco de registradores, com 32 registradores de
        32 bits cada, implementados nas BRAMs do FPGA.
        \begin{figure}
            \begin{center}
                \includegraphics[width=0.87\textwidth]{imagens/mlite_cpu.pdf}
            \end{center}
            \caption[Diagrama de blocos do \emph{mlite\_cpu}]{Diagrama de blocos do núcleo do IP Plasma, o
            mlite\_cpu\label{fig:mlite_cpu}}
        \end{figure}

        A escolha do Plasma como processador para integrar nosso cenário de validação foi motivada em
        grande parte pelo fato de já existir um porte razoavelmente estável do sistema operacional
        EPOS para a arquitetura MIPS. Também procuramos utilizar um IP de código aberto e, de fato,
        precisamos dessa liberdade para implementar as modificações já discutidas.

        Todos os componentes do EPOS têm sua implementação em software, armazenados em um bloco de memória
        com interface AXI4 e executando no mlite\_cpu, com a única exceção do escalonador, que é um
        \emph{slave} AXI4 por si próprio
        \bigskip
        \bigskip
        \bigskip

        \subsection{Adaptador mlite\_cpu -- AXI4Lite}
            \label{subsec:mlite_cpu-axi4lite}
            Para integrar o núcleo mlite\_cpu aos componentes AXI4 restantes foi necessário o desenvolvimento de
            um bloco adaptador, que fosse responsável pela tradução bidirecional entre o protocolo nativo do
            mlite\_cpu e o AMBA AXI4Lite. Envolvido por esse adaptador, o processador mlite\_cpu torna-se um 
            mestre no barramento AXI4. O diagrama \ref{fig:fsm-axi4lite-mlite_cpu} ilustra a máquina de
            estados finitos que realiza a tradução entre os protocolos.
            \begin{figure}[h]
                \begin{center}
                    \includegraphics[width=0.85\textwidth]{imagens/fsm-axi4lite-mlite_cpu.pdf}
                \end{center}
                \caption[Máquina de estados finitos da interface mlite\_cpu -- AXI4Lite]
                {Máquina de Estados Finitos (Máquina de Moore) responsável pela tradução entre os
                protocolos nativo mlite\_cpu e AXI4Lite \label{fig:fsm-axi4lite-mlite_cpu}}
            \end{figure}

            Como pode se observar no diagrama da máquina de estados finitos, os sinais de dados e endereço em
            geral foram ligados diretamente (paralelamente) aos sinais correspondentes na interface AXI4Lite.
            Fazem parte das saídas da máquina de Moore apenas os sinais de \emph{handshaking}.

            A verificação funcional do adaptador foi realizada através de simulação em nível RTL, no simulador
            ModelSim\textregistered. Um simples programa de teste gerava um número de escritas na memória e em
            seguida tentava ler dos mesmos endereços onde escreveu. Este programa foi carregado num bloco de
            memória e um \emph{testbench} em VHDL foi escrito para: instanciar processador e memória;
            conectá-los por meio do barramento e verificar se as escritas e leituras ocorriam corretamente.
            
            O código C do programa de teste, assim como o \emph{testbench} VHDL e o diagrama de forma de onda
            correspondentes à verificação do adaptador estão no apêndice \ref{ap:axi4lite-mlite_cpu}.
