CN101650644B - 一种伽罗华域乘法器实现装置 - Google Patents

一种伽罗华域乘法器实现装置 Download PDF

Info

Publication number
CN101650644B
CN101650644B CN2009100817685A CN200910081768A CN101650644B CN 101650644 B CN101650644 B CN 101650644B CN 2009100817685 A CN2009100817685 A CN 2009100817685A CN 200910081768 A CN200910081768 A CN 200910081768A CN 101650644 B CN101650644 B CN 101650644B
Authority
CN
China
Prior art keywords
dinb1
dina1
mult
matrix
binary
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CN2009100817685A
Other languages
English (en)
Other versions
CN101650644A (zh
Inventor
寿国础
胡怡红
宁帆
郭志刚
霍甲
屈善新
陆阳
高泽华
钱宗珏
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing University of Posts and Telecommunications
Original Assignee
Beijing University of Posts and Telecommunications
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing University of Posts and Telecommunications filed Critical Beijing University of Posts and Telecommunications
Priority to CN2009100817685A priority Critical patent/CN101650644B/zh
Publication of CN101650644A publication Critical patent/CN101650644A/zh
Application granted granted Critical
Publication of CN101650644B publication Critical patent/CN101650644B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Error Detection And Correction (AREA)

Abstract

本发明公开了一种伽罗华域乘法器实现装置。本装置将伽罗华域乘法的计算转化为矩阵模块相乘,具体包括一个L矩阵模块,一个U矩阵模块,m位数据输入输出接口,以及Q矩阵生成模块等,其结构涉及3m-1组二元与门树和一组二元异或门树。本发明在具体施例部分给出了一种当m=128时,基于FPGA来实现伽罗华域GF(2128)乘法器的例子。这种乘法器可以用来硬件实现G-hash函数,并可达到10Gbps以上的计算速度。

Description

一种伽罗华域乘法器实现装置
技术领域
本发明涉及一种伽罗华域乘法器实现装置,属于信息安全技术领域,具体来说是一种基于可约多项式形式为P(x)=xm+xkt+……+xk2+xk1+1,其中1≤k1<k2<…<kt≤m/2的m位伽罗华域乘法器装置。
背景技术
有限域乘法是目前密码学领域用到较多的运算,很多加密认证算法都要利用有限域乘法。伽罗华域是一种重要的有限域,一个伽罗华域的运算是指在特定的规则下进行的两类运算:加法和乘法。其中,伽罗华域GF(2)上仅包含两个元素0和1,加法运算很容易利用一个异或门来实现,而其乘法利用一个与门也可以轻易实现。特别地,当伽罗华域运算扩展到m位,且m很大时,计算的实现就变得异常复杂,硬件实现也变得很不理想。以前伽罗华域乘法器多采用通用处理器来实现,但是由于内部结构的限制,对高数据量的计算有很大限制,无法获得很高的计算性能。
目前针对有限域及伽罗华域乘法算法的研究有一些成果,特别是一些针对通用多项式的算法优化也有很多,例如专利“基于FPGA的有限域乘法器的优化设计方法”(专利号:200510041816.X),提出了一种通用多项式结构下的优化算法。然而目前的算法以及优化方法实现起来复杂度比较大,并且也达不到很高的计算速度。
本发明主要从算法的易于实现和提高硬件处理速度的角度,针对可约多项式满足P(x)=xm+xkt+……+xk2+xk1+1,其中1≤k1<k2<…<kt≤m/2的情况,提出了一种易于硬件高速实现的伽罗华域乘法器物理逻辑结构,并根据这种物理逻辑结构给出了一种适用于G-hash函数的伽罗华域乘法器FPGA具体实现,其可约多项式为P(x)=x128+x7+x2+x+1,最终实现的吞吐量可高达10Gbps以上。
发明内容
本发明提出了一种伽罗华域乘法器实现装置,主要包括:
m个m位移位寄存器单元,用于生成m×m的L矩阵;
m-1个m位移位寄存器单元,用于生成(m-1)×m的U矩阵;
2m-1组二元与门树,每组二元与门树是由2m个与门单元组成的二叉树形结构,用来处理计算两个m位元素乘法;
m组二元与门树,每组二元与门树是由2m-3个与门单元组成的二叉树形结构,用来处理计算两个m-1位元素乘法;
一组二元异或门树,是由2m-1个异或门单元组成的二叉树形结构,用来处理计算两个m位元素加法;
数据输入输出接口,提供两个m位元素输入接口以及一个m位元素输出接口,用于m位乘数和m位被乘数的输入以及结果元素的输出。
一个基于可约多项式P(x)=xm+xkt+……+xk2+xk1+1,其中1≤k1<k2<…<kt≤m/2构造的Q矩阵生成模块。
所述的两组m位移位寄存器阵列并行的产生数据,提高了运算速度。
所述的二元与门树是由log2m级与门树结构组成。
所述的二元异或门树是由log2m级与门树结构组成。
所述的Q矩阵生成模块是由一个(m-1)×m位的寄存器单元来存放矩阵数据,经矩阵转置后可以并行输出m个m-1位元素传送给二元与门树来计算中间结果。
所述的伽罗华域乘法器计算过程包括以下步骤:
步骤A:将输入的数据元素A并行送入L矩阵模块经过循环移位后与送进来的数据元素B经过二元与门树。
步骤B:将输入的数据元素A并行送入U矩阵模块经过循环移位后与送进来的数据元素B经过二元与门树,此步骤与步骤A在时序上是同时的。
步骤C:将U运算的结果,一个m-1位数据元素与Q矩阵生成模块输出的m个m-1位元素经过二元与门树。
步骤D:步骤C得到的结果与步骤A,L运算的结果经过二元异或门树,得到最终结果C并予以输出。
附图说明
图1是伽罗华域乘法器装置内部逻辑结构示意框图。
图2是二元与门树,二元异或门树的实现结构图。
图3是伽罗华域乘法器的计算过程示意图。
图4是当m=128时Q矩阵生成模块内部结构示意图。
具体实施方式
下面结合附图1对本发明进行详细说明。
第一步,对可约多项式形式为P(x)=xm+xkt+……+xk2+xk1+1,并且满足1≤k1<k2<…<kt≤m/2的情况,根据以下算法计算出Q矩阵:
Q矩阵的第0行有t+1个1,1的分布分别在0,k1,k2,…,kt列。
Q矩阵的第1行至m-kt-1行由第0行依次右移位得到。
Q矩阵的第m-kt至m-2行的构造规则如下:
当i行最后一列以1结尾时,i+1行向右移一位并与第0行的值进行异或运算;
当i行最后一列以0结尾时,i+1行向右移一位。
经过上面的算法可以得到Q矩阵。通过Q矩阵可以构建Q矩阵生成模块,Q矩阵生成模块是由一组(m-1)×m的矩阵寄存器来提供Q矩阵数据输出,每一个寄存器提供一个m位的二元数据,每一个二元数据是根据Q矩阵赋值的,经矩阵转置后可以并行输出m个m-1位元素传送给二元与门树来计算中间结果。
第二步,如附图1所示,构造m个移位寄存器单元,每个寄存器生成并存储m位数据元素,m个移位寄存器单元并行产生m个m位数据元素,用于生成m×m的L矩阵。
构造m-1个移位寄存器单元,每个寄存器生成并存储m位数据元素,m-1个移位寄存器单位并行产生m-1个m位数据元素,用于生成(m-1)×m的U矩阵。
第三步,如附图1所示,构造2m-1组二元与门树,每组二元与门树是由2m个与门单元组成的二叉树形结构,用来处理计算两个m位元素乘法;构造m组二元与门树,每组二元与门树是由2m-3个与门单元组成的二叉树形结构,用来处理计算两个m-1位元素乘法;最后构造1组二元异或门树,是由2m-1个异或门单元组成的二叉树形结构,用来处理计算两个m位元素加法。
最后,构造数据输入输出接口,提供两个m位元素输入接口以及一个m位元素输出接口,用于m位乘数和m位被乘数的输入以及结果元素的输出。
本发明伽罗华域乘法器的计算过程示意图如附图3所示,当复位信号到来时,乘法器开始接收两个m比特的数据A,B,数据元素A经过L矩阵模块和U矩阵模块并行产生中间数据元素L,U。
U的结果经过和Q矩阵生成模块产生的m个m-1位二元比特元素进入二元与门树处理,运算得到中间结果,得到的结果和L矩阵模块输出的结果经过二元异或门树计算,即元素相加得到最终结果C。
施例1可约多项式为P(x)=x128+x7+x2+x+1,是一种符合G-hash函数的伽罗华域乘法器可约多项式。
依据具体实现方式可以得到如下实现:
第一步,对可约多项式形式为P(x)=x128+x7+x2+x+1,根据如下算法计算出Q矩阵:
Q矩阵的第0行有4个1,1的分布分别在0,1,2,7列。
Q矩阵的第1行至120行由第0行依次右移位得到。
Q矩阵的第121至126行的构造规则如下:
当i行最后一列以1结尾时,i+1行向右移一位并与第0行的值进行异或运算;
当i行最后一列以0结尾时,i+1行向右移一位。
经过上面的算法可以得到Q矩阵,通过Q矩阵可以构建Q矩阵生成模块,是由一组127×128的矩阵寄存器来提供Q矩阵数据输出。如附图4所示,每一个寄存器提供一个128位的二元数据,每一个二元数据是根据Q矩阵赋值的。最后得到Q矩阵为:
经矩阵转置后可以并行输出128个127位元素传送给二元与门树来计算中间结果。
第二步,如附图1所示,构造128个移位寄存器单元,每个寄存器生成并存储128位数据元素,128个移位寄存器单元并行产生128个128位数据元素,用于生成128×128的L矩阵;
构造127个移位寄存器单元,每个寄存器生成并存储128位数据元素,127个移位寄存器单元并行产生127个128位数据元素,用于生成127×128的U矩阵。
第三步,如附图1所示,构造255组二元与门树,每组二元与门树是由256个与门单元组成的二叉树形结构,用来处理计算两个128位元素乘法;构造128组二元与门树,每组二元与门树是由253个与门单元组成的二叉树形结构,用来处理计算两个127位元素乘法;最后构造1组二元异或门树,是由255个异或门单元组成的二叉树形结构,用来处理计算两个128位元素加法。
最后,构造数据输入输出接口,提供两个128位元素输入接口以及一个128位元素输出接口,用于128位乘数和128位被乘数的输入以及结果元素的输出。
下面根据本发明的物理逻辑结构给出了伽罗华域GF(2128)乘法器基于FPGA的Verilog HDL描述如下:
module mul_128(
                clk,
                rst,
                dina,
                dinb,
                en,
                dout,
                ready_o
            );
        input  clk;
        input  rst;
        input  en;
input    [0:127]dina;
input    [0:127]dinb;
output   [0:127]dout;
output   ready_o;
reg      [0:127]dout;
reg      ready_o;
reg      [0:127]dout_reg;
reg      ready_o_reg;
reg      [0:127]L[0:127];
reg      [0:127]U[0:126];
reg      [0:127]M;
reg      [0:127]N;
reg      [0:127]N_reg;
reg      [0:127]dina1;
reg      [0:127]dinb1;
always(dina or dinb)
    begin
        dina1=dina;
        dinb1=dinb;
        L[127]=dina1;
        L[126]=dina1>>1;
        L[125]=dina1>>2;
        L[124]=dina1>>3;
        L[123]=dina1>>4;
        L[122]=dina1>>5;
        L[121]=dina1>>6;
        L[120]=dina1>>7;
        L[119]=dina1>>8;
        L[118]=dina1>>9;
        L[1]7]=dina1>>10;
        L[116]=dina1>>11;
        L[115]=dina1>>12;
        L[114]=dina1>>13;
        L[113]=dina1>>14;
        L[112]=dina1>>15;
        L[111]=dina1>>16;
        L[110]=dina1>>17;
        L[109]=dina1>>18;
        L[108]=dina1>>19;
        L[107]=dina1>>20;
        L[106]=dina1>>21;
        L[105]=dina1>>22;
