在CC++算法设计中使用任意位宽

在CC++算法设计中使用任意位宽,第1张

在CC++算法设计中使用任意位宽,第2张

在开发定点算法时,通常需要在设计功能、数字精确建模和验证(仿真)速度之间取得平衡。现在,一种新的数据类可以简化这一过程,从而获得更简单、更精确的建模精度,更好的数字精化和更快的验证周期,而ANSI C/C++就是开发这种数字精化算法的语言。

这种算法天生适合操作整数,或者那些理想的实数(比如数字滤波器的系数),它们也可能使用浮点或者定点类型。一般来说,在算法开发的早期,经常使用C语言的浮点或双浮点类型,因为它们可以提供非常大的动态数据范围,适用于大多数程序。

使用c中内置的浮点类型对FIR滤波器建模,
该算法可以执行数字细化,以便使用定点运算来降低最终硬件或软件实现的复杂性。硬件方面,将整数或定点运算限制在最小位宽,本质上可以满足性能、空和能耗的要求。如果在实现中使用DSP处理器,通过将算法限制为整数或定点运算,可以将最便宜的处理器用于特定程序。

定点运算的建模可以通过C语言内置的浮点或整数类型来完成,需要进行显式编码,并受到浮点和整数在C中可以表示的个数的限制:64位整数或53位尾数;这些都会给操作数的位宽带来更多的限制。例如,两个33位数字的乘积将超过一个64位C整数所能表示的范围。图2显示了一个FIR滤波器示例,但temp变量限于15位定点精度,其中10位用于整数位。在该实现中,LSB的右边部分被丢弃(量化模型的截断), MSB的左边部分也被丢弃(包装溢出模型)。应该认识到,使用float(或double)的模型在精度上是有限的,并且不能再次合成。同样,由于舍入模型中对位精度有严格的定义,并且由于将首先应用内置浮点类型的舍入,所以很难实现除法之类的操作。


使用float建模定点行为
当很多算法可以用本地C数据类型的精度编写时,人们会对支持任意长度的整数和定点算法有很大的期望,VHDL等硬件描述语言(HDL)也会走同样的路。随着C/C++在高级综合和验证工具中的使用越来越多,证明了这种语言具有能够满足当前和未来程序需求的数据类型库。对任意长度类型的支持也可以使数据类型的行为有一个统一的定义,而统一的语义可以避免手工实现的一些局限性。


算法C数据类型
算法C数据类型是一个基于类的C++库,实现了任意长度的整数和定点类型。这些可自由访问的类型有一系列好处,包括统一和定义良好的语义,运行时速度与C/C++内置数据类型相当。与SystemC中的相应类型相比,其运行速度提高了10倍以上。这些数据类型可以在任何符合C++或SystemC标准的程序中使用,并且具有高度综合的语义。

语义

语义的统一性和一致性是避免算法出现功能错误的关键。以下例子也说明了这一点:

众所周知,变量ActLength的范围是1到255。万一编译器的合成不知道它的范围,就无法进行相应的优化,它的声明会从int变成更严格的sc_uint类型;虽然综合会得到更好的结果,但设计不会被正确模拟。经过一番调试,找到了问题的根源:在比较表达式k >= ActLength中,两个操作数变成了有符号int和无符号long long (64位无符号整数,是sc_uint类型的基类型)的比较。对此的解释是:C/C++整数提升规则规定操作数int在比较之前很久将被提升为无符号长整型。例如,如果k的值为-1,则提升为无符号长整型后,它将变为2 64–1。

  像这样语义中的问题一般会非常难以察觉,且是与位宽相关的,例如,可能有人想扩大某个现有算法的位宽,只有看到结果时,才知道是行不通的;这个问题也可能是与特定平台相关的,例如,对1

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 在CC++算法设计中使用任意位宽

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情