发明内容
本公开旨在至少解决现有技术中存在的技术问题之一,提供一种乘法器、一种乘法运算方法、一种运算芯片、一种电子设备和一种计算机可读存储介质。
本公开的一个方面,提供一种乘法器,所述乘法器包括一个乘数预处理模块、一个编码模块、一个加法模块和一个部分积选择模块,其中:
所述乘数预处理模块,用于根据不同的运算位宽将其接收到的乘数生成不同的编码输入值;
所述编码模块,用于根据不同的所述编码输入值生成不同的编码值,并根据所述不同的编码值与接收到的被乘数进行运算得到第一部分积;
所述加法模块,用于根据所述不同的运算位宽将所述第一部分积进行对应次数的累加,生成不同的第二部分积;
所述部分积选择模块,用于根据接收到的输出位宽选择性地从所述第一部分积和所述不同的第二部分积中选择出对应的部分积作为目标部分积并输出。
进一步的,所述根据不同的运算位宽将其接收到的乘数生成不同的编码输入值,还包括:
所述乘数预处理模块,还用于:
根据所述不同的运算位宽和预设的编码基数,将接收到的所述乘数生成依序放置的多组子编码输入值,第一组所述子编码输入值包括固定零位和乘数位,其余组所述子编码输入值包括选择位和乘数位;
根据所述乘数确定所述乘数位,根据所述运算位宽确定所述选择位。
进一步的,所述乘数预处理模块还包括至少一个选择器,每个所述选择器对应其余组所述子编码输入值中的一组所述子编码输入值,其中,
所述选择器,用于根据所述不同的运算位宽,生成对应一组所述子编码输入值的所述选择位。
进一步的,所述根据所述不同的运算位宽,生成对应一组所述子编码输入值的所述选择位,还包括:
当所述运算位宽为一个预设的高运算位宽时,所述选择器,还用于根据所述高运算位宽,将当前选择器所对应的子编码输入值的前一组子编码输入值中处于高位的乘数位作为所述选择位;
当所述运算位宽为一个预设的低运算位宽时,所述选择器,还用于根据所述低运算位宽,将固定零位作为所述选择位。
进一步的,所述编码模块采用一个booth编码模块,所述根据不同的编码输入值生成不同的编码值,具体为:
所述booth编码模块,用于根据所述不同的编码输入值生成带不同的固定偏值的不同的booth编码值;其中,所述固定偏值与所述运算位宽相对应。
进一步的,所述加法模块还包括一个第一级子加法模块、一个第二级子加法模块和一个第三级子加法模块;其中,
所述编码模块选择性地与所述第一级子加法模块和所述部分积选择模块相连;
所述第一级子加法模块选择性地与所述第二级子加法模块和所述部分积选择模块相连;
所述第二级子加法模块选择性地与所述第三级子加法模块和所述部分积选择模块相连;
所述第三级子加法模块与所述部分积选择模块相连。
进一步的,所述乘数预处理模块还用于根据接收到的不同符号信息将其接收到的乘数生成不同的编码输入值。
本公开的另一个方面,提供一种乘法运算方法,包括:
根据不同的运算位宽将接收到的乘数生成不同的编码输入值;
根据不同的编码输入值生成不同的编码值,并根据所述不同的编码值与接收到的被乘数进行运算得到第一部分积;
根据所述不同的运算位宽将所述第一部分积进行对应次数的并行累加,生成不同的第二部分积;
根据接收到的输出位宽选择性地从所述第一部分积和所述不同的第二部分积中选择出对应的部分积作为目标部分积并输出。
进一步的,所述根据不同的运算位宽将接收到的乘数生成不同的编码输入值,还包括:
根据所述不同的运算位宽和预设的编码基数,将接收到的所述乘数生成依序放置的多组子编码输入值,第一组所述子编码输入值包括固定零位和乘数位,其余组所述子编码输入值包括选择位和乘数位;
根据所述乘数确定所述乘数位,根据所述运算位宽确定所述选择位。
进一步的,所述根据所述运算位宽确定所述选择位,还包括:
当所述运算位宽为一个预设的高运算位宽时,根据所述高运算位宽,将前一组子编码输入值中处于高位的乘数位作为对应一组所述子编码输入值的所述选择位;
当所述运算位宽为一个预设的低运算位宽时,根据所述低运算位宽,将固定零位作为对应一组所述子编码输入值的所述选择位。
进一步的,所述根据不同的编码输入值生成不同的编码值,还包括:
根据所述不同的编码输入值生成带不同的固定偏值的不同的booth编码值;其中,所述固定偏值与所述运算位宽相对应。
本公开的另一个方面,提供一种运算芯片,包括前文记载的乘法器。
本公开的另一个方面,提供一种电子设备,包括:
一个或多个处理器;
一个存储单元,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行时,能使得所述一个或多个处理器实现前文记载的乘法运算方法。
本公开的另一个方面,提供一种计算机可读存储介质,其上存储有一组计算机程序,
所述计算机程序被处理器执行时能够实现前文记载的乘法运算方法。
本公开实施例的乘法器、乘法运算方法及运算芯片,可以支持多种混合位宽的乘法,支持有符号、无符号混合的乘法运算,且在硬件面积上,一个乘法器的面积远小于对应数量一种数据位宽乘法器的面积,大大减少了硬件资源消耗;在硬件功耗上,一个乘法器的功耗也远小于对应数量一种数据位宽乘法器的功耗,面对不同精度的乘法运算时可复用乘法器单元,降低硬件资源的消耗。针对神经网络等需要实现大量卷积运算、包含多个复杂乘法和加法组合的运算,能有效的减少延时、降低能耗。
具体实施方式
为使本领域技术人员更好地理解本公开的技术方案,下面结合附图和具体实施方式对本公开作进一步详细描述。
首先,参照图1来描述用于实现本公开实施例的一种乘法器以及乘法运算方法以及运算芯片以及电子设备及存储介质的示例电子设备。
如图1所示,电子设备200包括一个或多个处理器210、一个或多个存储装置220、一个或多个输入装置230、一个或多个输出装置240等,这些组件通过总线系统250和/或其他形式的连接机构互连。应当注意,图1所示的电子设备的组件和结构只是示例性的,而非限制性的,根据需要,电子设备也可以具有其他组件和结构。
处理器210可以是中央处理单元(CPU)或者具有数据处理能力和/或指令执行能力的其他形式的处理单元,并且可以控制电子设备200中的其他组件以执行期望的功能。
存储装置220可以包括一个或多个计算机程序产品,所述计算机程序产品可以包括各种形式的计算机可读存储介质,例如易失性存储器和/或非易失性存储器。所述易失性存储器例如可以包括随机存取存储器(RAM)和/或高速缓冲存储器(cache)等。所述非易失性存储器例如可以包括只读存储器(ROM)、硬盘、闪存等。在所述计算机可读存储介质上可以存储一个或多个计算机程序指令,处理器可以运行所述程序指令,以实现下文所述的本公开实施例中(由处理器实现)的客户端功能以及/或者其他期望的功能。在所述计算机可读存储介质中还可以存储各种应用程序和各种数据,例如,所述应用程序使用和/或产生的各种数据等。
输入装置230可以是用户用来输入指令的装置,并且可以包括键盘、鼠标、麦克风和触摸屏等中的一个或多个。
输出装置240可以向外部(例如用户)输出各种信息(例如图像或声音),并且可以包括显示器、扬声器等中的一个或多个。
下面,根据图2来描述本公开实施例的乘法器。
如图2所示,一种乘法器100,包括一个乘数预处理模块110、一个编码模块120、一个加法模块130和一个部分积选择模块140。其中,所述乘数预处理模块100,用于根据不同的运算位宽将其接收到的乘数生成不同的编码输入值。所述编码模块120,用于根据不同的所述编码输入值生成不同的编码值,并根据所述不同的编码值与接收到的被乘数进行运算得到第一部分积。所述加法模块130,用于根据所述不同的运算位宽将所述第一部分积进行对应次数的累加,生成不同的第二部分积。所述部分积选择模块140,用于根据接收到的输出位宽选择性地从所述第一部分积和所述不同的第二部分积中选择出对应的部分积作为目标部分积并输出。
具体地,本实施例的乘法器,利用所设置的乘数预处理模块可以实现根据不同的运算位宽(例如,2bit、4bit、8bit、16bit等)对乘数进行预处理,获得不同的编码输入值。之后,利用编码模块对不同的编码输入值进行编码并与被乘数进行运算得到第一部分积。加法模块根据不同的运算位宽将第一部分积进行对应次数的累加,获得第二部分积,例如,在运算位宽为4bit时,加法模块可以对第一部分积进行一次累加,从而获得所需的第二部分积等。最后,部分积选择模块,根据输出位宽从第一部分积和第二部分积中选择对应的部分积输出,完成乘法运算。例如,若运算位宽为2bit,则所述输出位宽可以为2bit。再例如,若运算位宽为4bit,则所述输出位宽可以为2bit、4bit。此外,若所运算位宽为16bit,则所述输出位宽可以为2bit、4bit、8bit、16bit。也就是说,输出位宽应当小于或等于所述运算位宽。所述乘法器能处理的乘法的运算位宽优选2n,也可以处理其他多位运算位宽的乘法。
本实施例的乘法器,可以实现多种运算位宽的乘法运算,并且,不需要为每一种运算位宽设置对应的硬件结构,只需借助所设置的乘数预处理模块即可实现多种运算位宽的处理,从而可以简化乘法器的硬件资源消耗,提高乘法运算效率。
示例性的,所述乘数预处理模块110,可以根据所述不同的运算位宽m和预设的编码基数n,将接收到的所述乘数生成依序放置的多组子编码输入值,第一组所述子编码输入值包括固定零位和乘数位,其余组所述子编码输入值包括选择位和乘数位;其中,所述乘数位根据所述乘数确定,所述选择位根据所述运算位宽确定。
具体地,根据所述运算位宽m和预设的编码基数n将编码输入值分解为多组依序放置的子编码输入值,具体为以n-1的位数为一组、将编码输入值进行分组,所述编码输入值共包括m/(n-2)组子编码输入值,所述多组子编码输入值从第一组至最后一组依序放置。所述编码基数n为根据实际情况具体选择,例如可以选择基数n为4、5、6等。此外,第一组子编码输入值包括固定零位和乘数位,其余组所述子编码输入值包括选择位和乘数位。
示例性的,如图3所示,本实施例中编码基数取值为4,因此将编码输入值按每3位一组分成多组子编码输入值。若运算位宽选择为16位,则所述编码输入值共有8组子编码输入值,若运算位宽选择为8,则所述编码输入值共有4组子编码输入值,若运算位宽选择为2,则所述编码输入值共有1组子编码输入值。
在确定了多组子编码输入值以后,需要对每组子编码输入值的乘数位和选择位进行确定,下文将进行具体描述。
示例性的,在确定乘数位时,根据乘数位值和运算位宽来确定,即根据所述子编码输入值的位数将所述乘数依序放置入每组子编码输入值中的乘数位中,所述依序放置具体为从低位到高位依序方式。本实施例中,如图3所示,若接收到的乘数为2bit的乘数,即分别将所述乘数的第一位和第二位放置到第一组子编码输入值的第二位和第三位中,由于所述第一子编码输入值的最低位即第一位是固定零位,因此,所述第二位即为最低位的乘数位,从而实现依序放置。反之,若接收到的乘数为4bit的乘数,即分别将所述乘数的第一位和第二位放置到所述第一组子编码输入值的第二位和第三位中,分别将所述乘数的第三位和第四位放置到所述第二组子编码输入值的第二位和第三位中,从而实现依序放置。依次类推,对于其余运算位宽,将乘数采用类似的分配方式。
示例性的,在确定每组子编码输入值的选择位时,需要根据所述不同的运算位宽生成对应一组所述子编码输入值的所述选择位。例如,第二组子编码输入值的选择位可以为第一组子编码输入值的最高位,或者,第二组子编码输入值的选择位也可以为零,这取决于当前的运算位宽,比如,在运算位宽为2bit时,第二组子编码输入值的选择位为零。在当前的运算位宽为4bit时,第二组子编码输入值的选择位为第一组子编码输入值的最高位。再例如,在当前的运算位宽为8bit时,第二组子编码输入值的选择位为第一组子编码输入值的最高位,第三组子编码输入值的选择位为第二组子编码输入值的最高位,依次类推。当然,选择位除了这种分配方式以外,本领域技术人员还可以根据实际需要,选择其他的一些分配方式,本实施例对此并不限制。
示例性的,作为乘数预处理模块的一种具体结构,如图3所示,所述乘数预处理模块100中还包括至少一个选择器,每个选择器根据所述运算位宽生成对应一组所述子编码输入值的所述选择位。所述选择器可以为一个或多个,当选择器为多个,则多个选择器直接采用级联的方式连接,每个所述选择器对应其余组所述子编码输入值中的一组所述子编码输入值,即第一组子编码输入值不设置对应的选择器。所述选择器的数量由所述运算位宽的最大值k和编码基数n确定,具体为k/(n-2)-1。
在本实施例中,由于所述运算位宽最大值k为16bit,所述编码基数n为4,因此所述选择器的数量为7个,即为图3中A、B、C、D、E、F、G共7个选择器,即所述7个选择器级联。在具体使用过程中,7个选择器并不一定全部使用,而是根据运算位宽和需要并行处理的乘法数量来决定。例如,处理16bit的一个乘数和被乘数的乘法,需要使用7个选择器;处理2bit的八个乘数和被乘数的乘法,需要使用7个选择器;处理2bit的四个乘数和被乘数的乘法,仅需要使用3个选择器;处理4bit的三个乘数和被乘数的乘法,仅需要使用5个选择器。
示例性的,当所述运算位宽为一个预设的高运算位宽时,所述选择器还用于根据所述高运算位宽,将当前选择器所对应的子编码输入值的前一组子编码输入值中处于高位的乘数位作为对应一组所述子编码输入值的所述选择位。当所述运算位宽为一个预设的低运算位宽时,所述选择器还用于根据所述低运算位宽,将固定零位作为对应一组所述子编码输入值的所述选择位。
需要说明的是,对于每一个选择器而言,其低运算位宽和高运算位宽并不是只有一个,并且,低运算位宽和高运算位宽也仅仅是相对而言的。如,在2bit运算位宽时,对于选择器A至选择器G而言,该运算位宽均为低运算位宽。反之,在4bit运算位宽时,对于选择器A、C、E而言,是高运算位宽,对于选择器B、D和F而言,其为低运算位宽,依次类推。
本实施例中,7个选择器预设的高运算位宽和低运算位宽具体如下:
A:低运算位宽:2bit;高运算位宽:4bit、8bit、16bit。
B:低运算位宽:2bit、4bit;高运算位宽:8bit、16bit。
C:低运算位宽:2bit;高运算位宽:4bit、8bit、16bit。
D:低运算位宽:2bit、4bit、8bit;高运算位宽:16bit。
E:低运算位宽:2bit;高运算位宽:4bit、8bit、16bit。
F:低运算位宽:2bit、4bit;高运算位宽:8bit、16bit。
G:低运算位宽:2bit;高运算位宽:4bit、8bit、16bit。
具体地,如图3所示,以选择器A为例,当所述运算位宽为2bit时,选择器A将固定零位作为所述选择位,即a取值为0。当所述运算位宽为4bit或8bit或16bit时,选择器A将当前选择器(选择器A)所对应的子编码输入值的前一组子编码输入值中处于高位的乘数位作为所述选择位,由于选择器A对应第二组子编码输入值,则前一组子编码输入值即为第一组子编码输入值,即将所述第一组子编码输入值中处于高位的乘数位作为选择位,选择器A输出的选择结果a为Bit1,将Bit1作为选择器A对应一组所述子编码输入值(第二组子编码输入值)的所述选择位,即第二组子编码输入值的选择位为Bit1。
以选择器B为例,当所述运算位宽为2bit或4bit时,即所述运算位宽为选择器B预设的低运算位宽,选择器B将固定零位作为所述选择位,即b取值为0;当所述运算位宽8bit或16bit时,即所述运算位宽为选择器B预设的高运算位宽,选择器B将当前选择器(选择器B)所对应的子编码输入值的前一组子编码输入值中处于高位的乘数位作为所述选择位,由于选择器B对应第三组子编码输入值,则前一组子编码输入值即为第二组子编码输入值,即将所述第二组子编码输入值中处于高位的乘数位作为选择位,选择器B输出的选择结果b为Bit3,将Bit3作为选择器B对应一组所述子编码输入值(第三组子编码输入值)的所述选择位,即第三组子编码输入值的选择位为Bit3。
其他选择器的工作原理相同,此处不再赘述。需要注意的是,上述对选择器的高运算位宽和低运算位宽的设置方式仅为举例说明,由于本实施例中提出的选择器优选用于处理运算位宽为2n的乘法运算,因此对高运算位宽和低运算位宽的设置方式仅举例说明了运算位宽为2n的情况,并不代表本实施例中提出的乘法器仅能处理运算位宽为2n的乘法运算,所述高运算位宽和低运算位宽也可设置为3bit、6bit、15bit等数值。
在本实施例中,由于优选使用booth编码,因此所述编码模块120优选采用一个booth编码模块。所述编码模块根据不同的编码输入值生成不同的编码值具体为根据不同的booth编码输入值生成不同的booth编码值。进一步的,所述booth编码模块,用于根据所述不同的编码输入值生成带不同的固定偏值的不同的booth编码值;其中,所述固定偏值与所述运算位宽相对应。
所述带固定偏值的booth编码主要用于对有符号乘法进行编码,所述固定偏值由乘法器本身的设计决定。本实施例中,根据每个子编码输入值生成的booth编码值的固定偏值为-1。例如,使用本实施例中的乘法器处理8bit乘法,由于需要4个2bit乘法的部分积累加,4组3bit子编码输入值生成的booth编码的偏差各为-1,因此4个booth累积的偏差就为二进制的16`b0101_0101_0000_0000,即十六进制的16`h5500,同理16bit乘法偏差为32`h5555_0000;4bit乘法的偏差为8`h50;2bit乘法的偏差为4`h4。
本实施例的乘法器,其所采用的booth编码模块,与传统的booth编码方式不同,在本实施例中,booth编码模块所产生的编码结果带有一个固定偏值的,这样做的好处就是减少面积,比传统booth编码面积小。
示例性的,如图3所示,所述编码模块120包括多个编码子模块,例如,该编码模块可以包括8个编码子模块,每个编码子模块用于接收并处理一个子编码输入值。在所述编码模块120工作过程中,首先,将所述被乘数根据子编码输入值进行分解,使所述被乘数分解后与所述乘数位相对应,在本实施例中,即为按两位一组对被乘数进行分解,得到多组子被乘数;其次,所述多个编码子模块通过子编码输入值对对应的子被乘数进行并行运算,生成多个第一部分子积;最后,输出多个第一部分子积,即第一部分积。
本实施例的乘法器,通过booth编码值对接收到的被乘数进行乘法运算得到第一部分积,具体为booth编码模块根据所述不同的booth编码值与接收到的被乘数进行运算得到第一部分积,即为多个booth编码子模块通过多个子编码输入值对对应的子被乘数进行并行运算,生产多个第一部分子积,所述第一部分子积的数量与子编码输入值的组数相同且一一对应。
在本实施例中,由于booth编码基数为4,每个子编码输入值为3位,因此,每个子编码输入值为2bit,所述被乘数被分解为每2bit一组的子被乘数,所述每个编码子单元可通过2bit的子编码输入值对对应的2bit的子被乘数进行并行的编码,得到4bit的第一部分子积,多个4bit的第一部分子积共同组成所述第一部分积,即每个所述第一部分子积为2bit乘数和被乘数运算的结果,即每个所述第一部分子积为一个4bit数。
示例性的,如图3所示,所述加法模块130用于根据所述不同的运算位宽将所述第一部分积进行对应次数的累加,生成不同的第二部分积。所述加法模块可为可实现加法功能的模块,在本实施例中,使用Wallace tree加法模块。
具体地,如图3所示,所述加法模块包括多级子加法模块,所述子加法模块的级数根据运算位宽的最大值k来确定,具体为
本实施例中,由于所述运算位宽的最大值k为16bit,即本实施例中的加法模块包括3级子加法模块。如图3所示,所述加法模块130包括一个第一级子加法模块131、一个第二级子加法模块132和一个第三级子加法模块133;其中,所述编码模块120选择性地与所述第一级子加法模块131和所述部分积选择模块140相连;所述第一级子加法模块131选择性地与所述第二级子加法模块132和所述部分积选择模块140相连;所述第二级子加法模块132选择性地与所述第三级子加法模块133和所述部分积选择模块140相连;所述第三级子加法模块133与所述部分积选择模块140相连。
进一步的,所述每个子加法模块130中包括至少一个加法单元,所述加法单元用于具体实现加法运算。所述第一级子加法模块131的加法单元的数量为所述编码子模块的数量的1/2、也即第一部分子积数量的1/2,即所述编码模块120输出的每两个第一部分子积对应输入至第一级子加法模块131中的一个加法单元中,每个所述加法单元对所述每两个第一部分子积做加法运算,并分别输出多个一级第二部分子积,得到一级第二部分积。所述第二级子加法模块132中加法单元的数量为所述第一级子加法模块131加法单元数量的1/2,每个所述加法单元对每两个一级第二部分子积做加法运算,并分别输出多个二级第二部分子积,得到二级第二部分积;所述第三级子加法模块133中加法单元的数量为所述第二级子加法模块132中加法单元数量的1/2,每个所述加法单元对每两个二级第二部分子积做加法运算,并分别输出多个三级第二部分子积,得到三级第二部分积。
在本实施例中,由于所述加法模块使用Wallace tree加法模块,则所述Wallacetree加法模块包括多级Wallace tree子加法模块,每个多级Wallace tree子加法模块包括多个Wallace tree加法单元。如图3所示,所述第一级子加法模块131包括4个加法单元,所述第二级子加法模块132包括2个加法单元,所述第三级子加法模块133包括1个加法单元,所述加法单元为Wallace tree加法单元。
所述多级子加法模块分别选择性的输出多级第二部分积,所述第一级子加法模块131选择性的将输入的第一部分积进行累加,输出一级第二部分积;所述第二级子加法模块132选择性的将输入的一级第二部分积进行累加,输出二级第二部分积;所述第三级子加法模块133选择性的将输入的二级第二部分积进行累加,输出三级第二部分积。在本实施例中,由于所述第一部分积为2bit乘法运算的部分积、即4bit的部分积,则若多级子加法模块分别选择输出多级第二部分积,则所述一级第二部分积为4bit乘法运算的部分积、即8bit的部分积,所述二级第二部分积为8bit乘法运算的部分积、即16bit的部分积,所述三级第二部分积为16bit乘法运算的部分积、即32bit的部分积。
所述编码模块将所述第一部分积输出至部分积选择模块,所述多级子加法模块分别选择性的将所述多级第二部分积输出至部分积选择模块。在本实施例中,即为所述第一级子加法模块选择性的输出一级第二部分积至部分积选择模块,所述第二级子加法模块选择性的输出二级第二部分积至部分积选择模块,所述第三级子加法模块选择性的输出三级第二部分积至部分积选择模块。
所述多级子加法模块选择性的与所述部分积选择模块相连,或者说所述多级加法子模块选择性的输出,指的是多级子加法模块根据运算位宽选择性的输出第二部分积,具体为:当所述运算位宽为所述多级子加法模块的预设的加法位宽时,所述第一级子加法模块与所述编码模块相连,或所述多级子加法模块与上一级子加法模块相连,所述多级子加法模块输出对应的多级第二部分积;否则,所述第一级子加法模块不与所述编码模块相连,或所述多级子加法模块不与上一级子加法模块相连,多级子加法模块不进行输出。所述预设的加法位宽可根据实际使用情况具体设置。
在本实施例中,所述第一级子加法模块的预设的加法位宽为4bit、8bit、16bit,所述第二级子加法模块的预设的加法位宽为8bit、16bit,所述第三级子加法模块的预设的加法位宽为16bit。
若所述运算位宽为2bit,则第一级子加法模块、第二级子加法模块和第三级子加法模块均不与所述部分积选择模块相连、均不输出第二部分积;所述编码模块不与所述第一级子加法模块相连,仅编码模块输出第一部分积至部分积选择模块。
若所述运算位宽为4bit,所述第一级子加法模块不与所述第二级子加法模块相连,所述第二级子加法模块和第三级子加法模块均不与所述部分积选择模块相连,所述第二级子加法模块和所述第三级子加法模块不输出第二部分积;编码模块选择与第一级子加法模块相连,第一级子加法模块选择与所述部分积选择模块相连、输出一级第二部分积。
若所述运算位宽为8bit,所述第二级子加法模块不与所述第三级子加法模块相连,所述第三级子加法模块不与所述部分积选择模块相连、不输出第二部分积;编码模块选择与第一级子加法模块相连,第一级子加法模块选择与所述部分积选择模块相连、输出一级第二部分积;第一级子加法模块选择与第二级子加法模块相连,第二级子加法模块选择与所述部分积选择模块相连、输出二级第二部分积。
若所述运算位宽为16bit,编码模块选择与第一级子加法模块相连,第一级子加法模块选择与所述部分积选择模块相连、输出一级第二部分积;第一级子加法模块选择与第二级子加法模块相连,第二级子加法模块选择与所述部分积选择模块相连、输出二级第二部分积;第二级子加法模块选择与第三级子加法模块相连,第三级子加法模块选择与所述部分积选择模块相连、输出三级第二部分积。
进一步的,所述乘数预处理模块还用于根据接收到的不同符号信息将其接收到的乘数生成不同的编码输入值。所述不同符号信息为有符号或无符号。
若符号信息为乘数有符号和被乘数有符号时,则所述乘法器进行有符号乘数和有符号被乘数的乘法运算,乘数预处理模块将接收到的有符号的乘数生成有符号信息的编码输入值,所述编码模块根据有符号信息的编码输入值生成不同的带固定偏值的编码值,并根据不同的带固定偏值的编码值将接收到的有符号的被乘数进行运算,得到第一部分积。
具体的,所述带固定偏值的booth编码值的生成过程为,将根据有符号信息的booth编码输入值生成的booth编码输入值中的符号位补0,例如,子编码输入值为100,对应生成的booth编码为-2,将-2中的符号位补0,而不是使用负号的1来表述,所述符号位的位宽根据运算位宽来决定。使用这种设计节约硬件资源,降低逻辑延时。此时,所述第一部分积包含输出值和进位值,所述输出值为根据编码值得到的被乘数的一倍数或多倍数,所述进位值为根据编码值得到的第一部分积的符号,即正符号或负符号。本实施例中,所述输出值为根据带固定偏值的booth编码与其接收到的被乘数得到的乘积的非符号位来确定,所述进位值为根据带固定偏值的booth编码与其接收到的被乘数得到的乘积的符号位来确定。
进一步的,所述第二部分积包含输出值和进位值,所述输出值为根据编码值得到的被乘数的一倍数或多倍数,所述进位值为根据第一部分积得到的第二部分积的符号,即正符号或负符号。
若符号信息为乘数有符号和被乘数无符号时,乘法器的工作过程与符号信息为乘数有符号和被乘数有符号时相同,区别仅在于,需要对被乘数进行符号位扩展,具体为根据运算位宽将乘数和被乘数的高位补0,使得所述被乘数与乘数的位宽相同,再进行乘法运算。
若符号信息为乘数无符号和被乘数无符号时,则所述乘法器进行无符号乘数和无符号被乘数的乘法运算,乘数预处理模块将接收到的无符号的乘数生成无符号信息的编码输入值,所述编码模块根据无符号信息的编码输入值生成不同的编码值,并根据不同的编码值将接收到的无符号的被乘数进行运算,得到第一部分积。此外,在进行乘法运算时,将所述乘数和被乘数进行符号位扩展,具体为根据运算位宽将乘数和被乘数的高位补0,得到符号扩展位。
此外,此时所述编码器中还包括符号扩展编码子模块,用于对无符号乘数的符号扩展位进编码并输出符号扩展位编码值,并根据所述符号扩展位编码值对被乘数进行运算。本实施例中,所述扩展编码子模块为booth扩展编码子模块,用于处理的子编码输入值仅为000或001,逻辑很简单,资源占用远小于正常的booth编码器,使用这种方式进行无符号乘法处理,有效节约了硬件资源。
所述部分积选择模块140选择性地从所述第一部分积和所述不同的第二部分积中选择出与所述不同的运算位宽相对应的目标部分积并输出,具体为:所述部分积选择模块根据接收的输出位宽,从所述第一部分积和所述不同的第二部分积中选择出与接收的输出位宽相同的部分积作为目标部分积并输出。所述第二部分积包括多级第二部分积,在本实施例中,即为一级第二部分积、二级第二部分积和三级第二部分积。
进一步的,所述部分积选择模块140包括第一部分积选择子模块和第二部分积选择子模块;所述第一部分积选择子模块用于选择性地从所述第一部分积输出值和所述不同的第二部分积输出值中选择出与所述不同的输出位宽相对应的部分积输出值作为目标部分积输出值并输出;所述第二部分积选择子模块用于选择性地从所述第一部分积进位值和所述不同的第二部分积进位值中选择出与所述不同的输出位宽相对应的部分积进位值作为目标部分积进位值并输出。如图3所示,本实施例中,第一部分积选择子模块和第二部分积选择子模块使用了MUX选择器。
结合图3可知,本实施例中提出的乘法器中乘数预处理模块中有7个选择器。编码模块采用booth编码实现乘法运算,booth编码基数为4。加法模块采用Wallace tree实现加法预算,具有三级子加法模块,第一级子加法模块具有4个Wallace tree加法单元,第二级子加法模块具有2个Wallace tree加法单元,第三级子加法模块具有1个Wallace tree加法单元。部分积选择模块使用2个MUX选择器分别对第一部分积和不同的第二部分积的输出值和进位值进行选择。
使用本实施例中提出的乘法器进行1个16bit的乘法运算,即选择运算位宽为16bit,乘数和被乘数均为16bit数,所述编码基数为4,所述编码输入值每3位为一组,共分为8组。
所述乘数的16bit分别输入图3中编码输入值中的乘数位Bit0-Bit15,即8组编码子输入值中的两个乘数位中,完成编码输入值中乘数位的赋值;所述第一组子编码输入值的最低位为固定0位,所述A-G七个选择器根据运算位宽16bit分别进行选择判断,由于所述运算位宽16bit为七个选择器预设的高运算位宽,因此七个选择器均输出所述选择器所对应的子编码输入值的前一组子编码输入值中处于高位的乘数位作为所述选择位,即七个选择器分别输出Bit1、Bit3、Bit5、Bit7、Bit9、Bit11、Bit13作为第二个子输入值至第八组子编码输入值中的选择位,完成编码输入值中选择位的赋值;完成了乘数位和选择位的赋值,即生成了包含8组子编码输入值的编码输入值,8组子编码输入值由高位至低位具体为:
第一组为:{bit1,bit0,0};
第二组为{bit3,bit2,a},其中a为第A个选择器产生的值,若为2bit位宽乘法,则A=0,若为4/8/16bit位宽乘法,则A=bit1;由于运算位宽为16bit,因此A=bit1。
第三组为{bit5,bit4,b},其中b为第B个选择器产生的值,若为2/4bit位宽乘法,则B=0,若为8/16bit位宽乘法,则B=bit3;由于运算位宽为16bit,因此B=bit3。
第四组为{bit7,bit6,c},其中c为第C个选择器产生的值,若为2bit位宽乘法,则C=0,若为4/8/16bit位宽乘法,则C=bit5;由于运算位宽为16bit,因此C=bit5。
第五组为{bit9,bit8,d},其中d为第D个选择器产生的值,若为2/4/8bit位宽乘法,则D=0,若为16bit位宽乘法,则D=bit7;由于运算位宽为16bit,因此D=bit7。
第六组为{bit11,bit10,e},其中e为第E个选择器产生的值,若为2bit位宽乘法,则E=0,若为4/8/16bit位宽乘法,则E=bit9;由于运算位宽为16bit,因此E=bit9。
第七组为{bit13,bit12,f},其中f为第F个选择器产生的值,若为2/4bit位宽乘法,则F=0,若为8/16bit位宽乘法,则F=bit11;由于运算位宽为16bit,因此F=bit11。
第八组为{bit15,bit14,g},其中g为第G个选择器产生的值,若为2bit位宽乘法,则G=0,若为4/8/16bit位宽乘法,则G=bit13。由于运算位宽为16bit,因此G=bit3。
所述编码输入值输入至编码模块,首先将被乘数根据子编码输入值进行分解,使所述被乘数分解后与所述乘数位相对应,如图3所示,即为按两位一组对被乘数进行分解,得到多组子被乘数,本实施例中实际得到8组子被乘数,图3中仅为示例性说明;通过子编码输入值对对应的子被乘数进行并行乘法运算,生成8个第一部分子积;输出8个第一部分子积,每个第一部分子积为2bit乘数和2bit被乘数进行乘法运算得到的4bit部分积,8个第一部分子积即为第一部分积。
由于所述运算位宽16bit为所述第一级子加法模块的预设的加法位宽,因此所述编码模块与所述第一级子加法模块相连接,第一级子加法模块与所述部分积选择模块相连接,所述第一部分积输入至第一级子加法模块中,第一级子加法模块中的4个Wallace tree加法单元分别对8个第一部分子积进行两两加法运算,输出包含4组4bit加法的结果,即4组8bit部分积,即为一级第二部分积。
由于所述运算位宽16bit为所述第二级子加法模块的预设的加法位宽,因此所述第一级子加法模块与所述第二级子加法模块相连接,第二级子加法模块与所述部分积选择模块相连接,所述一级第二部分积输入至第二级子加法模块中,第二级子加法模块中的2个Wallace tree加法单元分别对一级第二部分积中的4组8bit部分积进行两两加法运算,输出包含2组8bit加法的结果,即2组16bit部分积,即为二级第二部分积。
由于所述运算位宽16bit为所述第三级子加法模块的预设的加法位宽,因此所述第二级子加法模块与所述第三级子加法模块相连接,第三级子加法模块与所述部分积选择模块相连接,所述二级第二部分积输入至第三级子加法模块中,第三级子加法模块中的1个Wallace tree加法单元分别对二级第二部分积中的2组16bit部分积进行两两加法运算,输出包含1组16bit加法的结果,即1组32bit部分积,即为三级第二部分积。
所述编码模块输出2bit乘法结果、4bit部分积至所述部分积选择模块,所述第一级子加法模块输出4bit乘法结果、8bit部分积至所述部分积选择模块,所述第二级子加法模块输出8bit乘法结果、16bit部分积至所述部分积选择模块,所述第三级子加法模块输出16bit乘法结果、32bit部分积至所述部分积选择模块。
所述部分积选择模块根据通过位宽选择模块选择的输出位宽,从第一部分积和多个第二部分积中选择与输出位宽相同的部分积作为目标部分积并输出,即为从4bit部分积、8bit部分积、16bit部分积、32bit部分积中选择与输出位宽相同的部分积作为目标部分积并输出。若输出位宽为2bit,则选择2bit部分积作为目标部分积并输出;若输出位宽为4bit,则选择4bit部分积作为目标部分积并输出;若输出位宽为8bit,则选择8bit部分积作为目标部分积并输出;若输出位宽为16bit,则选择16bit部分积作为目标部分积并输出;若输出位宽为32bit,则选择32bit部分积作为目标部分积并输出。
本实施例中提出的乘法器,支持同时计算8组2bit×2bit运算,其每组结果为4bit数据,支持同时计算4组4bit×4bit运算,其每组结果为8bit数据,支持同时计算2组8bit×8bit运算,其每组结果为16bit数据,支持同时计算1组16bit×16bit运算,其每组结果为32bit数据。以上也可以发现,乘数为16bit,被乘数为16bit,两个部分积各为32bit,无论采用哪种位宽,硬件上输入、输出的端口都是兼容的。此外,在以上数据位宽的基础上,还支持符号位的选择,即支持乘数为有符号数,被乘数为有符号数;支持乘数为无符号数,被乘数为有符号数;支持乘数为无符号数,被乘数为无符号数。
综上,本实施例中提出的乘法器实现了对不同位宽乘法的运算,并输出不同位宽的乘法目标部分积。
下面,根据图4描述本公开另一实施例的乘法运算方法,该乘法运算方法可以采用前文记载的乘法器实现,具体可以参考前文相关记载,在此不作赘述。
如图4所示,一种乘法运算方法,包括:
S1:根据不同的运算位宽将接收到的乘数生成不同的编码输入值;
S2:根据不同的编码输入值生成不同的编码值,并根据所述不同的编码值与接收到的被乘数进行运算得到第一部分积;
S3:根据所述不同的运算位宽将所述第一部分积进行对应次数的并行累加,生成不同的第二部分积;
S4:根据接收到的输出位宽选择性地从所述第一部分积和所述不同的第二部分积中选择出对应的部分积作为目标部分积并输出。
进一步的,在步骤S1之前,还包括步骤S0:
S0:选择位宽模式,具体为选择运算位宽和选择输出位宽,所述输出位宽小于等于运算位宽。此外,步骤S0中,所述选择位宽模式还包括选择符号信息。
步骤S1中,所述乘数预处理模块110根据不同的运算位宽将接收到的乘数生成不同的编码输入值,具体为根据所述不同的运算位宽和预设的编码基数,将接收到的所述乘数生成依序放置的多组子编码输入值,第一组所述子编码输入值包括固定零位和乘数位,其余组所述子编码输入值包括选择位和乘数位;根据所述乘数确定每组子编码输入值的乘数位;根据所述运算位宽确定每组子编码输入值的选择位。
所述步骤S1具体包括:
S11:根据所述运算位宽m和预设的编码基数n将编码输入值分解为多个子编码输入值,具体为以n-1的位数为一组、将编码输入值进行分组,所述编码输入值共包括m/(n-2)组子编码输入值。此外,第一组子编码输入值包括固定零位和乘数位,其余组所述子编码输入值包括选择位和乘数位。
S12:根据所述乘数确定每组子编码输入值的乘数位,具体为:
根据所述子编码输入值的位数将所述乘数依序放置入每组子编码输入值中的乘数位中,所述依序放置具体为从低位到高位依序方式。
S13:根据所述运算位宽确定每组子编码输入值的选择位,即固定零位和选择位,固定零位值为0,根据所述不同的运算位宽生成对应一组所述子编码输入值的所述选择位,具体为:
当所述运算位宽为一个预设的高运算位宽时,根据所述高运算位宽,将前一组子编码输入值中处于高位的乘数位作为对应一组所述子编码输入值的所述选择位;
当所述运算位宽为一个预设的低运算位宽时,根据所述低运算位宽,将固定零位作为对应一组所述子编码输入值的所述选择位。
步骤S2中,所述编码模块120根据不同的编码输入值生成不同的编码值,本实施例中,所述编码模块120使用一个booth编码模块,即根据所述不同的编码输入值生成带不同的固定偏值的不同的booth编码值;其中,所述固定偏值与所述运算位宽相对应。
步骤S2中,所述据所述不同的编码值与接收到的被乘数进行运算得到第一部分积,具体为:将所述被乘数根据子编码输入值进行分解,使所述被乘数分解后与所述乘数位相对应,在本实施例中,即为按两位一组对被乘数进行分解,得到多组子被乘数;通过子编码输入值对对应的子被乘数进行并行乘法运算,生成多个第一部分子积;根据多个第一部分子积得到第一部分积。所述第一部分子积的数量与子编码输入值的组数相同且一一对应。
步骤S3中,所述加法模块130根据所述不同的运算位宽将所述第一部分积进行对应次数的并行累加,生成不同的第二部分积,具体为:判断所述运算位宽是否与多级预设的加法位宽相同,若相同,则执行当前级累加运算,得到当前级第二部分积;否则,则不执行累加运算。在执行当前级累加运算时,具体为并行的执行多次累加运算,即为将每两个第一部分子积进行累加或为将每两个多级第二部分子积进行累加。本实施例中,所述多级第二部分子积包括一级第二部分子积、二级第二部分子积和三级第二部分子积。在本实施例中,所述累加使用Wallace tree方法进行。
步骤S4中,所述部分积选择模块140选择性地从所述第一部分积和所述不同的第二部分积中选择出对应的部分积作为目标部分积并输出,具体为:所述部分积选择模块根据接收的输出位宽,从所述第一部分积和所述不同的第二部分积中选择出与接收的输出位宽相同的部分积作为目标部分积并输出。所述第二部分积包括多级第二部分积,在本实施例中,即为一级第二部分积、二级第二部分积和三级第二部分积。
下面,参考图5描述本公开另一实施例的运算装置。
如图5所示,所述运算装置包括实施1中公开的乘法器,还包括目标部分积累加器和固定偏值修正器;
所述目标部分积累加器用于将所述乘法器输出的目标部分积进行累加运算,生成带固定偏值的乘法结果;
所述固定偏值修正器用于修正带固定偏值的乘法结果的固定偏值,得到乘法结果。
进一步的,本实施例中还公开一种运算芯片,所述芯片使用前文记载的乘法器。
进一步的,本实施例中还公开一种电子设备,包括:一个或多个处理器;一个存储单元,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行时,能使得所述一个或多个处理器实现前文记载的乘法运算方法。
此外,本公开实施例还提供一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时能实现根据前文记载的乘法运算方法,乘法运算方法具体可以参考前文相关记载。
其中,计算机可读介质可以是本公开的装置、设备、系统中所包含的,也可以是单独存在。
其中,计算机可读存储介质可是任何包含或存储程序的有形介质,其可以是电、磁、光、电磁、红外线、半导体的系统、装置、设备,更具体的例子包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、光纤、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件,或它们任意合适的组合。
其中,计算机可读存储介质也可包括在基带中或作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码,其具体的例子包括但不限于电磁信号、光信号,或它们任意合适的组合。
可以理解的是,以上实施方式仅仅是为了说明本公开的原理而采用的示例性实施方式,然而本公开并不局限于此。对于本领域内的普通技术人员而言,在不脱离本公开的精神和实质的情况下,可以做出各种变型和改进,这些变型和改进也视为本公开的保护范围。