L[104]=dina1>>23;
L[103]=dina1>>24;
L[102]=dina1>>25;
L[101]=dina1>>26;
L[100]=dina1>>27;
L[99]=dina1>>28;
L[98]=dina1>>29;
L[97]=dina1>>30;
L[96]=dina1>>31;
L[95]=dina1>>32;
L[94]=dina1>>33;
L[93]=dina1>>34;
L[92]=dina1>>35;
L[91]=dina1>>36;
L[90]=dina1>>37;
L[89]=dina1>>38;
L[88]=dina1>>39;
L[87]=dina1>>40;
L[86]=dina1>>41;
L[85]=dina1>>42;
L[84]=dina1>>43;
L[83]=dina1>>44;
L[82]=dina1>>45;
L[81]=dina1>>46;
L[80]=dina1>>47;
L[79]=dina1>>48;
L[78]=dina1>>49;
L[77]=dina1>>50;
L[76]=dina1>>51;
L[75]=dina1>>52;
L[74]=dina1>>53;
L[73]=dina1>>54;
L[72]=dina1>>55;
L[71]=dina1>>56;
L[70]=dina1>>57;
L[69]=dina1>>58;
L[68]=dina1>>59;
L[67]=dina1>>60;
L[66]=dina1>>61;
L[65]=dina1>>62;
L[64]=dina1>>63;
L[63]=dina1>>64;
L[62]=dina1>>65;
L[61]=dina1>>66;
L[60]=dina1>>67;
L[59]=dina1>>68;
L[58]=dina1>>69;
L[57]=dina1>>70;
L[56]=dina1>>71;
L[55]=dina1>>72;
L[54]=dina1>>73;
L[53]=dina1>>74;
L[52]=dina1>>75;
L[51]=dina1>>76;
L[50]=dina1>>77;
L[49]=dina1>>78;
L[48]=dina1>>79;
L[47]=dina1>>80;
L[46]=dina1>>81;
L[45]=dina1>>82;
L[44]=dina1>>83;
L[43]=dina1>>84;
L[42]=dina1>>85;
L[41]=dina1>>86;
L[40]=dina1>>87;
L[39]=dina1>>88;
L[38]=dina1>>89;
L[37]=dina1>>90;
L[36]=dina1>>91;
L[35]=dina1>>92;
L[34]=dina1>>93;
L[33]=dina1>>94;
L[32]=dina1>>95;
L[31]=dina1>>96;
L[30]=dina1>>97;
L[29]=dina1>>98;
L[28]=dina1>>99;
L[27]=dina1>>100;
L[26]=dina1>>101;
L[25]=dina1>>102;
L[24]=dina1>>103;
L[23]=dina1>>104;
L[22]=dina1>>105;
L[21]=dina1>>106;
L[20]=dina1>>107;
L[19]=dina1>>108;
L[18]=dina1>>109;
L[17]=dina1>>110;
L[16]=dina1>>111;
L[15]=dina1>>112;
L[14]=dina1>>113;
L[13]=dina1>>114;
L[12]=dina1>>115;
L[11]=dina1>>116;
L[10]=dina1>>117;
L[9]=dina1>>118;
L[8]=dina1>>119;
L[7]=dina1>>120;
L[6]=dina1>>121;
L[5]=dina1>>122;
L[4]=dina1>>123;
L[3]=dina1>>124;
L[2]=dina1>>125;
L[1]=dina1>>126;
L[0]=dina1>>127;
U[0]=dina1<<1;
U[1]=dina1<<2;
U[2]=dina1<<3;
U[3]=dina1<<4;
U[4]=dina1<<5;
U[5]=dina1<<6;
U[6]=dina1<<7;
U[7]=dina1<<8;
U[8]=dina1<<9;
U[9]=dina1<<10;
U[10]=dina1<<11;
U[11]=dina1<<12;
U[12]=dina1<<13;
U[13]=dina1<<14;
U[14]=dina1<<15;
U[15]=dina1<<16;
U[16]=dina1<<17;
U[17]=dina1<<18;
U[18]=dina1<<19;
U[19]=dina1<<20;
U[20]=dina1<<21;
U[21]=dina1<<22;
U[22]=dina1<<23;
U[23]=dina1<<24;
U[24]=dina1<<25;
U[25]=dina1<<26;
U[26]=dina1<<27;
U[27]=dina1<<28;
U[28]=dina1<<29;
U[29]=dina1<<30;
U[30]=dina1<<31;
U[31]=dina1<<32;
U[32]=dina1<<33;
U[33]=dina1<<34;
U[34]=dina1<<35;
U[35]=dina1<<36;
U[36]=dina1<<37;
U[37]=dina1<<38;
U[38]=dina1<<39;
U[39]=dina1<<40;
U[40]=dina1<<41;
U[41]=dina1<<42;
U[42]=dina1<<43;
U[43]=dina1<<44;
U[44]=dina1<<45;
U[45]=dina1<<46;
U[46]=dina1<<47;
U[47]=dina1<<48;
U[48]=dina1<<49;
U[49]=dina1<<50;
U[50]=dina1<<51;
U[51]=dina1<<52;
U[52]=dina1<<53;
U[53]=dina1<<54;
U[54]=dina1<<55;
U[55]=dina1<<56;
U[56]=dina1<<57;
U[57]=dina1<<58;
U[58]=dina1<<59;
U[59]=dina1<<60;
U[60]=dina1<<61;
U[61]=dina1<<62;
U[62]=dina1<<63;
U[63]=dina1<<64;
U[64]=dina1<<65;
U[65]=dina1<<66;
U[66]=dina1<<67;
U[67]=dina1<<68;
U[68]=dina1<<69;
U[69]=dina1<<70;
U[70]=dina1<<71;
U[71]=dina1<<72;
U[72]=dina1<<73;
U[73]=dina1<<74;
U[74]=dina1<<75;
U[75]=dina1<<76;
U[76]=dina1<<77;
U[77]=dina1<<78;
U[78]=dina1<<79;
U[79]=dina1<<80;
U[80]=dina1<<81;
U[81]=dina1<<82;
U[82]=dina1<<83;
U[83]=dina1<<84;
U[84]=dina1<<85;
U[85]=dina1<<86;
U[86]=dina1<<87;
U[87]=dina1<<88;
U[88]=dina1<<89;
U[89]=dina1<<90;
U[90]=dina1<<91;
U[91]=dina1<<92;
U[92]=dina1<<93;
U[93]=dina1<<94;
U[94]=dina1<<95;
U[95]=dina1<<96;
U[96]=dina1<<97;
U[97]=dina1<<98;
U[98]=dina1<<99;
U[99]=dina1<<100;
U[100]=dina1<<101;
U[101]=dina1<<102;
U[102]=dina1<<103;
U[103]=dina1<<104;
U[104]=dina1<<105;
U[105]=dina1<<106;
U[106]=dina1<<107;
U[107]=dina1<<108;
U[108]=dina1<<109;
U[109]=dina1<<110;
U[110]=dina1<<111;
U[111]=dina1<<112;
U[112]=dina1<<113;
U[113]=dina1<<114;
U[114]=dina1<<115;
U[115]=dina1<<116;
U[116]=dina1<<117;
U[117]=dina1<<118;
U[118]=dina1<<119;
U[119]=dina1<<120;
U[120]=dina1<<121;
U[121]=dina1<<122;
U[122]=dina1<<123;
U[123]=dina1<<124;
        U[124]=dina1<<125;
        U[125]=dina1<<126;
        U[126]=dina1<<127;
    End
