(1)题目详见:有限域GF(2^128)GHASH校验值运算模块说明
(2)实现原理参考的是:有限域GF(2^8)内乘法代码实现以及原理
(3)python验证:有限域GF(2^128)GHASH校验值运算模块——Python验证有限域乘法正确性
(4)仿真结果:有限域GF(2^128)GHASH校验值运算模块——Verilog仿真
这里没有全部按照题目的要求实现算法,而是参照上面超链接(2)中GF(2^8)的实现方式,也就是把乘数B依次左移,然后根据A的每一位的值进行异或。
并行方面,本来想按照题目时序要求的:GHASH 模块每个分组的运算周期数8拍以内,也就是有限域乘法step3的128次循环,加上外面和 Y i Y_i Yi的异或过程保持在8个时钟周期以内。这样的话,就设计成有限域乘法一拍计算step3中32次循环的结果,最少4拍就可以实现。
step3: for i=0到127, Z i + 1 Z_{i+1} Zi+1和 V i + 1 V_{i+1} Vi+1的计算过程如下,其中>>表示右移操作,高位补0;
但是无奈水平有限,自己只想到一种暴力解决的方法,一拍计算循环32次的结果代码又臭又长,实在太丑了,所以选择了模块在一拍内计算16次循环的结果,这样计算一次有限域乘法需要8个时钟周期。方式就是按照(2)中的矩阵乘法的形式。
具体实现:
首先用组合逻辑实现有限域乘法循环,可以看成一个矩阵乘法,直接用python实现:16次step3循环后 V i V_i Vi[127:0]的结果和 Z i Z_i Zi[127:0]的结果,是一个组合逻辑,这样重复进行8次,就可以得到128次循环后 V 128 V_{128} V128[127:0]和 Z 128 Z_{128} Z