Pular para conteúdo

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:

  1. O programa base.asm executa corretamente, pois não há nenhuma dependência entre as instruções;
  2. O programa forward.asm precisa que você implemente o encaminhamento, pois há uma dependência RAW no registrador s8. Além disso, o banco de registradores precisa suportar leitura/escrita no mesmo ciclo, lendo o valor atualizado.
  3. O programa stall.asm precisa que você implemente uma bolha após o lw quando houver dependência do valor gravado, pois isso não pode ser revolvido com encaminhamento, uma vez que o valor vem da memória.
  4. O programa flush.asm precisa 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 nop apó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.

References