LadiCore: um processador RISC-V projetado por mim


Um dos melhores cursos que eu já fiz na minha vida - e que me fez perceber o quanto a internet pode proporcionar na educação de um indivíduo - foi o famoso NAND2Tetris. Nele, você constrói um computador do 0 - desde a esquematização do hardware e dos logic gates até a construção de uma linguagem de programação, uma implementação de uma máquina virtual e um simples sistema operacional.

Após concluir o curso, fiquei querendo saber como que um computador sem nenhuma simplificação feita por razões didáticas funciona. Nesse contexto, achei algumas aulas da matéria de introdução a arquitetura computacional da UC Berkeley (CS61C).

Logo de cara, uma das tarefas do curso era implementar um processador RISC-V, uma arquitetura nova e moderna capaz em tese de substituir um processador x86 ou ARM. Porém, o curso pedia que essa implementação fosse feita utilizando uma ferramenta visual chamada LogiSim, que claramente não seria a ferramenta utilizada por um hardware designer para o trabalho.

Então, no espírito de fazer as coisas do jeito que elas são feitas no mundo real, eu decidi implementar o processador utilizando uma HDL.

Eu comecei a aprender Verilog e instalei Icarus-verilog como meu simulador. A partir daí foi só questão de ler a especificação desprivilegiada da ISA do RISC-V e combinar isso com meu conhecimento adquirido ao longo do curso.

Nesse processo eu consegui construir um processador conformante com a spec desprivilegiada RISC-V e com uma pipeline de 5 estágios. Não só isso, eu programei meu próprio assembler (embora simples) em Python, suportando variáveis e escrevi diversos testes para verificar o funcionamento do meu design.

Link para o repositório do github contendo o design do processador e o assembler em python

A importância de se manter próximo ao hardware

Não acho que para tudo existe uma razão. Eu gosto de entender como a máquina funciona por trás das inúmeras camadas de abstrações sobre as quais um programador high-level hoje em dia faz seu trabalho. Existe uma certa beleza em ver como algo tão puro e lógico como programação, por baixo dos panos, funciona utilizando física (no que diz respeito ao comportamento das correntes elétricas sendo criadas nos circuitos de um processador) e química (no que tange a fabricação desse processador).

Mas, mesmo que não seja necessário uma razão, existem várias para que programadores entendam como hardware funciona. A mais prática de todas é performance: entender como funciona um computador te permite otimizar seu código em inúmeros níveis pois te faz entender como:

  1. Melhorar a complexidade dos seus algoritmos
  2. Introduzir paralelismo nos seus programas
  3. Otimizar seu programa para não ter que requisitar dados diretamente da memória RAM mais do que o necessário (ou seja, aproveitar o cache)

O futuro do meu processador

Quando eu comecei a fazer o processador eu achava que entendia a quantidade de abstrações necessárias para se ter algo como meu laptop. Eu estava errado.

Meu processador implementa a spec desprivilegiada do RISC-V. Isso quer dizer que ele não tem o suporte necessário para se implementar diversas funcionalidades desejáveis - e necessárias - para se ter um computador “moderno” (o objetivo inicial disso tudo). Para atingir esse objetivo, na ISA do RISC-V, é necessário implementar a spec privilegiada.

Depois de acabar as aulas da CS61C, eu comecei outro curso - dessa vez sobre sistemas operacionais - que eu achei online do MIT. A matéria é Operating Systems Engineering, e existem várias aulas online que foram gravadas durante a pandemia.

Nese curso, eu aprendi o porquê a spec desprivilegiada não é suficiente. Existem diversas funcionalidades necessárias para um computador moderno que simplesmente não funcionam na spec desprivilegiada como: memória virtual, gerenciamento de traps, permissões, interrupts… A lista continua.

Eu ainda tenho o objetivo de escrever meu próprio computador do 0. Seria muito idiota tentar fazer algo equivalente a um Mac escrevendo todo o código necessário. Mas gostaria de achar um meio termo entre simples (o suficiente para eu mesmo construir) e completo (o suficiente para ter utilidade). Ainda estou fazendo o curso do MIT mas já aprendi bastante sobre a spec privilegiada - além de ter trabalhado e implementado diversas funcionalidades do sistema operacional.

Então eu dei um nome ao processador (LadiCore) e tenho um nome para o futuro sistema operacional (LadiOS). O projeto está parado mas planejo no futuro seguir o caminho lógico para rodar um sistema operacional capaz de fazer coisas mais interessantes e úteis. Quem sabe eu possa colocar tudo num FPGA e ter esse computador em mãos.