CI212, 2016-1                               © Roberto André Hexsel, 2016



Três avisos sobre o simulador:

(i) não sei como fazer para terminar a simulação sem que os asserts
emitam as mensagens de erro.  De qualquer forma, o texto em maiúsculas
indica o término normal de uma simulação, ou alguma condição de erro
detectada pelo simulador;

(ii) o código de inicialização do processador é executado a partir do
endereço zero, seguido pelo código de tratamento de excessões (excp_0000,
excp_0100 e excp_0180), interrupções (excp_0200) e "hard reset"
(excp_bfc0).  O "código normal" inicia no endereço 0x0500 para que seja
fácil identificar quando o processador executa "programas" ou "tratadores".
O compilador preenche a ROM com zeros, que são desmontados para NOPs;

(iii) a instrução WAIT é usada para terminar a simulação e seu argumento
indica o motivo.  Na função _exit() o wait 0 indica
terminação normal; em excp_handler, os códigos de terminação são
aqueles para as respectivas excessões.



Antes de mais nada, crie um prompt vazio, copiando a linha abaixo no seu terminal alias prompt:="" Três clicks no botão esquerdo para copiar, um click no meio para colar.
Sobre os diretórios de simulação O simulador deve ser executado no diretório ~/cmips/cMIPS Os testes devem ser executados no diretório ~/cmips/cMIPS/tests Os programas de teste devem ser compilados no diretório ~/cmips/cMIPS/tests e os "executáveis" prog.bin e data.bin devem ser movidos para ~/cmips/cMIPS Sobre a variável de ambiente PATH A variável PATH deve ser aumentada com o caminho dos scripts necessários para as simulações. Se, por acaso ou acidente, você fechar a Shell em que executava as simulações, o caminho para os scripts deve novamente ser acrescentado à PATH. Atualize sua cópia do repositório: prompt: cd ~/cmips ; git pull Se você apagou sua cópia do repositório, faça uma cópia do repositório para o diretório $HOME/cmips. prompt: cd ; git clone https://github.com/rhexsel/cmips.git Este comando criará uma cópia do repositório em seu ${HOME}. Toda a vez em que uma nova versão for copiada do github, aqueles arquivos do repositório que foram atualizados (ou corrigidos) no repositório serão copiados novamente. ACHTUNG: Se você alterar arquivo(s) em sua cópia local, suas atualizações poderão ser sobrescritas pela versão do repositório. Acrescente ao seu caminho o diretório dos executáveis: prompt: export PATH=$PATH:~/cmips/cMIPS/bin:. Talvez seja uma boa ideia acrescentar a linha acima ao seu ~/.bashrc. Reconstrua o simulador com a versão atualizada: prompt: cd ~/cmips/cMIPS ; build.sh Teste sua instalação, e retorne para ~/cmips/cMIPS prompt: cd tests ; doTests.sh && cd - Isso feito, leia o material. As dicas abaixo podem ser úteis. Para acompanhar a simulação do código, use os endereços obtidos com nm mais a tradução do executável, obtida com a compilação verbosa (compile.sh -v). As instruções executadas antes de main() estão em include/start.s e inicializam o apontador de pilha e outros recursos do processador. Os tratadores de excessão estão em include/handlers.s. O programa de testes, que contém a função main(), está em tests/pt_walk.c. As definições de constantes e endereços de memória estão em include/cMIPS.{s,h}. O programa nm (names) mostra os nomes e valores dos símbolos: prompt: nm pt_walk.elf mostra a tabela de símbolos definidos em pt_walk.elf. Símbolos com 'T' pertencem à seção .text (funções), símbolos com 'D' pertencem à seção .data, com 'B' à seção .bss (dados não inicializados), e símbolos com 'a' são apelidos (aliases). Anote os endereços para _excp_0000 _excp_0180 _excp_0180ret _start PT_update _PT handle_Mod handle_TLBL main Vocês podem usar grep.

Da busca de sinais no GTKWAVE

É possível procurar por valores nos diagramas de tempo do GTKWAVE:
  1. Selecione um sinal na lista "Signals" com um click do apontador; por exemplo, selecione o pc[31:0] ;
  2. no menu principal do GTKWAVE, em Search, selecione "Pattern Search 1";
  3. na janelinha que se abre, deixe "Logical Operation" em AND, mude o "Don't Care" para "String", e no quadro escreva o endereço da instrução procurada, que neste exemplo, é a primeira instrução de main(). Não altere as outras duas opções (Marking Begins/Stops);
  4. use os botões "Fwd" (forward) e "Bkwd" (backward) para percorrer o diagrama de tempos, buscando pela "string" para a frente no tempo, ou para trás;
  5. quando a "string" (o endereço de main()) é encontrado, o cursor fica no centro da tela do diagrama, indicando a ocorrência da "string".
  6. São dois os buscadores de padrão, e ambos podem ser usados, um para cada sinal; use o segundo buscador para procurar pelo endereço de handle_TLBL.

Documentação

O arquivo docs/cMIPS.pdf contém toda a documentação do cMIPS. Para além disso, veja o código fonte. --fim da aula--