数字IC实践项目(4)—浮点数乘累加模块设计FPMAC(开源项目)

写在前面的话

  • 浮点数乘累加器是一种硬件电路,用于执行浮点数乘累加(FMA)操作。FMA操作可以同时执行乘法和加法操作,通常用于高性能计算、图形处理、神经网络等领域。FMA操作可以极大地提高运算速度和功率效率,因此浮点数乘累加器是现代计算机体系结构中极为重要的组成部分。
  • 浮点数乘累加器的重要性在于它可以快速处理大量的复杂数学运算,例如在地球物理学、天文学、计算流体力学、金融等领域中常见的科学计算、模拟和优化问题。
  • 此外,浮点数乘累加器还被广泛应用于深度学习神经网络中的矩阵乘法和卷积运算等核心操作,以加速模型的训练和预测。

项目难度:⭐⭐⭐
项目推荐度:⭐⭐
项目推荐天数:1~3天

项目简介和学习目的

浮点数乘累加器(FMA)通常由三个主要组件构成:浮点数乘法器、浮点数加法器和累加器。FMA的工作原理可以概括为以下几个步骤:

  1. 从寄存器或内存中取出两个浮点数(被乘数和乘数)和一个浮点数(加数)。
  2. 将乘数和被乘数送入浮点数乘法器,执行乘法操作,并将结果送入浮点数加法器。
  3. 将加数和上一步得到的乘积送入浮点数加法器,执行加法操作,并将结果送入累加器。
  4. 重复以上步骤,直到所有需要计算的浮点数都被处理完成。

在执行每个操作时,FMA会根据浮点数格式(如IEEE 754标准)对数据进行标准化、舍入等处理,以保证计算结果的精度和正确性。
浮点数乘累加器是一种高效而灵活的计算单元,能够快速执行浮点数乘法和加法,并将结果累加到一个寄存器中。它为各种科学计算和工程计算提供了高效而精确的计算基础,并成为了现代计算机体系结构中不可或缺的一部分。

项目实践环境:

FPGA开发环境:
前仿: Modelsim SE-64 2019.2
综合: Quartus (Quartus Prime 17.1) Standard Edition**

数字IC开发环境:
前仿: VCS 2016
综合:DC 2016

项目学习目的:
(1)熟练掌握项目中各文件的工程管理;
(2)熟悉System Verilog HDL仿真、FPGA综合工具以及了解数字IC设计工具及流程;
(3)学习浮点乘累加器基本结构和基础原理;
(4)学习浮点数、浮点加法和乘法基础原理;
(5)熟练掌握System Verilog语法和验证方法;
(6)熟练掌握Modelsim、VCS等开发工具。

浮点数简介

浮点数,简而言之是说明小数点的位置不固定,采用科学计数法表示数字。

浮点数格式如下:

V = (-1)^S * M * R^E

其中各个变量的含义如下:

  • S:符号位,0 表示正,1 表示负
  • M:尾数,小数部分表示
  • R:基数,十进制数 R 就是 10,二进制数 R 就是 2
  • E:指数,用整数表示

在这里插入图片描述

IEEE 754标准:

  • IEEE 754标准规定了两种浮点数格式:单精度浮点数和双精度浮点数。其中,单精度浮点数由32位二进制数组成,双精度浮点数由64位二进制数组成。在这两种格式中,都采用了“符号+尾数+指数”的形式来表示浮点数。
  • IEEE 754标准还规定了浮点数的各个部分的编码方式,如符号位、尾数和指数的位数、偏移值等。同时,该标准还规定了浮点数的四则运算规则和舍入方式,以确保浮点数运算的精度和正确性。

按照IEEE 754单精度浮点数标准,一个32位的浮点数可以表示为:

(-1)^s x M x 2^E:
其中,s表示符号位(0表示正数,1表示负数),M表示尾数部分(23位二进制小数),E表示指数部分(8位二进制整数),并且要满足如下条件:

  1. 小数点后第一位必须为1(即规格化)
  2. 尾数部分最多保留23位有效数字
  3. 指数部分需要加上一个偏移量127(仅对单精度浮点数)

现在将十进制数25.125转换为单精度浮点数,则可以按照如下步骤进行:

  1. 将25.125转化为二进制数,得到11001.001。
  2. 规格化该数,得到1.1001001 x 2^4。
  3. 将4转换为8位二进制数,并加上偏移量127,得到10000100。

符号位为0,因为该数为正数。
将尾数部分的23位有效数字拼接起来,得到10010010000000000000000

最终的IEEE 754单精度浮点数表示为01000010010010000000000000000000

FPMAC简介

设计支持IEEE 754,并提供两种例外,即上溢(OF)和下溢(UF)。
设计支持四种不同的舍入模式:

  • RNE(舍入到最接近的,绑定到偶数,00),
  • RTZ(舍入到零,编码为01)
  • RDN(向下舍入,编码为10)
  • RUP(向上舍入,编码为11)

