Skip to content
Mattia edited this page Jul 30, 2024 · 34 revisions

Welcome to the riscv-cpu wiki!

v0.1.0

General Idea

Implement a simple 5 stage RISC-V Non pipelined architecture and test it. For now let's settle on the RV32I Base ISA. I am going to implement the followint instructions for the time being:

Features to be implemented

  • Execute Stage;
  • Memory Access;
  • Write back;
  • State Machine;

Done

  • Instruction Fetch;
  • Instruction Decode;

Overview

Technical Details

Instruction Memory

Instruction memory will consist of a ROM BRAM (Read only memory Block RAM), for the time being with a width of 32 bits (instruction size, RISC-V like) and a depth of 4096 instructions. The block memory is defined as a single port ROM, that's because we are only interested in reading the hardcoded RISC-V instructions inside of it. The BRAM will have an enable pin and a synchronous reset pin (will only work when memory is enabled). The IP will have an embedded output register where the Instruction to be decoded is saved before the instruction decode stage. The input address is 32 bit wide to ease RISC-V jump instructions. For this time the load_en for the instruction memory will be hard-wired to "1".

Register File

Register File is made of a DRAM (Distributed Memory), with two ports, defined with a width of 32 bits (RISC-V Registers size) and 32 words deep (RISC-V ISA defines 32 registers for the register file). For now the output is registered.

Clock

  • Clock is now set at 50 MHz, let's try if it works.

Implemented Instructions

For now I am going to implement a small subset of the RV32I ISA. This is a comprehensive list: image

Instruction Decoded? Implemented in ALU?
ADD Yes
SUB Yes
JAL Yes
BEQ Yes
BNE Yes
BLT Yes
BGE Yes
LW Yes
SW Yes
ADDI Yes
XORI Yes
ORI Yes
ANDI Yes
XOR Yes
OR Yes
AND Yes

Instruction Fetch Stage

Instruction Fetch drawio(1)

The entire instruction fetch stage is executed in one clock cycle. Here is the flow of operations:

  • If LOAD_EN is active, incoming PC from upper stages is loaded into the PC register (beware, this happens 1 clock cycle before the start of the instruction fetch)
  • Rising edge of the clock arrives
  • BRAM Instruction Memory fetches instruction reading PC if LOAD_EN_MEM is active. A synchronous RST may reset the Instruction Memory
  • In the meantime PC + 4 is computed and saved in NPC (Next Program Counter)
  • BRAM will save Instruction in internal IR (instruction register) before the arrival of the next clock pulse

Instruction Decode Stage

instruction_decode drawio (3)

Execute Stage

image

Clone this wiki locally