95 lines
No EOL
2.6 KiB
Markdown
95 lines
No EOL
2.6 KiB
Markdown
# Implémentation et évaluation d’un processeur RISC-V sur une architecture SoC
|
||
|
||
## Lien utiles
|
||
https://hedgedoc.auro.re/x2PBnMb4Q3CQg-DRtt6Kkg#
|
||
|
||
## Contexte
|
||
|
||
Les architectures récentes associent, dans la même puce, des FPGA et des processeurs pour constituer des SoC (System on Chip). Elles sont composées d’unités optimisées et précâblées pour l’accélération matérielle de certains traitements de données et permettent d’interfacer plusieurs périphériques selon différentes modalités : utilisation d’un processeur matériel intégré ou d’un processeur logiciel (Soft-Core).
|
||
|
||
## RISC-V
|
||
|
||
On utilise pour ce projet, l'implémentation RISC-V neorv32
|
||
|
||
### Hardware
|
||
|
||
<< NEORV32 Processor Configuration >>
|
||
|
||
====== Core ======
|
||
Is simulation: no
|
||
Clock speed: 50000000 Hz
|
||
On-chip debugger: no
|
||
Custom ID: 0x00000000
|
||
Hart ID: 0x00000000
|
||
Vendor ID: 0x00000000
|
||
Architecture ID: 0x00000013
|
||
Implementation ID: 0x01080106 (v1.8.1.6)
|
||
Architecture: rv32-little
|
||
ISA extensions: C I M X Zicsr Zicntr
|
||
Tuning options:
|
||
Phys. Mem. Prot.: not implemented
|
||
HPM Counters: not implemented
|
||
|
||
====== Memory ======
|
||
Boot configuration: Boot via Bootloader
|
||
Instr. base address: 0x00000000
|
||
Internal IMEM: yes, 16384 bytes
|
||
Data base address: 0x80000000
|
||
Internal DMEM: yes, 8192 bytes
|
||
Internal i-cache: no
|
||
Ext. bus interface: no
|
||
Ext. bus endianness: little
|
||
|
||
====== Peripherals ======
|
||
[x] GPIO
|
||
[x] MTIME
|
||
[x] UART0
|
||
[ ] UART1
|
||
[ ] SPI
|
||
[ ] TWI
|
||
[ ] PWM
|
||
[ ] WDT
|
||
[ ] TRNG
|
||
[ ] CFS
|
||
[ ] SLINK
|
||
[ ] NEOLED
|
||
[ ] XIRQ
|
||
[ ] GPTMR
|
||
[ ] XIP
|
||
[ ] ONEWIRE
|
||
|
||
### Clock
|
||
|
||
On peut augmenter la fréquence du processeur à l'aide de l'outil PLL Intel FPGA IP que l'on vient monter à 100 MHz. Monter à 200 Mhz indique un timing fail et une Fmax à 130 Mhz.
|
||
Il faut ensuite modifier l'input de clock vers le signal de pll.
|
||
|
||
```
|
||
library pll;
|
||
|
||
pll_100: entity pll.pll(rtl)
|
||
port map(
|
||
refclk => clk_i, -- refclk.clk
|
||
--rst : in std_logic := '0'; -- reset.reset
|
||
outclk_0 => clk_100, -- outclk0.clk
|
||
locked => open -- locked.export
|
||
);
|
||
```
|
||
### Software
|
||
|
||
Print sur le série :
|
||
```
|
||
neorv32_uart0_puts("Hello world! :)\n");
|
||
```
|
||
|
||
Mesures :
|
||
```
|
||
Begin_Time = (long)neorv32_mtime_get_time();
|
||
End_Time = (long)neorv32_mtime_get_time();
|
||
User_Time = End_Time - Begin_Time;
|
||
uint32_t dhry_per_sec = (uint32_t)(NEORV32_SYSINFO.CLK / (User_Time / Number_Of_Runs));
|
||
|
||
neorv32_uart0_printf("NEORV32: Total cycles: %u\n", (uint32_t)User_Time);
|
||
neorv32_uart0_printf("NEORV32: Cycles per second: %u\n", (uint32_t)NEORV32_SYSINFO.CLK);
|
||
neorv32_uart0_printf("NEORV32: DMIPS/s: %u\n", (uint32_t)dhry_per_sec);
|
||
|
||
``` |