完整项目框图

在这里插入图片描述

完整项目说明:

  1. Fmac由fmac预处理、pp生成、Wallace、CSA、对齐器、加法器、LZA和fpu范数组成。在fmac_preprocess模块中,三个操作数被解包为三个IEEE-754编码的数字,对应的符号位、有偏二进制指数和尾数。
  2. 为了支持非正规数,增加了操作数检测,以检查每个操作数并给出相应的符号InF_x_S、Zero_x_S、NaN_x_S和DeN_x_S,当DeN_x_S为逻辑1时,相应的指数Exp_x_D将设置为1,这提供了一个简单的实现,但有一些额外的延迟。
  3. Radix-4booth编码将被用于产生13个部分乘积,这些部分乘积将被由5级CsA组成的Wallace压缩。布斯编码从Mant_b_DI[1:-1]开始。因此最后一个部分乘积总是正的。添加一个热点可以在下一个部分产品中实现。因此,将生成13个部分产品。
  4. pp_generation用于实例化展位编码器和展位选择器。使用Wallace树将13个部分积压缩为2个。
  5. 产生的2个结果将使用CSA用Mant_al_D进一步压缩。由于使用了符号扩展,所以应该考虑wallace和CSA的所有进位输出。

项目代码

项目开源了完整的VHDL代码,使用systemverilog完成设计的。

fpu:
  incdirs: [
    .,
  ]
  files: [
    hdl/fpu_utils/fpu_ff.sv,
    hdl/fpu_v0.1/fpu_defs.sv,
    hdl/fpu_v0.1/fpexc.sv,
    hdl/fpu_v0.1/fpu_add.sv,
    hdl/fpu_v0.1/fpu_core.sv,
    hdl/fpu_v0.1/fpu_ftoi.sv,
    hdl/fpu_v0.1/fpu_itof.sv,
    hdl/fpu_v0.1/fpu_mult.sv,
    hdl/fpu_v0.1/fpu_norm.sv,
    hdl/fpu_v0.1/fpu_private.sv,
    hdl/fpu_v0.1/riscv_fpu.sv,
    hdl/fpu_v0.1/fp_fma_wrapper.sv,
    hdl/fpu_div_sqrt_tp_nlp/fpu_defs_div_sqrt_tp.sv,
    hdl/fpu_div_sqrt_tp_nlp/control_tp.sv,
    hdl/fpu_div_sqrt_tp_nlp/fpu_norm_div_sqrt.sv,
    hdl/fpu_div_sqrt_tp_nlp/iteration_div_sqrt_first.sv,
    hdl/fpu_div_sqrt_tp_nlp/iteration_div_sqrt.sv,
    hdl/fpu_div_sqrt_tp_nlp/nrbd_nrsc_tp.sv,
    hdl/fpu_div_sqrt_tp_nlp/preprocess.sv,
    hdl/fpu_div_sqrt_tp_nlp/div_sqrt_top_tp.sv,
    hdl/fpu_fmac/fpu_defs_fmac.sv,
    hdl/fpu_fmac/preprocess_fmac.sv,
    hdl/fpu_fmac/booth_encoder.sv,
    hdl/fpu_fmac/booth_selector.sv,
    hdl/fpu_fmac/pp_generation.sv,
    hdl/fpu_fmac/wallace.sv,
    hdl/fpu_fmac/aligner.sv,
    hdl/fpu_fmac/CSA.sv,
    hdl/fpu_fmac/adders.sv,
    hdl/fpu_fmac/LZA.sv,
    hdl/fpu_fmac/fpu_norm_fmac.sv,
    hdl/fpu_fmac/fmac.sv,

  ]

在这里插入图片描述

Modelsim编译结果

整个设计在Modelsim中完成编译,设计文档中也提及了通过pulpino平台完成了测试程序。
这里需要补充相关的功能测试。感兴趣的同学可以查看该开源微型控制系统的相关代码和用户手册。

完整dataflow:
在使用modelsim生成RTL视图时,尝试多次一直出现Error,无奈只能生成Data flow作为替代。原项目也是偏向于数字IC设计,只是使用了modelsim完成功能仿真。
f
在这里插入图片描述

VCS编译结果

使用VCS编译成功,YES!!可以查看RTL视图了。
果然,专业的活还得交给专业的软件,PS:不是诋毁modelsim哦。前仿用Mentor真的YYDS!!
不过Mentor都被西门子收购了,不知道未来还有没有modelsim用,唉,一个时代结束了哦
加粗样式

总结

整个项目采用Systemverilog语言完成编程,对新手要求较高,并且缺少一定的仿真文件说明。
对Systemverilog感兴趣的同学可以继续深入了解。

Bug记录

VCS仿真时要先加载参数定义文件,修改.f文件HDL排序即可。

在这里插入图片描述

项目地址

https://github.com/pulp-platform/fpu

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值