Xilinx Vivado HLS中Floating-Point(浮点)设计介绍_第1页
Xilinx Vivado HLS中Floating-Point(浮点)设计介绍_第2页
Xilinx Vivado HLS中Floating-Point(浮点)设计介绍_第3页
Xilinx Vivado HLS中Floating-Point(浮点)设计介绍_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

XilinxVivadoHLS中Floating-Point(浮点)设计介绍编码风格与技巧尽管通常Fixed-Point(定点)比Floating-Point(浮点)算法的FPGA实现要更快,且面积更高效,但往往有时也需要Floating-Point来实现。这是因为Fixed-Point有限的数据动态范围,需要深入的分析来决定整个设计中间数据位宽变化的pattern,为了达到优化的QoR,并且要引入很多不同类型的Fixed-Point中间变量。而Floating-Point具有更大的数据动态范围,从而在很多算法中只需要一种数据类型的优势。XilinxVivadoHLS工具支持C/C++IEEE-54标准单精度及双精度浮点数据类型,可以比较容易,快速地将C/C++Floating-Point算法转成RTL代码。与此同时,为了达到用户期望的FPGA资源与性能,当使用VivadoHLSdirectives时需要注意C/C++编码风格与技巧相结合。编码风格1.1单双精度浮点数学函数#includefloatexample(floatvar){returnlog(var);//双精度自然对数}在C设计中,这个例子,VviadoHLS生成的RTL实现将输入转换成双精度浮点,并基于双精度浮点计算自然对数,然后将双精度浮点输出转换成单精度浮点。#includefloatexample(floatvar){returnlogf(var);//单精度自然对数}在C设计中,logf才是单精度自然对数,这个例子VviadoHLS生成的RTL实现将基于单精度浮点计算自然对数,而且没有输入输出单双精度的互转。1.2浮点运算优化我们先来看一个例子,三个从代数上看起来差不多的写法,但其在VivadoHLS中综合出来的是三个完全不一样的结果。voidexample(float*m0,float*m1,float*m2,floatvar){*m0=0.2*var;//双精度浮点乘法,单双精度类型转换*m1=0.2f*var;//单精度浮点乘法*m2=var/20.0f;//单精度浮点除法}VivadoHLS将日m0,m1,m2综合成不同的RTL实现。因为0.2是一个不能精确表征的双精度数字,所以m0运算会被VivadoHLS综合成一个双精度浮点乘法,并且将var转换成双精度,然后将双精度乘法输出m0转换成单精度。特别注意,如果希望VivadoHLS综合出单精度常熟,需要在常数后面加f,如0.2f。这样m1综合成一个单精度乘法的输出。同理,m2将被VivadoHLS综合成单精度除法的输出。我们来看另外一个例子。voidexample(float*m0,float*m1,floatvar){*m0=0.2f*5.0f*var;//*m0=var;常数乘法被优化掉*m1=0.2f*var*5.0f;//两个双精度浮点乘法}再来看另一个例子。voidexample(float*m0,float*m1,floatvar){*m0=0.5*var;//*m1=var/2;//}m0运算会被VivadoHLS综合成一个双精度浮点乘法,并且将var转换成双精度,然后将双精度乘法输出m0转换成单精度。m1运算会被VivadoHLS综合成简单的右移运算。所以如果用户希望实现对var除以2,就写成m1这种表达式,而不是m0的表达式。并行度与资源复用由于浮点运算相比整型,定点运算耗用更可观的资源。VivadoHLS会尽量用更有效的资源来实现浮点运算,当数据的相关性及约束许可的情况下,在VivadoHLS中,会尽量复用一些浮点运算单元。为了说明这个,我们看一个简单的四个浮点加法例子,VivadoHLS复用一个浮点加法器来串行实现四个浮点加法。voidexample(float*r,floata,floatb,floatc,floatd){*r=a+b+c+d;}有时设计需要更高的throughput及更低的latency。这时就需要提高设计的并行度。以下面例子来说明,在VivadoHLS就需要对for循环loop加pipeline与unroll的directives。同时需要通过设置a,b,r0为FIFO,并对其重排以提高I/O带宽两倍。这样VivadoHLS就会综合出两个浮点加法来并行实现,这是因为每个加法器计算是完全独立的。voidexample(floatr0[32],floata[32],floatb[32]){#pragmaHLSinterfaceap_fifoport=a,b,r0#pragmaHLSarray_reshapecyclicfactor=2variable=a,b,r0for(inti=0;i《32;i++){#pragmaHLSpipeline#pragmaHLSunrollfactor=2r0[i]=a[i]+b[i];}}然而,如果更多复杂的运算,或许会导致不独立的浮点运算,在这种情况下,VivadoHLS不能重新排列这些运算的顺序,这样会导致更低的,不是所期望的复用。下面举例来说明如何提高带有反馈浮点运算的性能。这个例子的累加会导致recurrence,并且通常浮点加法的latency大于一个时钟周期,加的pipelinedirective并不能达到一个时钟周期完成一次累加的throughput。floatexample(floatx[32]

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论