本文书接上文,来讨论如何具体地针对 SM3 算法的特点,优化计算架构,如通过 CSA 加法器来优化加法关键路径等方法,提升系统频率,提高系统吞吐性能。
SM3 中的运算
在分析关键关键路径之前,首先分析 SM3 算法中涉及的运算。SM3 运算量集中在消息压缩模块中。从下图中的运算列表可以发现,主要的运算包括:循环移位(<<< 表示循环移位),异或以及加法。
所有运算中,循环移位运算开销最小,在硬件上实现为两级触发器间的交换连线位置。
reg [2:0] A; reg [2:0] B;
B <= { A[1:0] , A[2] };
异或运算通过 LUT 布尔函数实现,开销小且固定,具体速度与使用的器件等级相关。以 Xilinx 的架构为例,UltraScale+ 器件的 LUT 延迟比 7 系列器件低一半以上。下图为一个双输入 LUT,实现异或运算的真值表。
加法运算的时间开销最大,加法运算可以划分为全加运算和进位。加法器中每一位都是一个全加器( Full Adder )。全加器本质上还是一个布尔逻辑运算,分别计算和 S 以及进位 C,在 FPGA 中照例是映射在 LUT 上实现,开销小且固定。
S = (A ^ B) ^ X
C = (A ^ B)X + XY = AB + AX + AY
加法器的主要延迟在于从最低位开始,直至最高位的逐位进位逻辑。以普通的行波进位加法器 ( Ripple Carry Adder) 为例,下图是一个4bit 行波进位器:
运算结果 S 输出需要等待从输入进位 Cin 开始直到进位到 C3 ,经过 3 个全加器这么长的路径后,才可以到最后一个全加器进行最后一次加法运算后输出,关键路径为从 Cin 经过 4 个全加器到达 Cout 。我们可以得到此次加法运算的延迟:
Tdelay = 4 * Tcarry + Tsum ≈ N * Tcarry (N 位加法器)