Eduardo Tirta, Filipe Borba, Gabriel Moreira, Guilherme Graicer
6º Semestre
Engenharia da Computação Insper
Design de Computadores
"O MIPS é uma arquitetura baseada em registrador, ou seja, a CPU usa apenas registradores para realizar as suas operações aritméticas e lógicas. Existem outros tipos de processadores, tais como processadores baseados em pilha e processadores baseados em acumuladores. Processadores baseados no conjunto de instruções do MIPS estão em produção desde 1988. Ao longo do tempo foram feitas várias melhorias do conjunto de instruções. As diferentes revisões que foram introduzidas são MIPS I, MIPS II, MIPS III, MIPS IV e MIPS V. Cada revisão é um super conjunto de seus antecessores. Diversos cursos de arquitetura de computadores em universidades e escolas técnicas frequentemente estudam a arquitetura MIPS. A arquitetura influenciou fortemente projetos posteriores de arquitetura como os processadores da linha Alpha, lançado pela Digital Equipment Corporation (DEC)." [1]
O MIPS possui 32 registradores de 32-bits para propósitos gerais. O registrador $0 fica sempre em zero e escritas nele são descartadas. O registrador $31 sempre armazena o endereço de retorno para o qual a última função chamada deve retornar. Para multiplicação e divisão de inteiros, temos um par de registradores HI e LO. Existem instruções para copiar dados entre os registradores gerais e os HI/LO. O Program Counter também possui 32 bits e seus 2 bits menos significativos sempre estão em zero, uma vez que as instruções do MIPS I são de 32 bits e devem ficar alinhadas ao acesso à memória.
O MIPS possui 3 formatos básicos de instruções:
- Tipo R (registro);
- Tipo I (imediato);
- Tipo J (salto). Além disso, a codificação dessas instruções utiliza uma palavra de 32 bits que foi dividida em campos bem definidos.
Figura 1 - Divisão da instrução do MIPS
Esses campos podem ser agrupados dependendo do tipo de instrução. O significado dos nomes dos campos são:
- Opcode: Contém o código da instrução a ser executada;
- Rs: O número do registrador com o primeiro operando da instrução definida em op;
- Rt: O número do registrador com o segundo operando da instrução definida em op;
- Rd: O número do registrador de destino do resultado da instrução definida em op;
- shamt: Total de deslocamento (shift amount).
- funct: Seleciona uma variação específica da operação definida em opcode.
As execução das instruções é dividida em 5 partes menores ou ciclos:
- Busca da instrução (instruction fetch: IF): Carrega da posição de memória apontada pelo PC, a instrução a ser executada.
- Decodificação (instruction decode: ID): Lê os dados a serem utilizados; Calcula o endereço da próxima instrução (incrementa o PC).
- Execução (EX): A ALU faz a operação indicada na instrução.
- Acesso à memória (memory access: MA): Escreve ou lê dados na memória. Só funciona nas instruções lw e sw.
- Escreve o resultado nos registradores (write back: WB): Ocorre na maioria das instruções.
A figura 2 a seguir foi a arquitetura implementada numa primeira iteração do projeto, o MIPS Single Cycle. Numa segunda iteração, foi implementado o MIPS com pipeline como demonstra a figura 3, porém, a instrução de Jump foi implementada utilizando o Single Cycle como referência.
Figura 2 - MIPS Single Cycle com Fluxo de Dados Completo (Tipo R, LW, SW, BEQ, J).
Figura 3 - MIPS com Pipeline com Fluxo de Dados faltando a instrução J (Tipo R, LW, SW, BEQ).
A principal diferença entre o MIPS Single Cycle e o Pipeline é o tempo de execução das instruções. O primeiro fica limitado ao tempo que a instrução mais demorada leva para ser executada, enquanto que no pipeline, a execução das instruções é sobreposta no tempo. Com isso, o tempo total de execução (latência) de cada instrução não se altera. Mas, depois que o pipeline estiver cheio com instruções, a taxa com que as instruções são iniciadas e terminadas (vazão ou throughput) é muito maior e, idealmente, teríamos um aumento na vazão equivalente ao número de etapas do pipeline.
Este projeto será a implementação de um processador RISC de 32 bits. Ele deverá executar um subconjunto das instruções do MIPS DLX. São elas:
- Carrega palavra (load word: lw);
- Armazena palavra (store word: sw);
- Soma (add);
- Subtração (sub);
- E lógico (AND);
- OU lógico (OR);
- Comparação menor que (set if less than: slt);
- Desvio se igual (branch equal: beq);
- Salto incondicional (jump: j).
O Fluxo de Dados do projeto é responsável por todas as operações aritméticas e execução das instruções.
Os pipelines foram implementados utilizando registradores genéricos. Eles possuem o seguinte tamanho, em ordem: 64 bits, 147 bits, 107 bits e 71 bits. Os dados, portanto, formam uma entrada grande concatenada, sendo necessário retirar apenas os bits necessários utilizando a ideia de (x downto y) do Quartus. Com isso, foi possível implementar o pipeline. No código, cada entrada de pipeline tem os comentários que indicam o que significa cada sinal.
Figura 4 - RTL Viewer do Fluxo de Dados do projeto do MIPS Pipeline.
A unidade de controle receberá o Opcode da instrução e retornará a palavra de controle do MIPS, controlando os enables e seletores. As saídas da UC são as seguintes:
- Seletor Mux para dado da RAM ou resultado da ULA.
- Enable do Banco de Registradores
- Sinal de BEQ
- Enable de Escrita na RAM
- Enable de Leitura na RAM
- Seletor Mux instrução Rt ou Rd
- Código operação da ULA Principal, ligado à Unidade de Controle da ULA
- Seletor Mux Reg2 ou Imediato para ULA Principal
Figura 5 - RTL Viewer da Unidade de Controle do projeto do MIPS Pipeline.
O Top-Level é responsável por juntar tanto o fluxo de dados quanto a unidade de controle, porém com o adicional de controlar os botões da placa e os displays de 7 segmentos. Além disso, é nele que são estabelecidos os sinais para a simulação no Waveform. É necessário criar novas entradas no fluxo de dados e passá-las para o Top-Level a fim de verificar as saídas na simulação.
Figura 6 - RTL Viewer do Top-Level do projeto do MIPS Pipeline.
A principal dificuldade do projeto foi a parte de debugging. A implementação não era difícil, porém, são muitos detalhes que passam despercebidos. Além disso, realizar a simulação do Quartus requer passar os sinais para o Top-Level, que era bem trabalhoso de se fazer.
[1] - https://pt.wikipedia.org/wiki/Arquitetura_MIPS
[2] - Slides de Aula no Blackboard