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

53 篇文章 1 订阅

当前各类的智能应用场景对芯片端的异构算力提供能力提出了越来越高的要求,芯片原厂越来越倾向于将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标准,工业界也有其它一些实现标准,只是没有推广开来,仅仅在一些小范围内使用。


结束

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: FPU(浮点运算单元)是在计算机体系结构负责执行浮点运算操作的重要组件。FPUVerilog实现是指使用Verilog硬件描述语言来设计实现一个浮点运算单元。 在FPUVerilog实现,首先需要确定所需的浮点数格式,例如单精度(32位)或双精度(64位)。然后,需要设计实现各种浮点运算操作,如加法、减法、乘法和除法。 在实现加法和减法时,可以使用IEEE 754浮点数标准的规定,将两个浮点数进行位运算、对阶、尾数运算以及舍入处理,并最终得到结果。 实现乘法时,可以使用乘法器电路,将两个浮点数的尾数相乘,并进行规定的舍入和归一化处理,然后将指数相加得到最终结果。 实现除法时,可以使用除法器电路,将一个浮点数的尾数除以另一个浮点数的尾数,然后进行舍入和归一化处理,并将指数相减得到运算结果。 在Verilog实现FPU时,还需要考虑到异常情况的处理,如溢出、无穷大和NaN(Not a Number)的判断与处理。 总的来说,FPUVerilog实现需要根据具体的浮点数格式和运算要求,设计实现与加法、减法、乘法和除法相关的电路和逻辑,并对异常情况进行处理,以实现对浮点运算的支持和实现。 ### 回答2: FPU(浮点运算单元)是计算机系统负责执行浮点运算的部件。它通常包含浮点加减运算、乘法和除法等基本运算操作。FPU还能支持舍入模式、异常处理以及浮点数格式转换等功能。 FPUVerilog实现涉及到如下几个主要步骤: 1. 定义数据格式:首先确定要支持的浮点数格式,例如单精度(32bits)或双精度(64bits)。然后定义每个格式的数据结构,包括符号位、指数位和尾数位等。 2. 实现基本运算:根据浮点数格式,编写Verilog代码实现浮点加减法、乘法和除法等基本运算操作。这些操作包括对指数的处理、对尾数的运算、溢出和下溢出的判断等。 3. 舍入模式和异常处理:根据指定的舍入模式,执行舍入操作。舍入模式一般有截断、向上舍入、向下舍入等多种选择。同时,需要处理异常情况,如除以零、无穷大运算、NaN(非数)等。 4. 性能优化:FPU设计时需要考虑性能优化,如使用流水线技术提高运算速度、寻址方式的优化和数据缓存策略的选择等。 5. 集成到整个系统:将FPU与其他计算机系统部件集成,如控制器、内存等,实现完整的计算机系统。 通过以上步骤,可以完成FPUVerilog实现。该实现可以用于各种需要浮点运算的应用领域,如科学计算、图形处理和嵌入式系统等。FPU能够使计算机能够更高效地进行浮点运算,提高计算精度和计算速度,满足各种计算要求。 ### 回答3: FPU(浮点数处理器)是一种专门用于执行浮点运算的处理器。它可以在计算机体系结构独立存在,或者作为CPU的一个子模块存在。 FPUVerilog实现主要涉及到浮点数的表示和运算。在Verilog,我们可以使用不同的数据类型来表示浮点数,如固定点数、浮点数等,具体取决于设计要求。 首先,我们需要定义浮点数的数据结构,其包括小数点的位置、尾数和指数的位数等。然后,我们可以通过串行或并行方式实现浮点数的各种运算,如加法、减法、乘法和除法等。 在Verilog,我们使用逻辑门、寄存器和时钟等基本组件来实现FPU。对于浮点数的运算,我们可以使用加法器、乘法器、除法器等特定的硬件电路来实现相应的操作。 FPUVerilog实现需要考虑一些设计因素,如精度、吞吐量、延迟、功耗等。这些因素可以根据具体的需求进行调整和优化,以实现高效的浮点数处理。 总而言之,FPUVerilog实现涉及到浮点数的表示和运算,并使用适当的硬件电路来实现相关操作。这个过程需要考虑设计需求,使用Verilog编写相应的代码,并进行仿真和验证,以确保实现的正确性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

papaofdoudou

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

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

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

打赏作者

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

抵扣说明:

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

余额充值