MC723: Tutorial ARP no IC-3

Usando uma plataforma virtual

Uma plataforma virtual é um software capaz de simular um hardware com um bom nível de detalhes. Geralmente não é necessário modificar programas que rodam nesta plataforma virtual para executá-los numa plataforma real (hardware). Alguns componentes existentes em plataformas reais não aparecem nas versões virtuais para não afetar o desempenho. Outros componentes aparecem com versões bastante simplificadas. Entranto, dificilmente o software que está executando nesta plataforam virtual deve ser capaz de notar esta diferença. Como exemplos destes componentes que podem aparecer de forma diferente temos: caches (que pode não existir), periféricos (que podem apenas emular o que deveriam fazer), etc.

Vocês usarão, neste tutorial, o pacote ARP (ArchC Reference Plataform) para gerenciar plataformas. A ARP nada mais é que um conjunto de Makefiles e uma estrutura de diretórios para facilitar o desenvolvimento de projetos maiores. Cada diretório tem um conteúdo específico:

Pegue a plataforma de exemplo (/home/staff/rodolfo/mc723/downloads/arp-rodolfo.tgz), descompacte-a e navegue pelos diretórios observando o conteúdo de cada um deles. Embora exista uma versão da ARP descompactada no meu homedir, vocês devem começar com a versão vazia indicada acima. Para executar a plataforma, basta utilizar os comandos:

make
make run

O primeiro comando compila a plataforma e o segundo executa. Se for necessário compilar o programa, você deve utilizar o compilador instalado em /home/staff/rodolfo/compilers/bin, como no projeto anterior. Para facilitade, inclua o caminho anterior no PATH antes de executar os dois comandos acima.

Este simulador é mais lento que o anterior por conter mais componentes que você estava acostumado.

Você consegue executar outro programa? Você precisa criar um diretório na pasta sw e configurar também o arquivo defs.arp da pasta da plataforma.

Utilizando como base a plataforma acima, você deve incluir um barramento entre o processador e a memória. O código deste barramento deve ser colocado na pasta is da plataforma. Utilize um dos programas que já executou.

Veja um pouco mais de detalhes a seguir, sobre a plataforma, antes das recomendações para seu código.

Sua primeira plataforma possuia apenas dois módulos: um processador e uma memória. Agora é hora de incluir um terceiro módulo, o barramento, que fará o papel de interconexão do sistema. Será algo bem simplificado no momento.

A comunicação entre o processador e a memória se faz através do padrão TLM que, basicamente, realiza a ligação entre os componentes do sistema. Só que o padrão TLM é ponto a ponto, exigindo uma porta de cada lado para cada canal de comunicação. Além disto, o TLM inclui o conceito de mestre e escravo, onde o mestre sempre faz as solicitações e o escravo apenas as atende. No caso original, o processador é o mestre e a memória é escravo. O grande problema desta configuração inicial é a dificuldade em incluir um novo periférico, pois será necessário modificar o processador para que ele se comunique com dois dispositivos diferentes. Assim, a solução é inluir um periférico no meio do caminho que apenas fará o papel de roteamento, este é o barramento que você vai fazer.

Do ponto de vista do TLM, as conexões são feitas sempre entre portas, o processador tem uma porta Mestre e a memória tem uma porta Escravo. No programa principal (main.cpp da plataforma), você vê a ligação entre o processador e a memória através da linha:

mips1_proc1.DM_port(mem.target_export);

esta linha liga a porta DM_port do processador à porta target_export da memória. Olhando um pouco antes neste código, você pode ver a declaração do processador mips1_proc1 e da memória mem. Sua tarefa é criar um novo componente, chamado roteador, que será conectado a mips1_proc1 e também à mem. Para isto, ele precisará ser Escravo na sua conexão com o processador e Mestre na sua conexão com a memória. Além disto, todas as solicitações do processador devem ser transferidas para a memória neste momento.

A forma mais simples de implementar este barramento é começar pelo código da memória, removendo a parte relacionada ao armazenamento de dados e incluindo a parte da conexão Mestre que você poderá seguir o exemplo do código do processador (procure pela declaração da classe mips1). você trabalhará sempre ao redor e na implementação do método transport.

É esperado, nesta atividade, que você localize e monte o código correto do seu roteador. Todos os exemplos de código fonte já estão dados.

Nos próximos passos, você deve ser capaz de iniciar todos os processadores do seu sistema. Uma forma simples para começar a execução é determinar quais características os processadores precisam ter iniciadas separadamente. Note que você pode configurar cada processador e criar mais processadores no arquivo principal da plataforma.