|
1 | | -# RISC-V-python |
| 1 | +# Simulador de Processador RISC-V (RV32I) |
2 | 2 | Simulador do funcionamento de um processador RISC V em python |
| 3 | +## Autores |
| 4 | +* Raul Santos da Silva - RA: 8883414 |
| 5 | + |
| 6 | +Projeto final da disciplina de Organização de Computadores - Universidade Católica de Santos (UniSantos). |
| 7 | + |
| 8 | +## Sobre o Projeto |
| 9 | +Este codigo contem a implementação de um simulador de um processador RISC-V 32bits I, versão do processador de 32 bits focada em instruções de numeros inteiros, **python**. |
| 10 | + |
| 11 | +## Tecnologias Utilizadas |
| 12 | +* Linguagem: Python |
| 13 | + |
| 14 | +## Como Executar |
| 15 | +Basta iniciar o arquivo **main.py** para rodar com o codigo default |
| 16 | + |
| 17 | +### Pré-requisitos |
| 18 | +Como o projeto não utiliza bibliotecas externas, basta ter o compilador/interpretador da linguagem instalada. |
| 19 | + |
| 20 | +O ciclo de funcionamento do simulador imita um processador RISC-V real: |
| 21 | +1. O ciclo inicia com a extração da informação da memória (Instruction Fetch). |
| 22 | +2. O ciclo de busca padrão é executado de forma contínua (sem interrupções no fluxo básico). |
| 23 | +3. Segue-se para a decodificação e execução conforme a especificação da arquitetura. |
| 24 | + |
| 25 | +Ciclo_de_busca.png |
| 26 | + |
| 27 | +## Funcionalidades Implementadas |
| 28 | + |
| 29 | +### 1. CPU (RV32I) |
| 30 | +Abaixo, a lista completa das instruções implementadas no decodificador, organizadas por categoria e formato de instrução. |
| 31 | + |
| 32 | +### Tabela de Instruções Suportadas (Detalhada) |
| 33 | + |
| 34 | +| Opcode (Hex) | Funct3 | Funct7 | Instrução | Tipo | Descrição | |
| 35 | +| :---: | :---: | :---: | :--- | :---: | :--- | |
| 36 | +| **`0x03`** | `000` | - | `LB` | I | Load Byte | |
| 37 | +| | `001` | - | `LH` | I | Load Half | |
| 38 | +| | `010` | - | `LW` | I | Load Word | |
| 39 | +| | `100` | - | `LBU` | I | Load Byte Unsigned | |
| 40 | +| | `101` | - | `LHU` | I | Load Half Unsigned | |
| 41 | +| **`0x13`** | `000` | - | `ADDI` | I | Add Immediate | |
| 42 | +| | `001` | `0000000` | `SLLI` | I | Shift Left Logical Imm | |
| 43 | +| | `010` | - | `SLTI` | I | Set Less Than Imm | |
| 44 | +| | `011` | - | `SLTIU` | I | Set Less Than Imm Unsigned | |
| 45 | +| | `100` | - | `XORI` | I | XOR Immediate | |
| 46 | +| | `101` | `0000000` | `SRLI` | I | Shift Right Logical Imm | |
| 47 | +| | `101` | `0100000` | `SRAI` | I | Shift Right Arith Imm | |
| 48 | +| | `110` | - | `ORI` | I | OR Immediate | |
| 49 | +| | `111` | - | `ANDI` | I | AND Immediate | |
| 50 | +| **`0x17`** | - | - | `AUIPC` | U | Add Upper Imm to PC | |
| 51 | +| **`0x23`** | `000` | - | `SB` | S | Store Byte | |
| 52 | +| | `001` | - | `SH` | S | Store Half | |
| 53 | +| | `010` | - | `SW` | S | Store Word | |
| 54 | +| **`0x33`** | `000` | `0000000` | `ADD` | R | Add | |
| 55 | +| | `000` | `0100000` | `SUB` | R | Subtract | |
| 56 | +| | `001` | `0000000` | `SLL` | R | Shift Left Logical | |
| 57 | +| | `010` | `0000000` | `SLT` | R | Set Less Than | |
| 58 | +| | `011` | `0000000` | `SLTU` | R | Set Less Than Unsigned | |
| 59 | +| | `100` | `0000000` | `XOR` | R | XOR | |
| 60 | +| | `101` | `0000000` | `SRL` | R | Shift Right Logical | |
| 61 | +| | `101` | `0100000` | `SRA` | R | Shift Right Arithmetic | |
| 62 | +| | `110` | `0000000` | `OR` | R | OR | |
| 63 | +| | `111` | `0000000` | `AND` | R | AND | |
| 64 | +| **`0x37`** | - | - | `LUI` | U | Load Upper Immediate | |
| 65 | +| **`0x63`** | `000` | - | `BEQ` | B | Branch == | |
| 66 | +| | `001` | - | `BNE` | B | Branch != | |
| 67 | +| | `100` | - | `BLT` | B | Branch < | |
| 68 | +| | `101` | - | `BGE` | B | Branch >= | |
| 69 | +| | `110` | - | `BLTU` | B | Branch < Unsigned | |
| 70 | +| | `111` | - | `BGEU` | B | Branch >= Unsigned | |
| 71 | +| **`0x67`** | `000` | - | `JALR` | I | Jump & Link Register | |
| 72 | +| **`0x6F`** | - | - | `JAL` | J | Jump & Link | |
| 73 | + |
| 74 | +### 2. Barramento |
| 75 | +Dentro do codigo implementado um barramento que simula o funcionamento dos três tipos de barramentos: |
| 76 | +* Dados |
| 77 | +* Endereço |
| 78 | +* Controle |
| 79 | + |
| 80 | +### 3. Sistema de Memória |
| 81 | +A memória foi implementada como uma matriz de endereçamento, respeitando o seguinte mapeamento exigido no projeto: |
| 82 | + |
| 83 | +| Faixa de Endereço (Hex) | Descrição | |
| 84 | +|:-----------------------:|:----------| |
| 85 | +| 0x00000 - 0x7FFFF | RAM Principal (Programa, Dados, Pilha, Heap) | |
| 86 | +| 0x80000 - 0x8FFFF | VRAM (Vídeo RAM) | |
| 87 | +| 0x90000 - 0x9FBFF | Área Reservada para Expansões Futuras | |
| 88 | +| 0x9FC00 - 0x9FFFF | Periféricos (E/S Mapeada) | |
| 89 | + |
| 90 | +Nota: A implementação no codigo não possui componentes que usam a Área Reservada e Periféricos (E/S Mapeada) estão apenas com seus endereços reservados porem sem utilização |
| 91 | + |
| 92 | +### 4. Entrada e Saída (VRAM) |
| 93 | +O simulador lê periodicamente a região da VRAM (0x80000) e exibe os caracteres ASCII correspondentes no terminal. |
| 94 | + |
| 95 | +## 5. Programa de teste |
| 96 | +O codigo conta com um programa de teste dentro do **main.py** |
| 97 | +Esse codigo se traduz para um codigo em **python**: |
| 98 | + |
| 99 | + |
| 100 | + |
| 101 | + |
0 commit comments