Bem-vindo ao tutorial da plataforma RAVEN - um guia introdutório que apresenta todas as principais funcionalidades e mecânicas da ferramenta.
O RAVEN é uma plataforma que combina IDE e simulador para facilitar o aprendizado da arquitetura RISC-V. Ela permite escrever, montar e executar código assembly, observando em tempo real o comportamento da memória, dos registradores e a decodificação de cada instrução.
A interface do RAVEN é organizada em abas, que representam as principais etapas do ciclo de desenvolvimento:
- Editor - escrita e montagem do código.
- Run (Simulação) - execução passo a passo e visualização da memória e dos registradores.
- Cache - métricas de cache e ajuste de configuração
- Docs - referência de instruções
A aba Editor é o ponto de partida. Aqui, o usuário pode escrever, montar, importar e exportar código assembly RISC-V.
-
Status da Build: exibido na seção
Editor Status(imagem [1]), indicando o resultado da montagem. -
Importação e Exportação:
- Arquivos de texto:
.asme.FAS - Binários: gerados pelo próprio RAVEN (.bin)
- Arquivos de texto:
-
Atalho de Montagem:
Ctrl + R- monta o código e exibe o status da operação.
O RAVEN permite escrever instruções diretamente, sem necessidade de declarar seções. Porém, quando há necessidade de incluir dados, utilize:
.section .data ; ou apenas .datapara delimitar a região de dados, e:
.section .text ; ou apenas .textpara delimitar a região de instruções.
A aba Run é dedicada à execução e inspeção detalhada do programa. Aqui, o usuário pode acompanhar o comportamento da memória, dos registradores e a decodificação binária das instruções.
Cada instrução executada apresenta:
- Field Map: mapa binário de cada campo da instrução.
- Parsed Fields: valores binários decodificados e separados por campo.
- Console: permite a interação com operações de entrada e saída (I/O).
As janelas da aba podem ser redimensionadas livremente. Basta mover o cursor até a borda da janela (indicada por uma seta) - se ela ficar amarela, o redimensionamento está disponível. Clique, segure e arraste:
- Console: movimenta verticalmente (cima/baixo).
- Instruction Memory: movimenta horizontalmente (esquerda/direita).
Esta seção permite controlar a execução e a forma como os dados da memória são decodificados por meio de Toggles.
- State: alterna entre os modos RUN e PAUSE.
- View: alterna a visualização entre Registradores e Memória RAM.
A janela à esquerda da aba Run exibe o conteúdo da memória e dos registradores, ambos podendo ser rolados com o scroll do mouse.
O modo de exibição pode ser alternado com o botão View na seção Run Controls.
É possível modificar a forma de interpretação dos dados, visualizando-os em:
- Hex: formato hexadecimal.
- Dec: formato decimal.
- STR: formato ASCII (texto).
Para o modo decimal (Dec), pode-se alternar entre:
- SGN: números com sinal (signed).
- UNS: números sem sinal (unsigned).
No modo de visualização da RAM, é possível navegar diretamente até regiões de interesse como:
- .data: onde ficam armazenados valores declarados na seção
.data. - Stack: região da pilha, apontada pelo registrador SP (stack pointer).
Também é possível alternar o espaçamento de endereços exibidos entre 4B, 2B e 1B.
A janela Instruction Memory mostra o avanço do PC (Program Counter) durante a execução do programa. A faixa amarela indica a instrução atualmente apontada pelo PC. As seções Instruction Details, Field Map e Parsed Fields refletem essa instrução em tempo real.
Ao passar o cursor sobre uma instrução, um bloco azul aparece ao lado dela. Se clicar, o PC será movido para essa instrução. A instrução destacada pelo hover define o conteúdo exibido nas janelas Instruction Details, Field Map e Parsed Fields.
Para inspecionar o programa detalhadamente, é possível avançar o PC manualmente. Com a simulação pausada, pressione 'S' para pular para a próxima instrução.
A aba Cache ajuda a visualizar (e ajustar) um modelo simples de I-cache + D-cache.
- Gauge de hit rate e um gráfico de histórico
- Métricas derivadas como miss rate, line fills, avg cycles/access e RAM R/W bytes
- Top Miss PCs (I-Cache): quais PCs de fetch mais causam misses no I-cache
Controles:
- Reset zera as estatísticas
- Pause/Resume pausa/retoma a simulação (as estatísticas do cache param de atualizar enquanto estiver pausado)
- Escopo para focar em I-cache, D-cache ou ambos
Você pode editar parâmetros (size, line size, associativity) e policies, e aplicar em runtime.
Para mais detalhes, veja cache.pt-BR.md.
O RAVEN foi projetado para ser intuitivo e direto, sem perder a fidelidade ao comportamento real da arquitetura RISC-V. Para reduzir o boilerplate e tornar o código mais legível, a plataforma inclui um conjunto de pseudo-instruções que simplificam operações comuns — especialmente de entrada e saída (I/O) e de manipulação da pilha (STACK).
Embora todas as pseudo-instruções estejam documentadas em format.md, este capítulo apresenta um exemplo prático que demonstra como o RAVEN interage com o I/O e como essas abstrações facilitam o desenvolvimento.
O código abaixo ilustra o uso das pseudo-instruções de I/O (printStr, readWord, print, etc.) para criar um pequeno programa que lê dois números, soma e exibe o resultado formatado.
.data
start: .asciz "Enter two numbers"
theSum: .asciz "The sum of "
with: .asciz " with "
is: .asciz " is "
void: .asciz ""
number1: .word 0
number2: .word 0
.text
printStrLn start
readWord number1
readWord number2
printStrLn void
call calculate
printStr theSum
print s1
printStr with
print s2
printStr is
print s0
li a0, 0
li a7, 93 # syscall: exit
ecall
calculate:
la t0, number1
lw t1,0(t0)
la t2,number2
lw t3,0(t2)
add s0,t1,t3
mv s1,t1
mv s2,t3
ret





