1 |
55 |
zero_gravi |
# NEORV32 `Zfinx` Floating-Point Extension
|
2 |
|
|
|
3 |
56 |
zero_gravi |
The NEORV32 floating-point unit (FPU) implements the `Zfinx` RISC-V extension. The extensions can be enabled via the `CPU_EXTENSION_RISCV_Zfinx` top configuration generic.
|
4 |
|
|
|
5 |
55 |
zero_gravi |
The RISC-V `Zfinx` single-precision floating-point extensions uses the integer register file `x` instead of the dedicated floating-point `f` register file (which is
|
6 |
|
|
defined by the RISC-V `F` single-precision floating-point extension). Hence, the standard data transfer instructions from the `F` extension are **not** available in `Zfinx`:
|
7 |
|
|
|
8 |
|
|
* floating-point load/store operations (`FLW`, `FSW`) and their compressed versions
|
9 |
|
|
* integer register file `x` <-> floating point register file `f` move operations (`FMV.W.X`, `FMV.X.W`)
|
10 |
|
|
|
11 |
65 |
zero_gravi |
:information_source: More information regarding the RISC-V `Zfinx` single-precision floating-point extension can be found in the official GitHub repo:
|
12 |
55 |
zero_gravi |
[`github.com/riscv/riscv-zfinx`](https://github.com/riscv/riscv-zfinx).
|
13 |
|
|
|
14 |
|
|
:warning: The RISC-V `Zfinx` extension is not officially ratified yet, but it is assumed to remain unchanged. Hence, it is not supported by the upstream RISC-V GCC port.
|
15 |
65 |
zero_gravi |
Make sure you **do not** use the `f` ISA attribute when compiling applications that use floating-point arithmetic (`MARCH=rv32i*f*` is **NOT ALLOWED!**).
|
16 |
55 |
zero_gravi |
|
17 |
|
|
|
18 |
56 |
zero_gravi |
### :warning: FPU Limitations
|
19 |
|
|
|
20 |
|
|
* The FPU **does not support subnormal numbers** yet. Subnormal FPU inputs and subnormal FPU results are always *flushed to zero*. The *classify* instruction `FCLASS` will never set the "subnormal" mask bits.
|
21 |
|
|
* Rounding mode `ob100` "round to nearest, ties to max magnitude" is not supported yet (this and all invalid rounding mode configurations behave as "round towards zero" (truncation)).
|
22 |
|
|
|
23 |
|
|
|
24 |
55 |
zero_gravi |
## Intrinsic Library
|
25 |
|
|
|
26 |
|
|
The NEORV32 `Zfinx` floating-point extension can still be used using the provided **intrinsic library**. This library uses "custom" inline assmbly instructions
|
27 |
|
|
wrapped within normal C-language functions. Each original instruction of the extension can be utilized using an according intrinsic function.
|
28 |
|
|
|
29 |
|
|
For example, the floating-point addition instruction `FADD.S` can be invoked using the according intrinsic function:
|
30 |
|
|
|
31 |
|
|
```c
|
32 |
|
|
float riscv_intrinsic_fadds(float rs1, float rs2)
|
33 |
|
|
```
|
34 |
|
|
|
35 |
65 |
zero_gravi |
The pure-software emulation instruction, which uses the standard built-in functions to execute all floating-point operations, is available via wrapper function. The
|
36 |
55 |
zero_gravi |
emulation function for the `FADD.S` instruction is:
|
37 |
|
|
|
38 |
|
|
```c
|
39 |
|
|
float riscv_emulate_fadds(float rs1, float rs2)
|
40 |
|
|
```
|
41 |
|
|
|
42 |
|
|
The emulation functions as well as the available intrinsics for the `Zfinx` extension are located in `neorv32_zfinx_extension_intrinsics.h`.
|
43 |
|
|
|
44 |
|
|
The provided test program `main.c` verifies all currently implemented `Zfinx` instructions by checking the functionality against the pure software-based emulation model
|
45 |
|
|
(GCC soft-float library).
|
46 |
56 |
zero_gravi |
|
47 |
|
|
|
48 |
|
|
## Resources
|
49 |
|
|
|
50 |
65 |
zero_gravi |
* Great page with online calculators for floating-point arithmetic: [http://www.ecs.umass.edu/ece/koren/arith/simulator/](http://www.ecs.umass.edu/ece/koren/arith/simulator/)
|
51 |
56 |
zero_gravi |
* A handy tool for visualizing floating-point numbers in their binary representation: [https://www.h-schmidt.net/FloatConverter/IEEE754.html](https://www.h-schmidt.net/FloatConverter/IEEE754.html)
|
52 |
|
|
* This helped me to understand what results the different FPU operation generate when having "special" inputs like NaN: [https://techdocs.altium.com/display/FPGA/IEEE+754+Standard+-+Overview](https://techdocs.altium.com/display/FPGA/IEEE+754+Standard+-+Overview)
|