从一份FPU的Verilog实现中分析CPU中FPU的设计原理

本文介绍了FPU在处理IEEE754标准数据格式中的作用及其硬件实现方式,并通过一个实验性的FPU模块来具体分析其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当前各类的智能应用场景对芯片端的异构算力提供能力提出了越来越高的要求,芯片原厂越来越倾向于将CPU,DSP,GPU,VPU,NPU,ASIC等等异构单元集成在一颗硅片上。FPU作为传统CPU内部的用于浮点算例的集成单元,也可以划归为异构算例的一个组成部分,下面通过一个实验性质的FPU实现模块,简单分析一下FPU对IEEE754标准的实现方式。

安装gtkwave,iverilog:

 获取源码:

https://gitee.com/tugouxp/hardware-lab.git

源码中有三个testbench文件,分别为fpu_TB.v,fpu_mul_TB.v,fpu_addsub_TB.v,仿真只能一个一个进行,不能同时将三个文件放在一起综合,否则,有可能从gtkwave看到的波形和实际波形并不match.

比如,我们要仿真fpu_addsub_TB.v,就先把另外两个删掉,否则根据构建写法,所有.v源码会参与编译。

 接着执行make&&make sim


IEEE754的分析

浮点,并不意味着IEEE754定义中的符号位,阶码部分,尾数部分的位宽是可变的,而是说,最终表示的数字,小数点左边的有效数字浮动范围远远大于定点数字,看下图,你可以闭着眼睛想象一下Exponent域变化时的样子,就是因为最终表示的数字,小数点的位置会随着Exponent的变化而调整移动,所以才叫做浮点。

浮点表示的范围非常的广泛,下面的例子可以说明:

#include <stdio.h>
#include <stdio.h>
#include <stdint.h>

void test_fun(uint32_t num)
{
	float *p = (float*)&num;
	printf("%s line %d, num %d, *p=%f\n", __func__, __LINE__, num, *p);

	return;
}

int main(void)
{
	test_fun(0x40c00000);
	test_fun(0x40e00000);
	test_fun(0x40f00000);
	test_fun(0x40ff0000);
	test_fun(0x40ffffff);

	test_fun(0x70c00000);
	test_fun(0x78c00000);
	test_fun(0x7dc00000);
	test_fun(0x7f400000);
	test_fun(0x7f7f0000);
	test_fun(0x7fc00000);
	return 0;
}

运行结果:

总结:

所以,所谓的FPU,就是一个能够处理IEEE754数据格式的硬件加速单元模块,除了IEEE754标准,工业界也有其它一些实现标准,只是没有推广开来,仅仅在一些小范围内使用。


结束

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

papaofdoudou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值