一、搞要
Montgomery大整数乘法 在fpga中实现资源占用高,特别是DSP资源,而且一个算法包含好多个Montgomery大整数乘法,fpga中的dsp资源总是很快就耗尽。本文讲述了如何改进算法,减少dsp使用量,并优化逻辑,提高实现的最终频率。
二、原理简述
2.1、蒙哥马利(Montgomery)模乘算法
Montgomery乘法是一种用于加速模运算的算法,其数学表达式为,其中A和B是与M同位长的大数,R是
(M为位长),
是R相对于M的模逆,即满足
。这种算法特别适用于对奇数求模的情况,因为它通过使用蒙哥马利表示法,可以在计算过程中避免直接的除法运算,从而提高计算效率。Montgomery乘法通常用于加密算法中,如椭圆曲线密码学,以加速模乘和模逆运算
下面涉汲到的Montgomery模乘算法都是指密码学中的大整数模乘算法,所谓的大整数得指位数达几百位的大数,例如256位的大整数。
2.2、在fpga中如何实现Montgomery模乘法算法
公式推导及数学原理本文不再详述。我这里就直接给出算法的实现公式。因在fpga要实现除法,耗资源,速度也慢,因而要把模乘中的除法转换成模域中的乘法,如何转换不是本文的重点。现直接给出Montgomery乘法公式。下面讲述的模乘运算基于Bn128曲线的模及模逆
模P:P=256'h73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
模逆Q:Q=256'h3d443ab0d7bf2839181b2c170004ec0653ba5bfffffe5bfdfffffffeffffffff
Montgomery模乘算法 C=A*B mod P在FPGA中分以下4步计算(公式推导不再详述):
1、计算中间值Ma=A*B;
2、计算中间值Mb=Ma*Q;
3、计算中间值Mc=Mb*P;
4、计算结果C=(Ma+Mc)modP;
Montgomery模乘算法完美的去除了除法,只剩下3个大整数乘法和一个大整数模加,完全可以在fpga中实现全流水线计算。
然而要实现这3个大整数乘法,单个模乘就要要消耗200多个DSP48资源,因而想办法改进算法,还是要进一步减少DSP48资源的使用量。
三、Montgomery模乘算法在fpga中优化方法
Montgomery模乘算法中的模加完全是用fpga中逻辑资源实现,在这里不再详细讲述优化方法。
三个大正数乘法的在算法方面优化改进方法如下:
1、采用karatsuba乘法减少乘法次数;
2、采用CSD编码乘法器算法把乘法改用加法减法逻辑实现;
3、当A=B时,可以进行单独优化,减少逻辑资源的使用;
4、当B=常数时,也可以进一优化,
光采用karatsuba乘法优化,要实现三个大整数乘法要消耗DSP48资源210个左右,当采用前两种方法时,即采用karatsuba乘法+CSD编码乘法,则可以降低到180个DSP48资源左右。
注意:以上数据都是基于xilinx fpga Virtex ultraScale+ VU19P上综合结果。
四、karatsuba乘法原理
Karatsuba乘法是一种快速的大数乘法算法,它的原理是利用分治法将两个大数相乘。
设要计算的两个大数为A和B,分别表示为和
,其中a、b、c、d是相应位数的小数。根据乘法的分配律,可以将A * B表示为:
在上式中,a * c、b * d和(a * d + b * c)是三个乘法运算,其中(a * d + b * c)是两个小数相乘,需要计算两次。为了减少乘法的次数,Karatsuba乘法采用如下的递归思想:
- 将A和B都分成两部分:
,
- 计算a * c,b * d和(a * d + b * c)
- 通过减少两次大数乘法的次数来计算A * B:
- 计算a * c的乘积,记为P1
- 计算b * d的乘积,记为P2
- 计算(a * d + b * c)的乘积,记为P3
- 计算
通过递归地应用这个过程,可以快速计算出大数的乘积。
Karatsuba乘法的关键思想是通过分解大数,减少乘法的次数。相较于传统的乘法算法,它具有更高的效率。然而,在实际应用中,Karatsuba乘法的效率在乘数长度较小时可能并不明显,因此通常在处理大数乘法时使用。
// 输入:n位长度的正整数x和y
// 输出:x*y的结果
函数 karatsuba (x, y) {
a和b为x的前半部分和后半部分;
c和d是y的前半部分和后半部分;
递归调用函数karatsuba解决q=a*c, 递归karatsuba解决p=b*d,递归karatsuba解决k=(a+b)(c+d)
返回10的n次方*q + 10的n/2次方 * (k - q - p) + p
}
4.1、karatsuba算法实现的verilogHDL代码分为三级嵌套
256位乘法器分为256位,128位,64位等三级嵌套。如下图
y_mult_64:64位乘法器采用karatsuba算法实现的代码;
y_mult_128:128位乘法器,它包含三个y_mult_64模块;
y_mult_256:256位乘法器,它包含三个y_mult_128模块。
所以一个256位乘法器包含了3*3=9个64位乘法器。
4.2、 64位大整数乘法采用karatsuba算法实现的verilogHDL代码
64位大整数乘法,采用karatsuba算法在Xilinx fpga Virtex ultraScale+ VU19P 上的实现的最后一级64位乘法代码如下:
//
// Company: 杭州幻智星科技有限公司
// Engineer: 俞工
// email: yupc123@qq.com
// Create Date: 01/25/2021 03:45:32 PM
// Design Name: Karatsuba 64位乘法器
// Module Name: y_mult_64
// Revision 0.01
//
module y_mult_64#(
parameter AB_WIDTH = 64,
parameter DSP_STEP = 6,
parameter RESULT_WIDTH = AB_WIDTH*2
)(
input clk,
input [AB_WIDTH-1:0] a,
input [AB_WIDTH-1:0] b,
output reg [RESULT_WIDTH-1:0]