品更要夸一夸,详细的数据类型说明可参见:
http://www.mentor.com/products/esl/high_level_synthesis/ac_datatypes
整数数据类型
和verilog2001或VHDL相似的有符号、无符号整数类型。
无符号整数:
ac_int<W,false> x; //W=Bit width, 0<=x<=2^W-1
超过表示范围的数据赋给x时,会发生wrap around,类似RTL计数器的行为。
有符号整数
ac_int(W,true> x; //W=Bit width, -2^(W-1)<=x<=2^(W-1)-1
超过表示范围的数据赋给x时,同样会发生wrap around
定点数据类型
与RTL不同,HLS中可直接表示定点数据,这是HLS的优势之一。同样有有符号和无符号定点数据类型。
无符号定点数据
ac_fixed<W,I,false> x; //W=Total width, I=Number of Integer bits, 0<=x<=(1-2^(-W))x2^I
有符号定点数据
ac_fixed<W,I,true> x; //W=Total width, I=Number of Integer bits, -0.5x2^I<=x<=(0.5-2^-W)x2^I
量化和溢出
AC提供了多种处理量化和溢出的办法。可通过在类型模板中以参数形式配置。
ac_fixed<W,I,S,Q,O> x; //Q和O分别为量化和溢出的处理模式
截断和舍入
缺省的量化处理模式为截断,即直接扔掉LSB后面的数字。也可以选择舍入(AC_RND),即四舍五入的方式。如
ac_fixed<7,7,true,AC_RND) x=0.5; 此时x被赋予了1
饱和和溢出
缺省的溢出的处理是wrap around。即超过最大最小值时,数值自动跳转到数据范围另一端。这种情况一般
是我们不愿看到的。这意味着我们应尽量让变量的动态范围在数值所能表示的范围之内。一旦出现溢出,一种处
理办法就是饱和操作。即超过数值表示范围时,数值固定在表示范围的最大或最小值。饱和的配置方式为:ac_fixed<7.1.true,AC_TRN,AC_SAT> x;
需要注意的是,不要轻易使用这种配置,这会增加硬件逻辑的面积!使用饱和处理会给系统增加非线性性和噪声。应尽量避免使用这种方式。
文章评论(0条评论)
登录后参与讨论