MC723: Tutorial ArchC no IC-3

Veja um Tutorial de Instalação de SystemC e ArchC.

Nesta atividade, assim como em várias outras da disciplina, utilizaremos um simulador do processador MIPS, feito na linguagem ArchC. Durante o semestre você irá aprender mais sobre esta linguagem e a capacidade de implementar simuladores distintos. Mas neste primeiro momento, o importante é entender as noções básicas do simulador, como invocá-lo, como compilar programas e como gerar um resultado correto de execução.

ArchC é uma linguagem para descrição de arquiteturas de processadores. A finalidade principal é facilitar o trabalho do projetista de processadores e também de sistemas, acelerando o desenvolvimento de simuladores e demais ferramentas necessárias para a avaliação de uma ideia, antes de passar para a fase de prototipação em hardware.

Todos os arquivos que você vai precisar utilizar neste exercício estão disponíveis no meu homedir do IC3, em /home/staff/rodolfo/mc723. Na pasta download existem versões prontas para descompactar e instalar.

Para o primeiro semestre de 2014, as configurações necessárias para usar ArchC, SystemC e o compilador no IC-3 devem ser escritas no seu arquivo .bashrc (no raiz do seu homedir, ex: /home/ec2008/raXXXXXX/.bashrc). Inclua as duas linhas abaixo no final do arquivo:

export LD_LIBRARY_PATH=/home/staff/rodolfo/mc723/systemc/lib-linux64:$LD_LIBRARY_PATH
export PATH=/home/staff/rodolfo/mc723/archc/bin:/home/staff/rodolfo/compilers/bin:$PATH

Compilando o Simulador e Executando um Programa Vamos utilizar o modelo do processador MIPS, que é uma versão ampliada do processador estudado na disciplina MC722, com instruções extras. O modelo está disponível na pasta download (mips-v0.7.8.tgz). Descompacte este arquivo e leia o README que o acompanha. Nele há instruções específicas sobre a compilação do simulador do processador. Para isto, você vai precisar do gerador de simuladores acsim, que já está instalado em /home/staff/rodolfo/mc723/archc/bin/acsim (adicione ao PATH para facilitar os usos futuros). Três comandos são necessários:

acsim mips.ac -abi
make -f Makefile.archc
mips.x --load=programa [args]

O primeiro comando cria os arquivos do simulador, baseados na descrição contida em mips.ac (arquivo principal de descrição do processador em ArchC). O segundo comando compila o simulador, gerando um executável chamado mips.x. O terceiro comando é a utilização do simulador para executar um programa compilado para MIPS. Como não temos nenhum programa para MIPS, crie um arquivo chamado hello.c com o clássico "Hello World" e vamos compilá-lo.

Para compilar um programa, você precisa de um cross-compiler (compilador que executa numa arquitetura e compila o programa para executar em outra). Ele já está instalado no meu homedir.

mips-elf-gcc -specs=archc hello.c -o hello.mips

De forma similar ao gcc que você está acostumado a utilizar, esta é uma versão do gcc compilada para gerar binários para a arquitetura MIPS. Todas as demais ferramentas de desenvolvimento também existem numa versão com o prefixo mips-elf. Denomina-se cross-compiler um compilador que roda numa plataforma (x86 no caso) e gera programas para executar em outra (MIPS no nosso exemplo). O parâmetro -specs=archc informa algumas regras específicas do ArchC, que devem ser seguidas pelo compilador. Os últimos parâmetros indicam o arquivo a ser gerado e estamos gerando o programa com o sufixo da arquitetura para facilitar o entendimento. De posse do novo executável, agora basta invocar o simulador e ver seu programa sendo executado.

mips.x --load=hello.mips

Uma outra ferramenta que pode ser útil é o objdump (na forma mips-elf-objdump para MIPS). Ele é capaz de mostrar várias informações sobre o programa (consulte o manual para ver as opções). Um exemplo de uso para listar o código assembly é:

mips-elf-objdump -d hello.mips

Reconheceu alguma instrução? Conseguiu entender um pouco do código?

As instruções implementadas pelo simulador estão descritas em dois arquivos: mips_isa.ac e mips_isa.cpp. O primeiro descreve quais instruções o processador terá e a codificação delas. O segundo arquivo contém uma implementação do comportamento da instrução (um trecho de código em C++ que descreve a funcionalidade da instrução). Abra o segundo arquivo e procure por ac_behavior( add ), este trecho de código parece intuitivo?