Implementação de um RISC-V pipeline
O código fornecido a você nesta simulação é uma implementação pipeline do RISC-V, adaptada do código de Bruno Levy 1. Ele roda, por sua vez, os programas adaptados do nosso livro texto 2 com um preâmbulo para inicializar os registradores usados nos exemplos do livro.
Na versão pipeline voltamos a usar o esquema de Harvard (dados e instruções em memórias separadas). O código fornecido está completo, mas o processador não trata nenhum Hazard, então você precisa corrigir isso por etapas:
- O programa
base.asmexecuta corretamente, pois não há nenhuma dependência entre as instruções; - O programa
forward.asmprecisa que você implemente o encaminhamento, pois há uma dependência RAW no registradors8. Além disso, o banco de registradores precisa suportar leitura/escrita no mesmo ciclo, lendo o valor atualizado. - O programa
stall.asmprecisa que você implemente uma bolha após olwquando houver dependência do valor gravado, pois isso não pode ser revolvido com encaminhamento, uma vez que o valor vem da memória. - O programa
flush.asmprecisa que você implemente o descarte das instruções quando um salto é tomado, já que o processador só desvia do estágio de execução e as instruções seguintes foram indevidamente carregadas no pipeline.
Nesta simulação, ao invés de olhar para a saída da simulação e comparar com a saída esperada, optou-se por salvar o conteúdo final do banco de registradores após a execução. Assim, você pode descomentar e usar livremente o $monitor que está no test bench para depurar o seu código.
Atenção: se você colocar instruções
nopapós os trechos críticos dos programas eles irão executar corretamente. Você pode fazer isso para testar, mas não se esqueça de restaurar os programas originais, pois eles estão na pasta de testes e nenhum arquivo nela pode ser alterado.