Objetivo: Desenvolver um simulador RISC-V em Python capaz de converter um arquivo .asm com instruções em assembly para sua representação binária e, posteriormente, simular a execução dessas instruções em uma máquina com arquitetura simplificada (HRISC-V).
Equipes : Se dividam em grupos de até 4 participantes.
- Preencher a planilha com os integrantes da equipe na planilha
- Descrição da Atividade
- Critérios de Avaliação
Por se tratar de um versão simplificada o RISC-V o nosso simulador tera que suportar as sequintes instruções:
add, addi, and, andi, beq, bne, jal, ld, nop, or, sd, sub
Por se tratar de um conjunto simplificado de instruções. Considere as syntaxe simplificadas das instrções ld e sd.
sala de aula simulador addi x1, x0, 1024
ld x2, 0(x1)
sd x11, 0(x1)addi x1, x0, 1024
ld x2, x1
sd x11, x1Repare que no nosso simulador em python não utilizaremo
0(x1).
- O nosso simulador fara referência direta ao registrado
x1
O simulador será composto por duas partes:
- Conversor: converte a linguagem de montagem em máquina
- Simulador: executa as instruções em linguagem de máquina
- Exemplo de entrada: Exemplo para teste
Ambos descritos abaixo.
Descrição:
Os alunos deverão implementar um programa em Python que receba como entrada um arquivo .asm contendo instruções em assembly do conjunto de instruções RISC-V. O programa deve:
- Ler o arquivo
.asm: As instruções estarão no formato assembly, e os comentários começarão com#.- Converter as instruções: Para cada linha de código assembly, o programa deve gerar a correspondente instrução em formato binário (32 bits) de acordo com o manual RISC-V,
- Site Oficial do RISC
- Livro Digital Design and Computer Architecture - Harris&Harris.
- Gerar um arquivo
.txt: O programa deve escrever as instruções convertidas em um arquivo.txt.
Exemplo de Execução:
python compilador.py input-g1.asmSaída Esperada:
- Um arquivo
.txtcom as representações das instruções binárias- por exemplo, a primeira instrução foi convertida para o valor binário
0b00000001100100010000000110110011 - Em cada linha da saída deve ter uma string de 32 caracteres, composta de
0e1, representando o binário de cada instrução, na ordem de leitura.00000001100100010000000110110011
- por exemplo, a primeira instrução foi convertida para o valor binário
- O arquivo de saida deve ter o mesmo nome da entrada por exemplo de execução acima a
.txtde saíde deve ter o nomeinput-g1.txt.- Esse nome será gerado aleatorio durante a avaliação.
DICA:
Cuidado com os rótulos. Eles serão utilizados para identificar a posição dos saltos.
Para facilitar o processamento, é recomendável realizar a leitura do arquivo .asm em dois momentos. Primeiro, identifique a posição dos rótulos (linhas) para que, no processamento das instruções, a posição correta possa ser repassada ao contador de programa (PC). O fluxo a seguir ilustra um possível procedimento de processamento.
Descrição:
Na segunda etapa, os alunos deverão construir um simulador que executará as instruções geradas na etapa anterior (.txt) em uma arquitetura simplificada chamada HRISC-V.
Especificações do HRISC-V:
A arquitetura que será implementada deve considerar a arquitetura descrita na imagem a abaixo:
- Memória de Instruções: Armazena as instruções binárias geradas na primeira etapa. Capacidade de 128 endereços.
- inst_mem[128] = 0
- Memória de Dados: Armazena variáveis que serão carregadas e lidas durante a execução. Capacidade de 16 endereços.
- todos iniciam zerado
- data_mem[128] = 0
- Registradores: O simulador terá 8 registradores (r0 a r7), mais o PC (Program Counter).
- O
PCsempre busca a a instrução no endereço 0 - O registrador
r0sempre terá o valor 0. -
class hsrisc(): def __init__(): self.pc = 0 self.r0 = 0 self.r1 = 0 ... self.r7 = 0
- O
- Decodificação e Execução: O simulador deve ser capaz de decodificar cada instrução binária e realizar as operações correspondentes.
- Ao final o simulador deve imprimir a saida com todos os valores dos registradores no formato abaixo:
- pc=1,r0=0,r1=1,r2=1,r3=4,r5=1,r6=1,r7=7
- Caso o simulador encontra um instrução invalida (
0b00000000000000000000000000000000) ele deve encerrar a execução e exebir o status dos registradores.
- Ao final o simulador deve imprimir a saida com todos os valores dos registradores no formato abaixo:
DICA:
Para construir o simulador, vocês podem utilizar como base o HPC1 e HPC2 e considerar os seguintes passos:
- Carregar as Instruções: Ler o arquivo
.txtgerado na Etapa 1 e carregar as instruções na memória de instruções. - Simulação da Execução: Implementar o ciclo de busca, decodificação e execução para simular o comportamento do HRISC-V.
- Exibir Estado Final: Ao final da execução, o simulador deve exibir o estado de todos os registradores, incluindo o PC.
Exemplo de Execução:
python simulador.py output.txtAmbas as partes (Simulador e Conversor) podem considerar o arquivo exemplo 01) para testar o sistema.
- Descrição das instruções (29/08/2024):
a. Considerando as instruções suportados na seção 1 cada grupo deve entregar um os documentos indicando qual os typos das instruções:
- Exemplo No-type: nop
b. Especificar e explicar o tipo de endereçamento das instruções
- imediato
- direto
- registrador
- indireto de registrador
- indexado
- Código Python (10/09/2024)
- compilador (
compilador.py). - simulador (
simulador.py). - obs: Não utilizar bibliotecas, apenas o core do python estara disponivel
- compilador (
- Apresentação explicando o funcionamento do código (17/09/2024)
A avaliação se dará por meio da corretude do entregável 1 (
Desse modo a nota do trabalho sera
Sobre a correção do .asm - de complexidade similar ou inferio ao exemplo 01 para ser avaliada.
Importante: Avaliarei o simulador.py repassando saída (.txt) de um grupo para o outro. Por exemplo, a saída do conversor do G1 (g1.txt) sera executada pelo simulador do G3 e G4.
Caso tenham dúvidas, podem enviar um e-mail ou marcar um horário de atendimento. No entanto, não há garantia de resposta caso as dúvidas sejam enviadas com menos de 48 horas antes da data de entrega.