always(posedge clk or negedge rst)
    begin
        if(!rst)
            begin
                ready_o<=0;
                dout<=128′h0;
            end
     else if(en)
            begin
                ready_o<=ready_o_reg;
                dout<=dout_reg;
            end
        else
            begin
                ready_o<=0;
                dout<=128′h0;
            end
    end
always(L[0]  or U[0]  or L[1]  or U[1]  or L[2]  or U[2]  or L[3]  or U[3]  or L[4]  or U[4]  or L[5]
       or U[5]  or L[6]  or U[6]  or L[7]  or U[7]  or L[8]  or U[8]  or L[9]  or U[9]  or L[10]  or
       U[10]  or L[11]  or U[11]  or L[12]  or U[12]  or L[13]  or U[13]  or L[14]  or U[14]  or L[15]  or U[15]
       or L[16]  or U[16]  or L[17]  or U[17]  or L[18]  or U[18]  or L[19]  or U[19]  or L[20]  or U[20]  or L[21]
       or U[21]  or L[22]  or U[22]  or L[23]  or U[23]  or L[24]  or U[24]  or L[25]  or U[25]  or L[26]  or
       U[26]  or L[27]  or U[27]  or L[28]  or U[28]  or L[29]  or U[29]  or L[30]  or U[30]  or L[31]  or U[31]
       or L[32]  or U[32]  or L[33]  or U[33]  or L[34]  or U[34]  or L[35]  or U[35]  or L[36]  or U[36]  or
       L[37]  or U[37]  or L[38]  or U[38]  or L[39]  or U[39]  or L[40]  or U[40]  or L[41]  or U[41]  or L[42]
       or U[42]  or L[43]  or U[43]  or L[44]  or U[44]  or L[45]  or U[45]  or L[46]  or U[46]  or L[47]  or
       U[47]  or L[48]  or U[48]  or L[49]  or U[49]  or L[50]  or U[50]  or L[51]  or U[51]  or L[52]  or U[52]
       or L[53]  or U[53]  or L[54]  or U[54]  or L[55]  or U[55]  or L[56]  or U[56]  or L[57]  or U[57]  or
       L[58]  or U[58]  or L[59]  or U[59]  or L[60]  or U[60]  or L[61]  or U[61]  or L[62]  or U[62]  or L[63]
       or U[63]  or L[64]  or U[64]  or L[65]  or U[65]  or L[66]  or U[66]  or L[67]  or U[67]  or L[68]  or
       U[68]  or L[69]  or U[69]  or L[70]  or U[70]  or L[71]  or U[71]  or L[72]  or U[72]  or L[73]  or U[73]
       or L[74]  or U[74]  or L[75]  or U[75]  or L[76]  or U[76]  or L[77]  or U[77]  or L[78]  or U[78]  or
       L[79]  or U[79]  or L[80]  or U[80]  or L[81]  or U[81]  or L[82]  or U[82]  or L[83]  or U[83]  or L[84]
       or U[84]  or L[85]  or U[85]  or L[86]  or U[86]  or L[87]  or U[87]  or L[88]  or U[88]  or L[89]  or
       U[89]  or L[90]  or U[90]  or L[91]  or U[91]  or L[92]  or U[92]  or L[93]  or U[93]  or L[94]  or U[94]
       or L[95]  or U[95]  or L[96]  or U[96]  or L[97]  or U[97]  or L[98]  or U[98]  or L[99]  or U[99]  or
       L[100]  or U[100]  or L[101]  or U[101]  or L[102]  or U[102]  or L[103]  or U[103]  or L[104]  or U[104]  or L[105]  or
       U[105]  or L[106]  or U[106]  or L[107]  or U[107]  or L[108]  or U[108]  or L[109]  or U[109]  or L[110]  or U[110]  or
       L[111]  or U[111]  or L[112]  or U[112]  or L[113]  or U[113]  or L[114]  or U[114]  or L[115]  or U[115]  or L[116]  or
    U[116]  or L[117]  or U[117]  or L[118]  orU[118]  or L[119]  or U[119]  orL[120  ]or U[120]  or L[121]  or U[121]  or
    L[122]  or U[122]  or L[123]  or U[123]  or L[124]  or U[124]  or L[125]  or U[125]  or L[126]  or U[126]  or L[127]  or
    dinb1)
