数字IC实践项目(10)—基于Verilog的IEEE754 FPU设计与验证(开源项目)
前言
PU(Floating Point Unit,浮点运算单元)是计算机中专门用于执行浮点数运算(如加法、减法、乘法、除法等)的硬件部件。浮点数是一种用于表示非常大或非常小的数字的数值类型,与整数不同,它能够表示小数部分。
FPU 通过硬件加速浮点数运算,避免了由软件模拟浮点运算带来的性能瓶颈。在没有 FPU 的早期计算机中,浮点运算通常通过程序指令模拟,这使得浮点运算变得非常缓慢。随着硬件发展,FPU 作为计算机的一个独立模块,专门负责浮点数计算,大大提高了性能。
FPU 主要处理以下几种基本的浮点运算:
- 加法(Addition)
- 减法(Subtraction)
- 乘法(Multiplication)
- 除法(Division)
- 平方根(Square Root)
- 三角函数、对数函数等(对于更复杂的数学计算)
现代的 FPU 还可以处理单精度和双精度 浮点数运算,并支持不同的精度级别和舍入模式。
项目简介
项目来源于Jonathan P Dawson 设计的可综合FPU模块,源项目采用iverilog完成仿真验证,本项目将其移植为VCS平台,并基于Python完成并行仿真验证脚本,极大降低仿真验证时间。
项目难度:⭐⭐⭐
项目推荐度:⭐⭐
项目推荐天数:3~7天
1)项目主要特性
#########################################################
Synthesiseable IEEE 754 floating point library in Verilog.
#########################################################
1) Provides Divider, Multiplier and Adder
2) Provides float_to_int and int_to_float
3) Supports Denormal Numbers
4) Round-to-nearest (ties to even)
5) Optimised for area
6) Over 100,000,000 test vectors (for each function)
2)源项目文件
源项目提供加法、乘法、除法以及进制转换共计十余种设计,并附带用testbench, c++ golden model以及python运行脚本,每个设计采用32bit 浮点数定义,以下为源工程示例;
#####
adder
#####
1) c_test/test and test.cpp ; c++ 模型,用于产生Golden Vector
2) adder.v ; 32bit 浮点加法器设计源文件
3) file_reader_a.v/file_reader_b.v ; Golden Vector 读取模块,采用三级类CPU结构,用于获取Vector内容
4) file_write.v; resp 写入文件,便于同预期结果相比较
5) testbench.v; DUT及外围读写模块整合
6) testbench_tb.v ;测试平台顶层,产生时钟和复位信号
项目仿真优化
1)仿真环境需求
源项目基于Python,C++以及icarus verilog 仿真器共同完成FPU的验证;测试平台包括一个 Python 脚本 run_test.py,以及一个作为验证参考的简单 C 语言模型。
源工程测试向量包括角案例、边缘案例和 100,000,000约束随机向量。该测试套件可能需要几天时间才能完整运行完成,测试时间相对漫长。
2)sim_pool及auto_flow脚本
本项目主要改进了源工程在测试向量的仿真时间,基于Python搭建了autoflow,并更改为支持VCS仿真平台,脚本执行一键执行,会将Pending太长导致的fail case重新仿真,并收集最终结果;主要工作如下:
Improvement by Devane (优快云 IC Brother) @2024.11.22
============================================================
1.Modify run_test.py to support vcs simulation flow.
2.Add sub_test.py to better support random test vectors (100w subtest).
3.Add sim_pool mechanism to support parallel simulation, which can greatly shorten the simulation time of vectors.
Usage
=========
cd sim_pool
./run
##1) sim.pool is the FPU test input file; format: DUT, number of random sub-tests
##2) Parallel testing will schedule all CPU cores, please be careful to evaluate the server loading !!!
需要注意的是,新增的auto脚本将会并行调用CPU,在测试中CPU占用率将持续维持在100%左右,在并行执行10*11个100w测试向量时,内存占用大概20G。
3)仿真结果
改进后工程完成一亿随机测试向量时耗时大概15h,较大程度上缩短了验证时间,同时会在终端输出最终结果,并生成summary.log文件,每个子目录包含100W随机测试向量结果,并生成fsdb波形(单次仿真为1W随机向量)



仅保留单次仿真波形以减小空间占用,以乘法器为例,仿真结束后可以cd到子目录查看具体波形。
1. cd multiplier/multiplier_0
2. make run_verdi

总结
项目学习目的:
(1)熟练掌握IEEE754 Spec;
(2)学习FPU基本结构和基础原理;
(3)熟悉 Verilog HDL仿真以及Python自动化脚本工具;
项目完善了开源FPU中的相关测试脚本,适用于IC设计初学者掌握Spec > 设计 > 验证的基本流程,可以帮助练习Python脚本, 建立工程flow感知能力。
改进后的项目及完整的工程文件已经上传到优快云, 供大家学习。