利用赛灵思,Vivado,HLS,实现浮点设计
时间:2022-03-22 11:02:19 浏览次数:次
大多数设计人员在设计中使用定点算术逻辑来运算数学函数,因为这种方法速度快,占用面积小。不过在许多情况下,使用浮点数值格式进行数学计算更为有利。虽然定点格式可以实现精确的结果,但给定的格式动态范围非常有限,故设计人员必须进行深度分析,判断贯穿复杂设计的数位增长特征。而且在采用定点格式的时候,设计人员还必须引入许多中间数据类型(有着不同的定点格式),才能实现理想的质量结果(QoR)。相比之下,浮点格式能够在宽泛得多的范围内表达实数,便于设计人员在许多算法的一长串计算中使用单一的数据类型。
从硬件设计的角度来看,手动实现浮点格式的成本较高。在设计中实现这种格式需占用较大的面积。另外这种格式还会增大时延,因为与实现整数(定点)算术所需的逻辑相比,使用浮点格式实现给定算术运算所需的逻辑要复杂得多。
幸运的是,赛灵思推出一款全新Vivado高层次综合(HLS)工具,能够帮助设计人员把C/C++设计规范用于寄存器传输级(RTL),实现需要采取浮点计算的设计。Vivodao可以显著地减少在硬件中实现浮点算法所需的设计工作量。虽然在浮点设计上运行HLS的基本做法一目了然,但一些细节需要详细说明。本文的讨论话题将涉及基本内容和高级内容,涵盖设计性能、面积,以及使用Vivado HLS工具在赛灵思FPGA中实现的浮点逻辑进行验证。
浮点数据和双精度数据
Vivado HLS工具支持C/C++的浮点数据和双精度数据类型。这两类数据依据的是IEEE754标准定义的单精度和双精度二进制浮点格式。在采用浮点运算时需要重视的一点是这种数值格式无法表达每一个实数,因此精度有限。
这一点比看上去更微妙、更复杂,而且关于这点已有大量专著。一般来说,即便是在纯软件环境下,针对相同计算采用不同算法乃至相同算法的不同实现(微架构)也无法得到完全相等的二进制结果。这种误差的来源有多种,其中包括舍入误差的累加。而这种累加对运算进行的次序很敏感。另外,FPU对扩展精度的支持也会影响舍入结果。以x87的80位格式为例,SIMD(SSE等)指令的行为就与x87不同。另外,许多浮点字面值只能近似地表达,即便是对有理数也是如此。其他可能导致误差的因素有库函数逼近原理,如三角函数,常量传用或是合并效应。
此外,部分浮点算法支持“次正常”值,用于表达比浮点格式正常表达值小的数值。例如在单精度格式中,最小的正常浮点值是2-126。但是在支持次正常值的情况下,尾数位可用于通过固定指数值2-127表达定点数值。
现在介绍用于验证浮点计算结果的简单软件示例。
下面的例1说明用不同方法(乃至貌似相同的方法)完成相同计算会得到的结果略有不同。同时,例2说明二进制浮点格式不能准确地表达所有数值(甚至整数)。
例1:相同计算得到不同结果
//Simpledemooffloatingpointpredictabilityproblem
intmain(void){
floatfdelta=0.1f;//Cannotberepresentedexactly
floatfsum=0.0f;
while(fsum<1.0f)
fsum+=fdelta;floatfprod=10.0f*fdelta;
强大的功能
在赛灵思FPGA上用C/C++源代码轻松实现浮点算法硬件(RTL代码)是Vivado HLS工具所具备的一种强大功能。但浮点算法的使用不管是从软件的角度、硬件的角度还是混合的角度都并非像看上去那么直观。IEEE754标准二进制浮点格式的非精确性给验证计算结果带来难度。另外,设计人员在C/C++源代码层面以及应用HLS优化指令的时候,都必须额外小心,才能在FPGA资源利用和设计性能方面获得理想的结果。
[利用赛灵思,Vivado,HLS,实现浮点设计]相关文章