begin
    mult(L[0],dinb1,M[0]);
    mult(L[1],dinb1,M[1]);
    mult(L[2],dinb1,M[2];
    mult(L[3],dinb1,M[3]);
    mult(L[4],dinb1,M[4]);
    mult(L[5],dinb1,M[5]);
    mult(L[6],dinb1,M[6]);
    mult(L[7],dinb1,M[7]);
    mult(L[8],dinb1,M[8]);
    mult(L[9],dinb1,M[9]);
    mult(L[10],dinb1,M[10]);
    mult(L[11],dinb1,M[11]);
    mult(L[12],dinb1,M[12]);
    mult(L[13],dinb1,M[13]);
    mult(L[14],dinb1,M[14]);
    mult(L[15],dinb1,M[15]);
    mult(L[16],dinb1,M[16]);
    mult(L[17],dinb1,M[17]);
    mult(L[18],dinb1,M[18]);
    mult(L[19],dinb1,M[19]);
    mult(L[20],dinb1,M[20]);
    mult(L[21],dinb1,M[21]);
    mult(L[22],dinb1,M[22]);
    mult(L[23],dinb1,M[23]);
    mult(L[24],dinb1,M[24]);
    mult(L[25],dinb1,M[25]);
    mult(L[26],dinb1,M[26]);
    mult(L[27],dinb1,M[27]);
    mult(L[28],dinb1,M[28]);
    mult(L[29],dinb1,M[29]);
    mult(L[30],dinb1,M[30]);
    mult(L[31],dinb1,M[31]);
    mult(L[32],dinb1,M[32]);
    mult(L[33],dinb1,M[33]);
    mult(L[34],dinb1,M[34]);
    mult(L[35],dinb1,M[35]);
    mult(L[36],dinb1,M[36]);
    mult(L[37],dinb1,M[37]);
    mult(L[38],dinb1,M[38]);
    mult(L[39],dinb1,M[39]);
    mult(L[40],dinb1,M[40]);
    mult(L[41],dinb1,M[41]);
mult(L[42],dinb1,M[42]);
mult(L[43],dinb1,M[43]);
mult(L[44],dinb1,M[44]);
mult(L[45],dinb1,M[45]);
mult(L[46],dinb1,M[46]);
mult(L[47],dinb1,M[47]);
mult(L[48],dinb1,M[48]);
mult(L[49],dinb1,M[49]);
mult(L[50],dinb1,M[50]);
mult(L[51],dinb1,M[51]);
mult(L[52],dinb1,M[52]);
mult(L[53],dinb1,M[53]);
mult(L[54],dinb1,M[54]);
mult(L[55],dinb1,M[55]);
mult(L[56],dinb1,M[56]);
mult(L[57],dinb1,M[57]);
mult(L[58],dinb1,M[58]);
mult(L[59],dinb1,M[59]);
mult(L[60],dinb1,M[60]);
mult(L[61],dinb1,M[61]);
mult(L[62],dinb1,M[62]);
mult(L[63],dinb1,M[63]);
mult(L[64],dinb1,M[64]);
mult(L[65],dinb1,M[65]);
mult(L[66],dinb1,M[66]);
mult(L[67],dinb1,M[67]);
mult(L[68],dinb1,M[68]);
mult(L[69],dinb1,M[69]);
mult(L[70],dinb1,M[70]);
mult(L[71],dinb1,M[71]);
mult(L[72],dinb1,M[72]);
mult(L[73],dinb1,M[73]);
mult(L[74],dinb1,M[74]);
mult(L[75],dinb1,M[75]);
mult(L[76],dinb1,M[76]);
mult(L[77],dinb1,M[77]);
mult(L[78],dinb1,M[78]);
mult(L[79],dinb1,M[79]);
mult(L[80],dinb1,M[80]);
mult(L[81],dinb1,M[81]);
mult(L[82],dinb1,M[82]);
mult(L[83],dinb1,M[83]);
mult(L[84],dinb1,M[84]);
mult(L[85],dinb1,M[85]);
mult(L[86],dinb1,M[86]);
mult(L[87],dinb1,M[87]);
mult(L[88],dinb1,M[88]);
mult(L[89],dinb1,M[89]);
mult(L[90],dinb1,M[90]);
mult(L[91],dinb1,M[91]);
mult(L[92],dinb1,M[92]);
mult(L[93],dinb1,M[93]);
mult(L[94],dinb1,M[94]);
mult(L[95],dinb1,M[95]);
mult(L[96],dinb1,M[96]);
mult(L[97],dinb1,M[97]);
mult(L[98],dinb1,M[98]);
mult(L[99],dinb1,M[99]);
mult(L[100],dinb1,M[100]);
mult(L[101],dinb1,M[101]);
mult(L[102],dinb1,M[102]);
mult(L[103],dinb1,M[103]);
mult(L[104],dinb1,M[104]);
mult(L[105],dinb1,M[105]);
mult(L[106],dinb1,M[106]);
mult(L[107],dinb1,M[107]);
mult(L[108],dinb1,M[108]);
mult(L[109],dinb1,M[109]);
mult(L[110],dinb1,M[110]);
mult(L[111],dinb1,M[111]);
mult(L[112],dinb1,M[112]);
mult(L[113],dinb1,M[113]);
mult(L[114],dinb1,M[114]);
mult(L[115],dinb1,M[115]);
mult(L[116],dinb1,M[116]);
mult(L[117],dinb1,M[117]);
mult(L[118],dinb1,M[118]);
mult(L[119],dinb1,M[119]);
mult(L[120],dinb1,M[120]);
mult(L[121],dinb1,M[121]);
mult(L[122],dinb1,M[122]);
mult(L[123],dinb1,M[123]);
mult(L[124],dinb1,M[124]);
mult(L[125],dinb1,M[125]);
mult(L[126],dinb1,M[126]);
mult(L[127],dinb1,M[127]);
mult(U[0],dinb1,N[0]);
mult(U[1],dinb1,N[1]);
mult(U[2],dinb1,N[2]);
mult(U[3],dinb1,N[3]);
mult(U[4],dinb1,N[4]);
mult(U[5],dinb1,N[5]);
mult(U[6],dinb1,N[6]);
mult(U[7],dinb1,N[7]);
mult(U[8],dinb1,N[8]);
mult(U[9],dinb1,N[9]);
mult(U[10],dinb1,N[10]);
mult(U[11],dinb1,N[11]);
mult(U[12],dinb1,N[12]);
mult(U[13],dinb1,N[13]);
mult(U[14],dinb1,N[14]);
mult(U[15],dinb1,N[15]);
mult(U[16],dinb1,N[16]);
mult(U[17],dinb1,N[17]);
mult(U[18],dinb1,N[18]);
mult(U[19],dinb1,N[19]);
mult(U[20],dinb1,N[20]);
mult(U[21],dinb1,N[21]);
mult(U[22],dinb1,N[22]);
mult(U[23],dinb1,N[23]);
mult(U[24],dinb1,N[24]);
mult(U[25],dinb1,N[25]);
mult(U[26],dinb1,N[26]);
mult(U[27],dinb1,N[27]);
mult(U[28],dinb1,N[28]);
mult(U[29],dinb1,N[29]);
mult(U[30],dinb1,N[30]);
mult(U[31],dinb1,N[31]);
mult(U[32],dinb1,N[32]);
mult(U[33],dinb1,N[33]);
mult(U[34],dinb1,N[34]);
mult(U[35],dinb1,N[35]);
mult(U[36],dinb1,N[36]);
mult(U[37],dinb1,N[37]);
mult(U[38],dinb1,N[38]);
mult(U[39],dinb1,N[39]);
mult(U[40],dinb1,N[40]);
mult(U[41],dinb1,N[41]);
mult(U[42],dinb1,N[42]);
mult(U[43],dinb1,N[43]);
mult(U[44],dinb1,N[44]);
mult(U[45],dinb1,N[45]);
mult(U[46],dinb1,N[46]);
mult(U[47],dinb1,N[47]);
mult(U[48],dinb1,N[48]);
mult(U[49],dinb1,N[49]);
mult(U[50],dinb1,N[50]);
mult(U[51],dinb1,N[51]);
mult(U[52],dinb1,N[52]);
mult(U[53],dinb1,N[53]);
mult(U[54],dinb1,N[54]);
mult(U[55],dinb1,N[55]);
mult(U[56],dinb1,N[56]);
mult(U[57],dinb1,N[57]);
mult(U[58],dinb1,N[58]);
mult(U[59],dinb1,N[59]);
mult(U[60],dinb1,N[60]);
mult(U[61],dinb1,N[61]);
mult(U[62],dinb1,N[62]);
mult(U[63],dinb1,N[63]);
mult(U[64],dinb1,N[64]);
mult(U[65],dinb1,N[65]);
mult(U[66],dinb1,N[66]);
mult(U[67],dinb1,N[67]);
mult(U[68],dinb1,N[68]);
mult(U[69],dinb1,N[69]);
mult(U[70],dinb1,N[70]);
mult(U[71],dinb1,N[71]);
mult(U[72],dinb1,N[72]);
mult(U[73],dinb1,N[73]);
mult(U[74],dinb1,N[74]);
mult(U[75],dinb1,N[75]);
mult(U[76],dinb1,N[76]);
mult(U[77],dinb1,N[77]);
mult(U[78],dinb1,N[78]);
mult(U[79],dinb1,N[79]);
mult(U[80],dinb1,N[80]);
mult(U[81],dinb1,N[81]);
mult(U[82],dinb1,N[82]);
mult(U[83],dinb1,N[83]);
mult(U[84],dinb1,N[84]);
mult(U[85],dinb1,N[85]);
mult(U[86],dinb1,N[86]);
mult(U[87],dinb1,N[87]);
mult(U[88],dinb1,N[88]);
mult(U[89],dinb1,N[89]);
mult(U[90],dinb1,N[90]);
mult(U[91],dinb1,N[91]);
mult(U[92],dinb1,N[92]);
mult(U[93],dinb1,N[93]);
mult(U[94],dinb1,N[94]);
mult(U[95],dinb1,N[95]);
mult(U[96],dinb1,N[96]);
    mult(U[97],dinb1,N[97]);
    mult(U[98],dinb1,N[98]);
    mult(U[99],dinb1,N[99]);
    mult(U[100],dinb1,N[100]);
    mult(U[101],dinb1,N[101]);
    mult(U[102],dinb1,N[102]);
    mult(U[103],dinb1,N[103]);
    mult(U[104],dinb1,N[104]);
    mult(U[105],dinb1,N[105]);
    mult(U[106],dinb1,N[106]);
    mult(U[107],dinb1,N[107]);
    mult(U[108],dinb1,N[108]);
    mult(U[109],dinb1,N[109]);
    mult(U[110],dinb1,N[110]);
    mult(U[111],dinb1,N[111]);
    mult(U[112],dinb1,N[112]);
    mult(U[113],dinb1,N[113]);
    mult(U[114],dinb1,N[114]);
    mult(U[115],dinb1,N[115]);
    mult(U[116],dinb1,N[116]);
    mult(U[117],dinb1,N[117]);
    mult(U[118],dinb1,N[118]);
    mult(U[119],dinb1,N[119]);
    mult(U[120],dinb1,N[120]);
    mult(U[121],dinb1,N[121]);
    mult(U[122],dinb1,N[122]);
    mult(U[123],dinb1,N[123]);
    mult(U[124],dinb1,N[124]);
    mult(U[125],dinb1,N[125]);
    mult(U[126],dinb1,N[126]);
  end
always(M or N or en)
    begin
        if(en)
            begin
                ready_o_reg=1;
                N_reg[0] =N[0] ^N[121] ^N[126];
                N_reg[1] =N[0] ^N[1]   ^N[121] ^N[122] ^N[126];
                N_reg[2] =N[0] ^N[1]   ^N[2]   ^N[121] ^N[122] ^N[123] ^N[126];
                N_reg[3] =N[1] ^N[2]   ^N[3]   ^N[122] ^N[123] ^N[124];
                N_reg[4] =N[2] ^N[3]   ^N[4]   ^N[123] ^N[124] ^N[125];
                N_reg[5] =N[3] ^N[4]   ^N[5]   ^N[124] ^N[125] ^N[126];
                N reg[6] =N[4] ^N[5]   ^N[6]   ^N[125] ^N[126];
                N_reg[7] =N[0] ^N[5]   ^N[6]   ^N[7] ^N[121];
                N_reg[8] =N[1] ^N[6]   ^N[7]   ^N[8] ^N[122];
N_reg[9]  =N[2]  ^N[7]  ^N[8]  ^N[9]  ^N[123];
N_reg[10] =N[3]  ^N[8]  ^N[9]  ^N[10] ^N[124];
N_reg[11] =N[4]  ^N[9]  ^N[10] ^N[11] ^N[125];
N_reg[12] =N[5]  ^N[10] ^N[11] ^N[12] ^N[126];
N_reg[13] =N[6]  ^N[11] ^N[12] ^N[13];
N_reg[14] =N[7]  ^N[12] ^N[13] ^N[14];
N_reg[15] =N[8]  ^N[13] ^N[14] ^N[15];
N_reg[16] =N[9]  ^N[14] ^N[15] ^N[16];
N_reg[17] =N[10] ^N[15] ^N[16] ^N[17];
N_reg[18] =N[11] ^N[16] ^N[17] ^N[18];
N_reg[19] =N[12] ^N[17] ^N[18] ^N[19];
N_reg[20] =N[13] ^N[18] ^N[19] ^N[20];
N_reg[21] =N[14] ^N[19] ^N[20] ^N[21];
N_reg[22] =N[15] ^N[20] ^N[21] ^N[22];
N_reg[23] =N[16] ^N[21] ^N[22] ^N[23];
N_reg[24] =N[17] ^N[22] ^N[23] ^N[24];
N_reg[25] =N[18] ^N[23] ^N[24] ^N[25];
N_reg[26] =N[19] ^N[24] ^N[25] ^N[26];
N_reg[27] =N[20] ^N[25] ^N[26] ^N[27];
N_reg[28] =N[211 ^N[26] ^N[27] ^N[28];
N_reg[29] =N[22] ^N[27] ^N[28] ^N[29];
N_reg[30] =N[23] ^N[28] ^N[29] ^N[30];
N_reg[31] =N[24] ^N[29] ^N[30] ^N[31];
N_reg[32] =N[25] ^N[30] ^N[31] ^N[32];
N_reg[33] =N[26] ^N[31] ^N[32] ^N[33];
N_reg[34] =N[27] ^N[32] ^N[33] ^N[34];
N_reg[35] =N[28] ^N[33] ^N[34] ^N[35];
N_reg[36] =N[29] ^N[34] ^N[35] ^N[36];
N_reg[37] =N[30] ^N[35] ^N[36] ^N[37];
N_reg[38] =N[31] ^N[36] ^N[37] ^N[38];
N_reg[39] =N[32] ^N[37] ^N[38] ^N[39];
N_reg[40] =N[33] ^N[38] ^N[39] ^N[40];
N_reg[41] =N[34] ^N[39] ^N[40] ^N[41];
N_reg[42] =N[35] ^N[40] ^N[41] ^N[42];
N_reg[43] =N[36] ^N[41] ^N[42] ^N[43];
N_reg[44] =N[37] ^N[42] ^N[43] ^N[44];
N_reg[45] =N[38] ^N[43] ^N[44] ^N[45];
N_reg[46] =N[39] ^N[44] ^N[45] ^N[46];
N_reg[47] =N[40] ^N[45] ^N[46] ^N[47];
N_reg[48] =N[41] ^N[46] ^N[47] ^N[48];
N_reg[49] =N[42] ^N[47] ^N[48] ^N[49];
N_reg[50] =N[43] ^N[48] ^N[49] ^N[50];
N_reg[51] =N[44] ^N[49] ^N[50] ^N[51];
N_reg[52] =N[45] ^N[50] ^N[51] ^N[52];
N_reg[53] =N[46] ^N[51] ^N[52] ^N[53];
N_reg[54] =N[47] ^N[52] ^N[53] ^N[54];
N_reg[55] =N[48] ^N[53] ^N[54] ^N[55];
N_reg[56] =N[49] ^N[54] ^N[55] ^N[56];
N_reg[57] =N[50] ^N[55] ^N[56] ^N[57];
N_reg[58] =N[51] ^N[56] ^N[57] ^N[58];
N_reg[59] =N[52] ^N[57] ^N[58] ^N[59];
N_reg[60] =N[53] ^N[58] ^N[59] ^N[60];
N_reg[61] =N[54] ^N[59] ^N[60] ^N[61];
N_reg[62] =N[55] ^N[60] ^N[61] ^N[62];
N_reg[63] =N[56] ^N[61] ^N[62] ^N[63];
N_reg[64] =N[57] ^N[62] ^N[63] ^N[64];
N_reg[65] =N[58] ^N[63] ^N[64] ^N[65];
N_reg[66] =N[59] ^N[64] ^N[65] ^N[66];
N_reg[67] =N[60] ^N[65] ^N[66] ^N[67];
N_reg[68] =N[61] ^N[66] ^N[67] ^N[68];
N_reg[69] =N[62] ^N[67] ^N[68] ^N[69];
N_reg[70] =N[63] ^N[68] ^N[69] ^N[70];
N_reg[71] =N[64] ^N[69] ^N[70] ^N[71];
N_reg[72] =N[65] ^N[70] ^N[71] ^N[72];
N_reg[73] =N[66] ^N[71] ^N[72] ^N[73];
N_reg[74] =N[67] ^N[72] ^N[73] ^N[74];
N_reg[75] =N[68] ^N[73] ^N[74] ^N[75];
N_reg[76] =N[69] ^N[74] ^N[75] ^N[76];
N_reg[77] =N[70] ^N[75] ^N[76] ^N[77];
N_reg[78] =N[71] ^N[76] ^N[77] ^N[78];
N_reg[79] =N[72] ^N[77] ^N[78] ^N[79];
N_reg[80] =N[73] ^N[78] ^N[79] ^N[80];
N_reg[81] =N[74] ^N[79] ^N[80] ^N[81];
N_reg[82] =N[75] ^N[80] ^N[81] ^N[82];
N_reg[83] =N[76] ^N[81] ^N[82] ^N[83];
N_reg[84] =N[77] ^N[82] ^N[83] ^N[84];
N_reg[85] =N[78] ^N[83] ^N[84] ^N[85];
N_reg[86] =N[79] ^N[84] ^N[85] ^N[86];
N_reg[87] =N[80] ^N[85] ^N[86] ^N[87];
N_reg[88] =N[81] ^N[86] ^N[87] ^N[88];
N_reg[89] =N[82] ^N[87] ^N[88] ^N[89];
N_reg[90] =N[83] ^N[88] ^N[89] ^N[90];
N_reg[91] =N[84] ^N[89] ^N[90] ^N[91];
N_reg[92] =N[85] ^N[90] ^N[91] ^N[92];
N_reg[93] =N[86] ^N[91] ^N[92] ^N[93];
N_reg[94] =N[87] ^N[92] ^N[93] ^N[94];
N_reg[95] =N[88] ^N[93] ^N[94] ^N[95];
N_reg[96] =N[89] ^N[94] ^N[95] ^N[96];
N_reg[97] =N[90] ^N[95] ^N[96] ^N[97];
N_reg[98] =N[91] ^N[96] ^N[97] ^N[98];
N_reg[99] =N[92] ^N[97] ^N[98] ^N[99];
N_reg[100]=N[93] ^N[98] ^N[99] ^N[100];
        N_reg[101] =N[94]  ^N[99]  ^N[100] ^N[101];
        N_reg[102] =N[95]  ^N[100] ^N[101] ^N[102];
        N_reg[103] =N[96]  ^N[101] ^N[102] ^N[103];
        N_reg[104] =N[97]  ^N[102] ^N[103] ^N[104];
        N_reg[105] =N[98]  ^N[103] ^N[104] ^N[105];
        N_reg[106] =N[99]  ^N[104] ^N[105] ^N[106];
        N_reg[107] =N[100] ^N[105] ^N[106] ^N[107];
        N_reg[108] =N[101] ^N[106] ^N[107] ^N[108];
        N_reg[109] =N[102] ^N[107] ^N[108] ^N[109];
        N_reg[110] =N[103] ^N[108] ^N[109] ^N[110];
        N_reg[111] =N[104] ^N[109] ^N[110] ^N[111];
        N_reg[112] =N[105] ^N[110] ^N[111] ^N[112];
        N_reg[113] =N[106] ^N[111] ^N[112] ^N[113];
        N_reg[114] =N[107] ^N[112] ^N[113] ^N[114];
        N_reg[115] =N[108] ^N[113] ^N[114] ^N[115];
        N_reg[116] =N[109] ^N[114] ^N[115] ^N[116];
        N_reg[117] =N[110] ^N[115] ^N[116] ^N[117];
        N_reg[118] =N[111] ^N[116] ^N[117] ^N[118];
        N_reg[119] =N[112] ^N[117] ^N[118] ^N[119];
        N_reg[120] =N[113] ^N[118] ^N[119] ^N[120];
        N_reg[121] =N[114] ^N[119] ^N[120] ^N[121];
        N_reg[122] =N[115] ^N[120] ^N[121] ^N[122];
        N_reg[123] =N[116] ^N[121] ^N[122] ^N[123];
        N_reg[124] =N[117] ^N[122] ^N[123] ^N[124];
        N_reg[125] =N[118] ^N[123] ^N[124] ^N[125];
        N_reg[126] =N[119] ^N[124] ^N[125] ^N[126];
        N_reg[127] =N[120] ^N[125] ^N[126];
        dout_reg   =N_reg ^M;
    end
else
    begin
        ready_o_reg=0;
        dout_reg=128′h0;
      end
  end
task mult;
input [0:127]a;
input [0:127]b;
output c;
reg    c;
begin
    c = (a[127]&b[0])  ^(a[126]&b[1])  ^(a[125]&b[2])  ^(a[124]&b[3])  ^(a[123]&b[4])
        ^(a[122]&b[5])  ^(a[121]&b[6])  ^(a[120]&b[7])  ^(a[119]&b[8])  ^(a[118]&b[9])
        ^(a[117]&b[10]) ^(a[116]&b[11]) ^(a[115]&b[12]) ^(a[114]&b[13]) ^(a[113]&b[14])
        ^(a[112]&b[15]) ^(a[111]&b[16]) ^(a[110]&b[17]) ^(a[109]&b[18]) ^(a[108]&b[19])
        ^(a[107]&b[20]) ^(a[106]&b[21]) ^(a[105]&b[22]) ^(a[104]&b[23]) ^(a[103]&b[24])
        ^(a[102]&b[25]) ^(a[101]&b[26]) ^(a[100]&b[27]) ^(a[99]&b[28])  ^(a[98]&b[29])
        ^(a[97]&b[30])  ^(a[96]&b[31])  ^(a[95]&b[32])  ^(a[94]&b[33])  ^(a[93]&b[34])
        ^(a[92]&b[35])  ^(a[91]&b[36])  ^(a[90]&b[37])  ^(a[89]&b[38])  ^(a[88]&b[39])
        ^(a[87]&b[40])  ^(a[86]&b[41])  ^(a[85]&b[42])  ^(a[84]&b[43])  ^(a[83]&b[44])
        ^(a[82]&b[45])  ^(a[81]&b[46])  ^(a[80]&b[47])  ^(a[79]&b[48])  ^(a[78]&b[49])
        ^(a[77]&b[50])  ^(a[76]&b[51])  ^(a[75]&b[52])  ^(a[74]&b[53])  ^(a[73]&b[54])
        ^(a[72]&b[55])  ^(a[71]&b[56])  ^(a[70]&b[57])  ^(a[69]&b[58])  ^(a[68]&b[59])
        ^(a[67]&b[60])  ^(a[66]&b[61])  ^(a[65]&b[62])  ^(a[64]&b[63])  ^(a[63]&b[64])
        ^(a[62]&b[65])  ^(a[61]&b[66])  ^(a[60]&b[67])  ^(a[59]&b[68])  ^(a[58]&b[69])
        ^(a[57]&b[70])  ^(a[56]&b[71])  ^(a[55]&b[72])  ^(a[54]&b[73])  ^(a[53]&b[74])
        ^(a[52]&b[75])  ^(a[51]&b[76])  ^(a[50]&b[77])  ^(a[49]&b[78])  ^(a[48]&b[79])
        ^(a[47]&b[80])  ^(a[46]&b[81])  ^(a[45]&b[82])  ^(a[44]&b[83])  ^(a[43]&b[84])
        ^(a[42]&b[85])  ^(a[41]&b[86])  ^(a[40]&b[87])  ^(a[39]&b[88])  ^(a[38]&b[89])
        ^(a[37]&b[90])  ^(a[36]&b[91])  ^(a[35]&b[92])  ^(a[34]&b[93])  ^(a[33]&b[94])
        ^(a[32]&b[95])  ^(a[31]&b[96])  ^(a[30]&b[97])  ^(a[29]&b[98])  ^(a[28]&b[99])
        ^(a[27]&b[100]) ^(a[26]&b[101]) ^(a[25]&b[102]) ^(a[24]&b[103]) ^(a[23]&b[104])
        ^(a[22]&b[105]) ^(a[21]&b[106]) ^(a[20]&b[107]) ^(a[19]&b[108]) ^(a[18]&b[109])
        ^(a[17]&b[110]) ^(a[16]&b[111]) ^(a[15]&b[112]) ^(a[14]&b[113]) ^(a[13]&b[114])
        ^(a[12]&b[115]) ^(a[11]&b[116]) ^(a[10]&b[117]) ^(a[9]&b[118])  ^(a[8]&b[119])
        ^(a[7]&b[120])  ^(a[6]&b[121])  ^(a[5]&b[122])  ^(a[4]&b[123])  ^(a[3]&b[124])
        ^(a[2]&b[125])  ^(a[1]&b[126])  ^(a[0]&b[127]);
      end
    endtask
endmodule

Claims (6)

1.一种伽罗华域乘法器实现装置,其特征在于:
m个m位移位寄存器单元,用于生成m×m的L矩阵;
m-1个m位移位寄存器单元,用于生成(m-1)×m的U矩阵;
2m-1组二元与门树,每组二元与门树是由2m个与门单元组成的二叉树形结构,用来处理计算两个m位元素乘法;
m组二元与门树,每组二元与门树是由2m-3个与门单元组成的二叉树形结构,用来处理计算两个m-1位元素乘法;
一组二元异或门树,是由2m-1个异或门单元组成的二叉树形结构,用来处理计算两个m位元素加法;
数据输入输出接口,提供两个m位元素输入接口以及一个m位元素输出接口,用于m位乘数和m位被乘数的输入以及结果元素的输出;
一个基于可约多项式P(x)=xm+xkt+……+xk2+xk1+1,其中1≤k1<k2<…<kt≤m/2构造的Q矩阵生成模块,所述Q矩阵生成模块通过Q矩阵构建,Q矩阵生成模块是由一组(m-1)×m的矩阵寄存器来提供Q矩阵数据输出,每一个寄存器提供一个m位的二元数据,每一个二元数据是根据Q矩阵赋值的,经矩阵转置后可以并行输出m个m-1位元素传送给二元与门树来计算中间结果;所述Q矩阵的第0行有t+1个1,1的分布分别在0,k1,k2,……,kt列;所述Q矩阵的第1行至m-kt-1行由第0行依次右移位得到;所述Q矩阵的第m-kt至m-2行的构造规则如下:当i行最后一列以1结尾时,i+1行向右移一位并与第0行的值进行异或运算;当i行最后一列以0结尾时,i+1行向右移一位。
2.如权利要求1所述的一种伽罗华域乘法器实现装置,其特征在于所述的两组m位移位寄存器并行的产生数据,提高了运算速度。
3.如权利要求1所述的一种伽罗华域乘法器实现装置,其特征在于所述的2m-1组二元与门树是由log2m级与门树结构组成。
4.如权利要求1所述的一种伽罗华域乘法器实现装置,其特征在于所述的二元异或门树是由log2m级与门树结构组成。
5.如权利要求1所述的一种伽罗华域乘法器实现装置,其特征在于所述的Q矩阵生成模块是由一个(m-1)×m位的寄存器单元来存放矩阵数据,经矩阵转置后可以并行输出m个m-1位元素传送给m组二元与门树来计算中间结果。
6.如权利要求1所述的一种伽罗华域乘法器实现装置,其特征在于其计算过程包括以下步骤:
步骤A:将输入的数据元素A并行送入L矩阵模块经过循环移位后与送进来的数据元素B经过2m-1组二元与门树;
步骤B:将输入的数据元素A并行送入U矩阵模块经过循环移位后与送进来的数据元素B经过2m-1组二元与门树,此步骤与步骤A在时序上是同时的;
步骤C:将步骤B运算得到的结果,一个m-1位数据元素与Q矩阵生成模块输出的m个m-1位元素经过m组二元与门树;
步骤D:步骤C得到的结果与步骤A运算得到的结果经过二元异或门树,得到最终结果C并予以输出。
CN2009100817685A 2009-04-10 2009-04-10 一种伽罗华域乘法器实现装置 Expired - Fee Related CN101650644B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2009100817685A CN101650644B (zh) 2009-04-10 2009-04-10 一种伽罗华域乘法器实现装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2009100817685A CN101650644B (zh) 2009-04-10 2009-04-10 一种伽罗华域乘法器实现装置

Publications (2)

Publication Number Publication Date
CN101650644A CN101650644A (zh) 2010-02-17
CN101650644B true CN101650644B (zh) 2012-07-04

Family

ID=41672887

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2009100817685A Expired - Fee Related CN101650644B (zh) 2009-04-10 2009-04-10 一种伽罗华域乘法器实现装置

Country Status (1)

Country Link
CN (1) CN101650644B (zh)

Families Citing this family (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102043605B (zh) * 2010-12-23 2012-10-24 龙芯中科技术有限公司 一种多媒体变换乘法器及其处理方法
CN102184088B (zh) * 2011-03-23 2013-12-25 北京邮电大学 一种基于串并结合实现有限域乘法的方法及装置
CN102664731B (zh) * 2012-04-09 2014-06-25 中科院成都信息技术股份有限公司 电子选票信息的加密及快速处理方法
CN103942027B (zh) * 2014-04-16 2017-06-06 哈尔滨工业大学深圳研究生院 一种可重构的快速并行乘法器
CN104407837B (zh) * 2014-12-16 2017-09-19 中国电子科技集团公司第三十八研究所 一种实现伽罗瓦域乘法的装置及其应用方法
CN106909339A (zh) * 2017-02-22 2017-06-30 深圳职业技术学院 一种基于二叉树结构的有限域乘法器
CN108268243B (zh) * 2018-01-30 2021-06-04 深圳职业技术学院 一种基于查找的复合域乘法装置
CN114063973B (zh) * 2022-01-14 2022-04-22 苏州浪潮智能科技有限公司 伽罗华域乘法器及纠删编解码系统

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1589429A (zh) * 2001-11-30 2005-03-02 阿纳洛格装置公司 伽罗瓦域乘法器系统
CN1608244A (zh) * 2001-11-30 2005-04-20 阿纳洛格装置公司 伽罗瓦域乘法/乘法一加法乘法累加

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1589429A (zh) * 2001-11-30 2005-03-02 阿纳洛格装置公司 伽罗瓦域乘法器系统
CN1608244A (zh) * 2001-11-30 2005-04-20 阿纳洛格装置公司 伽罗瓦域乘法/乘法一加法乘法累加

Also Published As

Publication number Publication date
CN101650644A (zh) 2010-02-17

Similar Documents

Publication Publication Date Title
CN101650644B (zh) 一种伽罗华域乘法器实现装置
CN103176767B (zh) 一种低功耗高吞吐的浮点数乘累加单元的实现方法
Di Matteo et al. Secure elliptic curve crypto-processor for real-time IoT applications
Meher et al. Low-Latency, Low-Area, and Scalable Systolic-Like Modular Multipliers for $ GF (2^{m}) $ Based on Irreducible All-One Polynomials
Meher et al. A high bit rate serial-serial multiplier with on-the-fly accumulation by asynchronous counters
CN101262345A (zh) 椭圆曲线密码系统的倍点系统
Prasad et al. Design of low power and high speed modified carry select adder for 16 bit Vedic Multiplier
CN102184161A (zh) 基于余数系统的矩阵求逆装置及方法
McIvor et al. High-radix systolic modular multiplication on reconfigurable hardware
Stavinov A practical parallel CRC generation method
CN107992283A (zh) 一种基于降维实现有限域乘法的方法和装置
Talapatra et al. Unified digit serial systolic Montgomery multiplication architecture for special classes of polynomials over GF (2m)
CN107885486B (zh) 一种基于查找树的复合有限域求逆装置
CN103780381B (zh) 基于高基脉动阵列的蒙哥马利算法的实现装置及方法
Surendran et al. Implementation of fast multiplier using modified Radix-4 booth algorithm with redundant binary adder for low energy applications
Namin et al. A Fully Serial-In Parallel-Out Digit-Level Finite Field Multiplier in $\mathbb {F} _ {2^{m}} $ Using Redundant Representation
Kadu et al. Hardware implementation of efficient elliptic curve scalar multiplication using vedic multiplier
Timarchi et al. Area-time-power efficient maximally redundant signed-digit modulo 2 n− 1 adder and multiplier
Chen et al. Efficient sigmoid function for neural networks based FPGA design
Bokade et al. CLA based 32-bit signed pipelined multiplier
Bui et al. Experiments with high speed parallel cubing units
Ibrahim et al. Low-power, high-speed unified and scalable word-based radix 8 architecture for montgomery modular multiplication in GF (p) and GF (2 n)
CN102929574A (zh) Gf(2163)域上的脉动乘法器设计方法
Zhang et al. Accurate and energy-efficient implementation of non-linear adder in parallel stochastic computing using sorting network
Mustapha et al. Intel/Altera FPGA Implementation of CORDIC Square Root Algorithm

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20120704

Termination date: 20150410

EXPY Termination of patent right or utility model