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:
- Selecione um sinal na lista "Signals" com um click do apontador;
por exemplo, selecione o pc[31:0] ;
- no menu principal do GTKWAVE, em Search, selecione "Pattern Search 1";
- 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);
- 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;
- quando a "string" (o endereço de main()) é encontrado, o cursor
fica no centro da tela do diagrama, indicando a ocorrência da "string".
- 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--