No description
Find a file
2023-03-09 18:05:59 +01:00
bandwidth_test memory 2023-03-09 14:56:26 +01:00
Doc Start 2022-12-17 01:54:48 +01:00
fibonacci riscv O3 2023-03-08 16:24:42 +01:00
neorv32 memory 2023-03-09 14:56:26 +01:00
proj_quartus bandwidth 2023-03-09 18:05:59 +01:00
Rapport bandwidth 2023-03-09 18:05:59 +01:00
riscv-gnu-toolchain projet 2023-03-06 14:48:14 +01:00
12_El_Ouardi.pdf Start 2022-12-17 01:54:48 +01:00
readme.md fibonacci 2023-03-08 14:44:31 +01:00

Implémentation et évaluation dun 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 dunités optimisées et précâblées pour laccélération matérielle de certains traitements de données et permettent dinterfacer plusieurs périphériques selon différentes modalités : utilisation dun processeur matériel intégré ou dun 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);