一种定点乘累加器
技术领域
本发明涉及处理器技术领域,尤其涉及一种定点乘累加器。
背景技术
乘法操作被用于大部分算法中,特别是在信号处理算法中,乘累加操作是核心操作之一,这使得每秒可执行乘累加操作数(MAC/S)成为简单衡量一个数字信号处理器计算能力的指标之一。不仅是在数字信号处理器中,通用处理器为了中也集成了乘法器,某些通用处理器为了加速图像处理或其他科学计算,也使用了乘累加器。
在现有技术中,一个乘累加器的结构通常是使用Booth编码和压缩树进行乘法的基本操作,而累加器的值一般参与压缩树的最后压缩,在得到两个压缩结果之后,使用超前进位加法器将两者相加,得到最终的乘累加结果。一般情况下,乘法器所在通路是所有计算单元的关键通路所在。
在处理器的设计中,需要使用定点乘累加器完成多种形式的操作:
(1)有符号乘法、无符号乘法,甚至有符号数与无符号数相乘;
(2)定点整数乘法和定点小数乘法;
(3)乘累加和乘累减;
(4)乘法结果饱和操作。
第(1)种操作已经有非常成熟的实现方法,在两位Booth编码中,有无符号数参与的计算会增加一个部分积。
第(2)种操作中,定点整数与定点小数的计算区别仅在于,小数乘法结果需要左移一位。在现在的技术中,一般是在乘法压缩结果得出之后,根据操作类型决定是否对结果进行移位操作。而该移位操作将增加乘累加器关键通路的长度。
第(3)种操作在FFT以及类蝶形运算中出现的较多,乘法结果与累加器之间做加法或减法操作都是算法中较为常用的。在现有的技术中,往往是在乘法结果给出之后,根据操作类型,选择乘法压缩结果的反或者原值,然后与累加器的进行加法操作。其中,仅仅对结果进行取反是不够的,对每一个取反的数仍需要加1,一般情况下压缩结果的进位最低位与加法器的初始进位可以解决该问题。这种方法的缺点同样是在关键通路中增加选择,从而加长累加器的路径长度。
第(4)种操作也较为常见。为了与浮点格式相匹配,一般在处理器中只处理Q(n-1)格式的定点小数(n是数据位宽),即最高位是符号位,其余均是小数的尾数部分,其表示范围是-1~(1-2-(n-1)),精度是2-(n-1)。所以当两个-1相乘时,从表示范围即可看出该操作超出了表示范围。实际上在不做处理的情况下,两个-1相乘得到的仍然是-1,这与实际结果相差太多,所以一般这时候需要在累加前进行饱和处理,将其饱和至最接近1的正数(1-2-(n-1))。在现有的技术中,同样是在乘法结果得出之后进行饱和选择处理,其缺点依然是增加了关键路径的长度。
综上,如果一个乘累加器需要完成上述操作,需要增加多级选择器才可实现,而乘法器作为所有计算单元的关键通路,增加任何一点延时都将导致性能的降低。
发明内容
本发明提供了一种定点乘累加器,在不增加延时的情况下,既可实现定点整数乘法又可实现定点小数乘法。
为解决上述技术问题,本发明采用下述技术方案予以实现:
本发明提出了一种定点乘累加器,包括:Booth编码单元,用于对乘数进行Booth编码;左移逻辑单元,用于当被乘数为小数时,将被乘数左移一位、低位补零;Booth译码/部分积产生单元,用于产生部分积;压缩树,用于压缩部分积,输出两个压缩数据;压缩器,用于压缩累加器和压缩树提供的数据;加法器,用于对压缩器输出的数据进行加法操作,输出结果。
进一步的,当进行乘累减操作时,所述Booth编码单元还用于对乘数进行Booth编码后将编码值neg取反。
又进一步的,当进行无符号数的乘累减操作时,所述定点乘累加器还包括:操作数预处理单元,用于将左移逻辑单元输出数据的低m位取反加1;所述Booth译码/部分积产生单元包括最后部分积低位产生单元和其余部分积产生单元;所述最后部分积低位产生单元用于根据操作数预处理单元的输出数据和乘数的最高位产生最后部分积的低m+1位;所述其余部分积产生单元,用于根据Booth编码单元产生的编码和左移逻辑单元输出的数据产生最后部分积的其他位以及其他的部分积;最后部分积的其他位和最后部分积的低m+1位合并成最后部分积。
更进一步的,所述定点乘累加器还包括溢出判断单元,用于判断在进行小数乘数时的乘数和被乘数是否均为-1,若是,则输出溢出信号至压缩树,修改压缩树。
再进一步的,所述压缩树还用于:在乘累加操作且接收到溢出信号时,将部分积中权重最低的1出现的位清零,然后将低于该权重的每一位加1。
优选的,所述将低于该权重的每一位加1,具体包括:在具有相同的权重的部分积位中选取一位,使用溢出信号将低于该权重的所有选取位置成1。
又进一步的,所述将低于该权重的每一位加1,具体包括:如果在低于该权重的压缩树中,存在半加器,则将溢出信号参与压缩,并将半加器改为全加器。
更进一步的,所述将低于该权重的每一位加1,具体包括:在具有相同的权重的部分积位中选取已经得到压缩结果的一位,使用溢出信号将低于该权重的所有选取位置成1。
再进一步的,所述压缩树还用于:在乘累减操作且接收到溢出信号时,将部分积中权重为0的其中一位修改为1。
与现有技术相比,本发明的优点和积极效果是:本发明的定点乘累加器,既可实现定点整数乘法又可实现定点小数乘法,且不增加乘累加器的延时,保证了处理器的性能;同时还可实现乘累加/减功能、溢出判断功能。
结合附图阅读本发明的具体实施方式后,本发明的其他特点和优点将变得更加清楚。
附图说明
图1是本发明提出的定点乘累加器的一个实施例的结构框图;
图2是图1中Booth编码单元的一个实施例的门级电路结构图;
图3是图1中左移逻辑单元的结构示意图;
图4是图1中Booth译码/部分积产生单元产生的16位乘法所有部分积及其权重示意图;
图5是图1中压缩树的16位乘法压缩示意图;
图6是本发明提出的定点乘累加器的另一个实施例的结构框图;
图7是图6中Booth编码单元的一个实施例的门级结构图;
图8是图6中操作数预处理单元、最后部分积低位产生单元的门极结构图;
图9是本发明提出的定点乘累加器的又一个实施例的结构框图;
图10是本发明提出的定点乘累加器的再一个实施例的结构框图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下将结合附图和实施例,对本发明作进一步详细说明。
本发明的定点乘累加器,充分利用了乘累加器设计中的非关键通路,在不增加乘累加器延时的情况下,使得乘累加器在可重构的实现有符号数乘法和无符号数乘法的基础上,可选择的实现定点整数乘法和定点小数乘法、乘累加和乘累减、乘法结果饱和功能。
为了叙述方便,本发明做以下约定:部分积编号按照Booth编码的权重从低至高编号,从0开始计数,例如第0个部分积;Booth编码中要求将部分积取负的编码值称为neg;而在neg控制下,取负操作要求进行“取反加1”,我们称其中需要加1的位为“加1”(每个“加1”的数值与neg相同);将只在无符号乘法中才会产生的部分积称为“最后一个部分积”;压缩树中,信号经过一个全加器或半加器称为经过一级压缩,压缩级数从1开始计数,例如第3级压缩表示信号已经经过两个全加器或半加器后,使用第三个全加器或半加器进行压缩的操作。
实施例一、定点整数/小数乘法功能:
本实施例提出了一种乘累加器,主要包括Booth编码单元、左移逻辑单元、Booth译码/部分积产生单元、压缩树、压缩器、累加器、加法器等,参见图1所示,既可实现定点整数乘法又可实现定点小数乘法,且不增加乘累加器的延时。
所述Booth编码单元,用于对乘数进行Booth编码。
Booth编码用于减少部分积的个数,使用基4的Booth编码可以使部分积个数减少一半。下表是基4Booth编码的编码表:
其中X表示被乘数,xi表示被乘数权重为i的位,Y表示乘数,y2t-1表示乘数中权重为2i-1的位,PPi表示第i个部分积,B1/B2/neg是Booth编码值。表中表示使用乘数中的每相邻三位可以确定一个部分积,而实际运算时会根据乘数的每相邻三位生成更具操作性的Booth编码值,然后再产生部分积。
Booth编码单元、Booth译码/部分积产生单元的门级电路结构如图2所示。图中Booth译码/部分积产生电路只给出了第i部分积中j位的产生电路,其他位的译码方式与图中所示相同,使用同一组Booth译码结果,产生完整的第i部分积(PPi)。
在基4的Booth编码中,对于无符号数乘法的最后一个部分积只由乘数最高位决定,当乘数最高位是0时,其部分积是0,乘数最高位是1时,其部分积是被乘数本身。
左移逻辑单元的具体结构参见图3,DecimalEn为高电平,表示进行小数操作;Sign为高电平,表示当前进行的是有符号操作。当被乘数为小数时,DecinalEn为高电平,选择器选通,被乘数左移一位、低位补零;当被乘数为整数时,DecinalEn为低电平,被乘数不移位,被乘数有符号时高位符号扩展一位(0或1,根据符号而定),否则补零。被乘数被拓宽了一位,于是部分积全部拓宽了一位,后续压缩树同样需要处理拓宽一位的部分积,但位宽增加只是增加少量的并行逻辑,并不对关键路径产生影响。
Booth译码/部分积产生单元,用于产生部分积。
在一个16位乘法的实施例中,其所有部分积如图4所示。图中黑点表示部分积本身,E表示该部分积的符号扩展,表示该部分积符号的反,P表示该部分积需要取负(neg有效时)时的“加1”。
压缩树,用于压缩所有的部分积,输出两个压缩数据。
压缩器,用于压缩累加器和压缩树提供的数据。
加法器,用于对压缩器输出的数据进行加法操作,输出结果。
压缩树也称华莱士压缩树,使用压缩器将多个需要相加的数压缩成两个数,主要原理是将多个低权重的数使用少量具有高权重的数表示。压缩树由多个压缩器组成,压缩器有多种形式,但是最基本的压缩器是全加器。全加器是一个三输入二输出的器件,将三个低权重的数使用一个高权重的数和一个低权重的数进行表示,这就是3-2压缩器。使用两级3-2压缩器可以搭建一个4-2压缩器。
图5所示是一个16位乘法示例中常见的压缩示意图,其中,在同一个权重位上,连续三个具有相同底纹的数值输入一个全加器中,连续两个具有相同底纹的数值输入一个半加器中。
在高性能处理器中,出于高速主频的要求,通常需要多个周期完成整个乘累加操作。具体如何划分一个乘累加器的流水级则根据实际主频需求与算法实际需求而定。但根据乘累加的特性,常常需要进行连续的乘累加,此处累加器中的值需要在每一次累加操作时使用,所以多条乘累加指令之间必因累加器产生相关。无论处理器使用何种方式处理该相关,基本的一点是,累加器的值越靠后使用,对于数据相关的处理越容易,对性能的影响越小。如图1中所示,将在部分积压缩为两个数之后,才使用累加器进行压缩。该结构的乘累加器适合在压缩树给出两个压缩结果之后作为一个周期的结束,在第二个周期再使用累加器的值,如此多个乘累加指令之间就不会因为数据相关而造成流水线的阻塞。
本实施例的定点乘累加器,当被乘数为小数时,将被乘数左移一位、低位补零;当被乘数为整数时,则不移位,被乘数有符号时高位符号扩展一位,否则补零;由于被乘数被拓宽了一位,于是部分积全部拓宽了一位,后续压缩树同样需要处理拓宽一位的部分积,但位宽增加只是增加少量的并行逻辑,并不对关键路径产生影响,不增加乘累加器的延时,既可实现定点整数乘法又可实现定点小数乘法,又保证了处理器的性能。
实施例二、乘累加/减功能:
本实施例提出了一种乘累加器,主要包括Booth编码单元、Booth译码/部分积产生单元、压缩树、压缩器、累加器、加法器等,参见图6所示,既可实现乘累加功能,又可实现乘累减功能,且不增加乘累加器的延时。
本实施例的Booth编码单元与实施例一的区别在于,当进行乘累减操作时,Booth编码单元对乘数进行Booth编码后将编码值neg取反,得到新的Booth编码值neg_new;然后使用neg_new产生部分积,参见图7所示。
因为Booth编解码的关键路径是编码值b1/b2所在路径,产生Neg_new并不影响关键路径的长度。值得一提的是,每个部分积的“加1”的数值同样使用对应的neg_new;只有当neg_new=1时,对应的部分积“取反加1”。
在乘累减操作中,无符号数乘法使用的“最后一个部分积”也可能需要取负,如此就也需要在该部分积最低位所在权重上“加1”。以图4为例,若需要在该最后部分积上“加1”,就需要在权重16上增加一个数值,但是从图中可以看出,该权重上所有部分积都有数值,而该权重在压缩树中的压缩通路也正好是关键路径之一,如果再添加一个数值,势必增加关键路径的长度。
为了解决这个问题,本实施例的乘累加器还包括操作数预处理单元,用于将被乘数的低m位取反加1;Booth译码/部分积产生单元包括最后部分积低位产生单元和其余部分积产生单元,参见图6所示。
最后部分积低位产生单元,用于根据操作数预处理单元的输出数据和乘数的最高位产生最后部分积的低m+1位;其余部分积产生单元,用于根据Booth编码单元产生的编码和被乘数产生最后部分积的其他位以及其他的部分积;最后部分积的其他位和最后部分积的低m+1位合并成最后部分积。
被乘数低m位进行取反加1后的结果是m+1位,其中结果的低m位是加1操作的和,最高位是加1操作的进位,结果的最高位是一位进位,我们称该进位是“被移位的加1”。
例如,从图4中可以看出,当m等于4时,被乘数低m位进行取反加1后的进位是位于权重20,而权重20中部分积0没有数值,所以当该权重上增加一个进位,不会影响关键路径的长度。
在该实施例中,部分积低4位pp8[3:0]以及“被移位的加1”pp8p的具体逻辑如图8所示。从图中部分积产生的逻辑长度与Booth编解码产生部分积的逻辑长度相比(即:图中产生最后部分积低4位和一位进位的逻辑长度,与其他部分积产生的逻辑长度相比),前者在较短的路径下,将最低4位完成取反加1,该操作的进位作为“被移动的加1”位于权重20位,该位上,部分积0没有数值,所以该“被移动的加1”不会影响压缩树的逻辑长度。
当sub=1时,被乘数低m位取反加1;当Unsign=1(无符号数)时,乘数的最高位与被乘数低m位取反加1的结果产生最后部分积的低m+1位。
本实施例的压缩树、压缩器、累加器、加法器的结构与实施例一相同,可参照实施例一的描述,此处不再赘述。
本实施例的定点乘累加器,当进行乘累减操作时,Booth编码单元对乘数进行Booth编码后将编码值neg取反,得到新的Booth编码值neg_new;然后使用neg_new产生部分积,因为Booth编解码的关键路径是编码值b1/b2所在路径,产生Neg_new并不影响关键路径的长度;乘累减操作中进行无符号数乘法时,通过操作数预处理单元将被乘数的低m位取反加1,结果是m+1位,然后与乘数的最高位产生最后部分积的低m+1位,其余部分积产生单元产生最后部分积的其他位以及其他的部分积,最后部分积的其他位与最后部分积的低m+1位合并成最后部分积;由于取反加1操作不影响关键路径的长度,不会影响压缩树的逻辑长度。因此本实施例的定点乘累加器,既可实现乘累加功能,又可实现乘累减功能,且不增加乘累加器的延时。
如果既需要实现乘累加/减功能,又需要实现定点整数/小数乘法功能,则可在本实施例中设置左移逻辑单元,左移逻辑单元将被乘数处理后,输出数据至操作数预处理单元、Booth译码/部分积产生单元,产生部分积。左移逻辑单元的详细说明可参照实施例一。
实施例三、溢出判断功能:
在现有技术的小数乘法中,当两个-1相乘时,在乘法结果得出之后进行饱和选择处理(溢出处理),其缺点是增加了关键路径的长度。
针对上述问题,若乘累加器需要在累加前对乘法结果自动饱和,则添加操作数判断逻辑,当两个操作数均是-1的情况下才会溢出,因此,本实施例提出了一种乘累加器,主要包括Booth编码单元、Booth译码/部分积产生单元、溢出判断单元1001、压缩树、压缩器、累加器、加法器等,参见图9所示,在不增加关键路径长度的基础上实现乘累加功能和溢出判断功能。
溢出判断单元1001用于判断在进行小数乘法时的乘数和被乘数是否均为-1,若乘数和被乘数均为1,则输出溢出信号overflow至压缩树,修改压缩树。
在乘累加操作且接收到溢出信号时,压缩树将部分积中权重最低的1出现的位清零,然后将低于该权重的每一位加1。
也就是说,在部分积中,找出权重最低的1出现的位置(假设位于权重w),将该位清零,该位直接参与第二级压缩,并将低于权重w的每一位加1。若权重最低的1出现的位涉及有多个部分积,则将其中一个部分积的该位清零;将所有部分积中低于该权重w的每一位加1。
将低于权重w的每一位加1的实现方法有多种。
方法一:使用溢出信号将某一位置成1。
在具有相同的权重的部分积位中选取一位,使用溢出信号将低于该权重w的所有选取位置成1。
方法二:如果在低于权重w的压缩树中,存在半加器,则将溢出信号参与压缩,并将半加器改为全加器。
方法三:如果低于权重w的某一权重的部分积压缩结果早于关键路径得出,则可以直接使用溢出信号置位压缩结果为1。即在具有相同的权重的部分积位中选取已经得到压缩结果的一位,使用溢出信号将低于该权重w的所有选取位置成1。
方法一中的选取位进行置位之后仍然需要参与压缩树中的某一级的压缩,方法三中的选取位进行置位后,直接进入后面的压缩器与累加器进行操作。
前两种方法适用于权重较高的位,后一种方法适用于权重较低的位。上述压缩树的修改均是在非关键路径上修改,不增加关键通路的长度。在使用修改后的压缩树压缩完成之后,若判定为饱和,则可得到饱和值。
例如,在16位乘法中,如图5所述,当0x8000与0x8000相乘时,部分积中权重最低的“1”位于部分积7的最低位或其对应的“加1”位(权重14)。所以压缩树修改主要针对权重14至权重0:
使用溢出信号将权重14的“加1”位清零,清零结果参与第二级的压缩。
使用溢出信号将权重13中某一位不参与第一级压缩的值置位成1(采用方法一)。
在权重12中,使用溢出信号参与第二级压缩,所以权重12中第二级压缩器中某个半加器使用全加器代替(采用方法二)。
在权重11至权重0中,无需全部的压缩级即可得到压缩结果,使用溢出信号将压缩结果的某一位置位(采用方法三)。
按上述方法,即可得到,压缩树得到的两个压缩结果的和即是饱和值0x7FFF_FFFF。
上述压缩树的修改并没有修改和影响关键路径上的压缩逻辑,所以不会增加压缩树的延时。
本实施例的Booth编码单元、Booth译码/部分积产生单元、压缩器、累加器、加法器的结构与实施例一相同,可参照实施例一的描述,此处不再赘述。
本实施例的乘累加器,通过溢出判断单元判断乘数和被乘数是否均为-1,在乘数和被乘数均为1时输出溢出信号overflow至压缩树;在乘累加操作且接收到溢出信号时,压缩树将部分积中权重最低的1出现的位清零,然后将低于该权重的每一位加1;由于压缩树的修改并没有影响关键路径上的压缩逻辑,不增加关键路径长度,所以不会增加压缩树的延时,从而在不增加乘累加器延时的基础上实现乘累加功能和溢出判断功能。
如果既需要实现乘累加/减功能,又需要实现自动饱和功能(溢出判断功能),则对上述方案再进行改进:在判断是否溢出的同时确定溢出加或溢出减;若是溢出且当前是加操作,则按照上述方案对压缩树进行修改,若是溢出且当前是减操作,则不对上述方案中除了权重0之外的权重位进行修改,只保留最低位的修改即可。也就是说,在乘累减操作且接收到溢出信号时,压缩树将部分积中权重为0的其中一位修改为1;且乘累减的功能实现参照实施例二中的描述,此处不再赘述。
如果既需要实现自动饱和功能(溢出判断功能),又需要实现定点整数/小数乘法功能,则可在本实施例中设置左移逻辑单元,左移逻辑单元将被乘数处理后,输出数据至Booth译码/部分积产生单元,产生部分积。左移逻辑单元的详细说明可参照实施例一。
实施例四、定点整数/小数乘法功能、乘累加/减功能、溢出判断功能:
为了既实现定点整数/小数乘法功能,又实现乘累加/减功能,同时实现溢出判断功能,且不增加乘累加器延时,本实施例提出了一种乘累加器,主要包括溢出判断单元1001、Booth编码单元、左移逻辑单元、操作数预处理单元、Booth译码/部分积产生单元、压缩树、压缩器、累加器、加法器等,参见图10所示。
左移逻辑单元,用于当被乘数为小数时,被乘数左移一位、低位补零;当被乘数为整数时,被乘数不移位,被乘数有符号时高位符号扩展一位(0或1,根据符号而定),否则补零。具体可参照实施例一的说明。
Booth编码单元,用于对乘数进行Booth编码;当进行乘累减操作时,Booth编码单元对乘数进行Booth编码后将编码值neg取反,得到新的Booth编码值neg_new;然后使用neg_new产生部分积。具体可参照实施例二的说明。
操作数预处理单元,当进行乘累减操作时,用于将左移逻辑单元输出数据的低m位取反加1。具体可参照实施例二的说明。
Booth译码/部分积产生单元,包括最后部分积低位产生单元和其余部分积产生单元;最后部分积低位产生单元,用于根据操作数预处理单元的输出数据和乘数的最高位产生最后部分积的低m+1位;其余部分积产生单元,用于根据Booth编码单元产生的编码和左移逻辑单元输出的数据产生最后部分积的其他位以及其他的部分积;最后部分积的其他位和最后部分积的低m+1位合并成最后部分积。具体可参照实施例二的说明。
溢出判断单元1001用于判断在进行小数乘法时的乘数和被乘数是否均为-1,若乘数和被乘数均为1,则输出溢出信号overflow至压缩树,修改压缩树。
在乘累加操作且接收到溢出信号时,压缩树将部分积中权重最低的1出现的位清零,然后将低于该权重的每一位加1;在乘累减操作且接收到溢出信号时,压缩树将部分积中权重为0的位修改为1。具体可参照实施例三的说明。
压缩器、累加器、加法器的结构和原理参照实施例一的描述,此处不再赘述。
本实施例的定点乘累加器,既实现定点整数/小数乘法功能,又实现乘累加/减功能,同时实现溢出判断功能,且不增加乘累加器延时。
以上实施例仅用以说明本发明的技术方案,而非对其进行限制;尽管参照前述实施例对本发明进行了详细的说明,对于本领域的普通技术人员来说,依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或替换,并不使相应技术方案的本质脱离本发明所要求保护的技术方案的精神和范围。