Costruzione di una CPU basata su RISC-V in VHDL divisa in 5 stadi:
Esce con l'istruzione a 32 bit, il program counter (pc) e il prossimo valore del program counter (npc) indirizzato a BYTE, dentro contiene una BRAM 32 x 1024 (32Kb) utilizzata come memoria istruzioni.
Configurazione BRAM:
- Single port ram,
- No byte accessing,
- Pin ENA per abilitazione (collegato a 'pc_load')
- Primitives Output Register disabilitato
Decodifica l'istruzione dai 32bit alla control word (segnali di selezione degli operandi, valori dei registri, immediato) che serve allo stadio successivo per eseguire l'operazione, estende in segno l'immediato, contiene il Register File.
Contiene la ALU ed il Comparatore, legge la control word ed esegue effettivamente i calcoli necessari ad eseguire l'istruzione (calcoli aritmetici [op], calcoli di indirizzi di memoria [L & S] o calcoli sul prossimo valore di PC [B & J]) inoltre il comparatore calcola l'eventuale condizione per eseguire i salti tra istruzioni
Contiene la RAM ed il circuito di selezione del prossimo valore di PC. Permette l'indirizzamento a BYTE
Attenzione: l'accesso non allineato in memoria non è pienamente supportato per il momento, questo potrebbe comportare ad errori nel calcolo!
Configurazione BRAM
- Single port ram, 32x2048
- Byte accessing -> wea[2:0],
- Pin ENA per abilitazione (gestito dalla MSF)
- Primitives Output Register disabilitato
Note:
- Nel caso di una Jump è il comparator (dello stadio precedente) a mettere ad '1' il segnale 'cond'.
.
├── assembly
│ ├── bin
│ │ └── <here are placed all free Assembly Files binaries>
│ └── <here are placed all free Assembly Files>
├── C
│ ├── <Project Name>
│ │ ├── bin [GIT UNTRACKED]
│ │ │ └── <here are placed Project Binaries>
│ │ ├── src
│ │ │ └── <here are placed Project Sources>
│ │ ├── linker_script.ld
│ │ └── Makefile
│ └── <Here are placed all C/Assembly Project folders>
├── coe
│ └── <here are placed all free coe files>
├── hex
│ └── <here are placed all free hex files>
├── packages
│ └── <here are placed HDL packages>
├── scripts
│ └── <here are placed all utility scripts>
├── simulation
│ └── <here are placed all simulation files>
├── src
│ └── <here are placed all HDL sources>
├── testbench
│ └── <here are placed all testbench files>
└── README.md [This file]
- Seguire le informazioni di installazione dei prerequisiti presenti nel repository riscv-gnu-toolchain
- Eseguire lo script fornito nel repository per la compilazione del toolchain con il comando
./configure --prefix=<Your Compilation Paht> --with-arch=rv32i --with-abi=ilp32- Eseguire il comando
make per la compilazione del toolchain
- Aggiungere la variabile d'ambiente
PATHal file.bashrccon il comando
export PATH=$PATH:<Your Compilation Path>/bin`Per compilare un file sorgente in assembly RISC-V è sufficiente eseguire il comando
riscv32-unknown-elf-gcc -march=rv32i -mabi=ilp32 -nostdlib -nostartfiles -ffreestandingNei progetti C/assembly presenti in questa repository nella directory ./C è presente un Makefile che permette di compilare il progetto con il comando
make- Cambiare il PC in contatore a 12 bit;
- Portare fuori il contatore
- Cambiare la memoria istruzioni in BRAM
- Provare a vedere come influisce il pc_enable e il registro dell'istruzione
- Inserire il controller AXI per la BRAM e creare la modalità programmazione
- Modificare il sign-extender
- Da testare
- Aggiungere un 'load_enable' al register file
- Testare il file register
- Creare il decoder
- Aggiungere il load_enable
- Inserire i multiplaxer
- Da Testare
- Provare a simulare il comportamento della RAM nel caso in cui l'indirizzo arrivi in un ciclo di clock, mentre il dato arrivi al fronte successivo!
- Probabilmente bisogna togliere i registri in uscita per PC, per i dati; va verificato
- Indirizzamento a BYTE
- Unaligned memory access
Test flow
- Operazioni con immediati
- Load
- Store
- Brench
- Jump
- LUI
- AUIPC
- Provare a togliere 'ena' al MEM&WB nello stato di 'mem_wb' per sistemare le load riflessive tipo
lw x1, 0(x1)