- Tarcídio Antônio Júnior - 10748347 (tarcidio.antonio2@gmail.com)
- Jade Bortot de Paiva - 11372883 (jade_bortot_paiva@usp.br)
- Gabriel Barbosa de Oliveira - 12543415
- Luís Filipe Vasconcelos Peres - 10310641
A disciplina de Organização e Arquitetura de Computadores é crucial para profissionais de tecnologia da informação. Ela oferece uma compreensão sólida do funcionamento interno dos computadores e seus componentes, sendo fundamental para o desenvolvimento de softwares e hardwares eficientes. Além disso, o estudo dessa disciplina ajuda a solucionar problemas em sistemas computacionais, identificando falhas de desempenho e segurança e encontrando soluções apropriadas.
O objetivo deste trabalho é implementar e simular um processador x32 RISC-V em pipeline usando o Logisim. A técnica de pipeline é empregada para otimizar o desempenho do processador, dividindo as instruções em estágios e executando-os simultaneamente. Compreender o funcionamento do pipeline e seus componentes básicos é fundamental para compreender a arquitetura de um computador.
Além da implementação, serão realizados testes utilizando instruções básicas para verificar a funcionalidade do processador simulado. O trabalho também busca ser um recurso educativo, fornecendo material para os futuros alunos da disciplina de Organização e Arquitetura de Computadores.
Foi utilizado o simulador Logisim-ITA, uma ferramenta gratuita de simulação de circuitos digitais. Ele possui uma interface gráfica intuitiva que permite a criação e teste de circuitos combinacionais e sequenciais. O Logisim-ITA é popular entre estudantes, educadores e entusiastas da eletrônica digital devido à sua facilidade de uso. Possui uma ampla biblioteca de componentes lógicos, como portas, flip-flops e registradores, que podem ser arrastados e soltos na interface. Além disso, o Logisim-ITA oferece recursos de simulação e modularização, permitindo a criação de subcircuitos reutilizáveis para facilitar a construção de circuitos mais complexos. Para usar o Logsim, siga as instruções abaixo:
- Acesse o site https://logisim.altervista.org/
- Role até o fim da página
- Clique em "DOWNLOAD"
- Em segundos, o arquivo .exe do Logsim será baixado
- Vá até a pasta de "Downloads" e abra o arquivo baixado
Também foi usado como base o livro "GUIA PRÁTICO RISC-V: ATLAS DE UMA ARQUITETURA ABERTA": livro abrangente que explora a arquitetura RISC-V de forma prática. Ele apresenta os conceitos fundamentais e a implementação dessa arquitetura de processador aberta. Exploramos principalmente a página 17 e 18, onde consta as instruções.
Para facilitar a discussão de todo o trabalho, fizemos vídeos que descrevem melhor os componentes e a implementação. Segue:
- Vídeo 01: Introdução ao Logisim
- Vídeo 02: Subcircuitos usados
- Vídeo 03: Explicação da implementação
- Vídeo 04: Desafios
Neste trabalho, implementamos os seguintes subcircuitos:
- banco_de_registradores.circ: circuito que representa o conjunto de registradores do processador;
- conversor_32_23.circ: como a memória RAM do Logisim é endereçada com, no máximo, 24 bits, não podemos utilizar os 32 bits da arquitetura. Para converter, modularizamos um pequeno circuito que captura os 24 bits menos significativos;
- detector_tipo_instrucao.circ: subcircuito usado na unidade de controle para identificar o tipo da instrução;
- immediate_generator.circ: circuito que determina o valor imediado da instrução;
- unidade_controle.circ.circ: figura central do processador, é quem maestra os sinais de controle;
- unidade_controle_ula.circ: determina qual operação deve ser feita na ULA;
- unidade_logica_aritmetica.circ: componente que faz os cálculos necessários para a instrução;
- monociclo.circ: primeiro componente principal. Para construir a pipeline, fizemos a monociclo primeiro;
- pipeline.circ: componente principal o qual é o objetivo do trabalho.
Implementamos as seguintes instruções:
- Tipo R: add
- Tipo I: lw
- Tipo S: sw
- Tipo B: beq
- Tipo J: jal
O código que está no "MEMORIA_INSTRUCOES" é:
0x00: lw t0, 4(zero)
0x04: lw t1, 8(zero)
0x08: add zero, zero, zero
0x12: add zero, zero, zero
0x16: add t2, t1, t0
0x20: add zero, zero, zero
0x24: add zero, zero, zero
0x28: sw t2, 16(sp)
0x32: beq t3, zero, 40
0x68: j ra, -0x68 (111111111111110011000)
Veja melhor no arquivo "instrucoes.txt".
Dentre os desafios enfrentados, podemos citar:
- Fazer subcircuitos que não sabiamos como funcionava de fato. O principal exemplo foi o banco de registradores;
- Manipular os fios de forma que todo o circuito fosse o mais didático possível;
- Sincronizar o clock para que resolvesse o problema da dependência estrutural
- Implementar outras instruçoes da arquitetura;
- Implementar técnicas que resolvam melhor o problema de dependência de dados;
- Implementar cache
Se encontrar erros neste projeto, por favor, faça um pull ou nos chame para conversar! Adoraríamos melhorar este trabalho para os próximos alunos. Se implementar uma melhoria (instruções, forwarding, cache, dentre outras), avise-nos! Anexaremos o link do seu trabalho neste git hub.
Vamos melhorar o aprendizado desta disciplina ;)
Instituto de Ciências Matemáticas e de Computação (ICMC) - Universidade de São Paulo (USP)