Verilog开源项目——百兆以太网交换机(三)Hash模块设计

本文主要是介绍Verilog开源项目——百兆以太网交换机(三)Hash模块设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Verilog开源项目——百兆以太网交换机(三)Hash模块设计


🔈声明:未经作者允许,禁止转载
😃博主主页:王_嘻嘻的CSDN主页
🔑全新原创以太网交换机项目,Blog内容将聚焦整体架构、模块设计方面;更新周期可能会略慢,希望朋友们多多包涵
🧡关注本专题的朋友们可以学习到原创交换机设计的全流程,包括设计与验证(FPGA)。
🚩第一代交换机  从零开始 verilog 以太网交换机系列专栏:点击这里
💥第二代交换机  Atom(百兆以太网交换机)专栏:点击这里

  Atom中在SM2加解密和LUT模块中都需要用到Hash模块,且为了更好地解决LUT中Hash冲突的问题,将实现SM3、SHA-256两种Hash算法,以满足循环Hash或双Hash方案

  在SM2中也可以对SM3和SHA-256选择性使用,满足不同需求。

  SM3和SHA-256在算法实现上十分类似,都是填充、扩展、迭代压缩最后得到Hash Key,所以本章我们仅以SHA-256为例,分析Atom中Hash模块的实现过程,但在Atom真实设计中,还是会有两个独立的Hash模块。



一、Hash Feature

  • 实现SHA-256和SM-3两种Hash算法;
  • 吞吐率达到1Gbps;
  • 支持压缩迭代全Pipeline结构,做到每一拍都有数据进出;
  • 时钟频率可达到200MHz;


二、SHA-256概述

  因为加解密模块和Mac LUT对吞吐率都有较高的要求,所以SHA-256也需要满足100Mbps的线速数据Hash,且为留出优化裕量,需要最高支持至1Gbps,因此SHA-256模块我们将设计成全Pipeline的结构,保证数据能不断流动,做到每一个时钟周期都能有数据进出。

  SHA-256总体分为三个步骤:填充(Padding)扩展(Extend)以及迭代压缩(Compressor),填充负责将输入数据补充为完整的512-bits,扩展负责将填充后的数据拆分为压缩所需的多组参数,压缩负责使用扩展后的数据进行多轮迭代计算,得到最终的Hash值。下图即为SHA-256结构图。

        请添加图片描述


  • Padding每一拍都能处理新数据,所以一份逻辑即可。
  • Extend步骤,每16组扩展数据块间可以独立计算,也就是在一次操作时间内可以同时完成16个数据块的扩展,共需要扩展三次(暂定三次可以在一个时钟周期内完成)。
  • 由于compressor在各自迭代中逻辑实现相同,但是SHA-256模块需要完全的Pipeline结构,所以这里通过例化多个compressor单元来实现,具体个数根据综合的最长路径来决定(例如最长路径支持16次循环,那么需要例化4个compressor单元)。

Note:本模块实现过程中,对于多拍的消息块,在Padding后也视作每拍独立,即对于compressor前后的消息块不存在依赖关系,若必须要对多拍消息块的Hash处理,需要在外围自行进行二次处理。



a)Padding

SHA-256在处理过程中,以512-bits为一个消息块,数据需要512-bits对齐,padding过程如下:

  1. 末尾64-bits填写该数据的实际位宽;
  2. 数据后填补一位‘1’bit;
  3. 若完成上述两步后,最后一组数据若不足512-bits,则在step1和step2直接填充‘0’;
    请添加图片描述

Note:最后一组是否为512-bits,应以填充后的长度为准,即至少完成step1、2后,再判断是否对齐。


b)Extend

将每个消息块宽展为64个32-bits W0~W63:

  1. 其中W0~W15为原始消息块M由高位至低位的直接切分;
  2. 对W16~W67通过置换函数迭代计算得到:
    For(i=16;i≤63;i++)
      Wi=F1(Wi-2)+Wj-7+F0(Wi-15)+Wi-16


c)Compressor

通过第三章定义的压缩函数迭代计算得到最后的Hash值,计算过程如下:

  1. 以图2-2中的初始Hash值拼接M=ABCDEFGH作为压缩阶段的初值;
  2. For(i=0;i≤63;i++)
      T1=H+F3+CH+Kj+Wj
      T2=F2+MAJ
      A‘=T1+T2
      B’=A
      C’=B
      D’=C
      E’=D+T1
      F’=E
      G’=F
      H’=G
  3. M‘={A’+A},{B’+B},{C’+C},{D’+D},{E’+E},{F’+F},{G’+G},{H’+H}
  4. 最终迭代结束得到的M即为SHA-256最终输出Hash Key;

初始向量如下图所示:
请添加图片描述



三、Function define

  • POTR^n(W):对W循环右移n-bits;

  • SHR^n(W): 对W右移n-bits;

  • F0(W):POTR^7(W) ⊕ POTR^18(W) ⊕ SHR^3(W);

  • F1(W):POTR^17(W) ⊕ POTR^19(W) ⊕ SHR^10(W);

  • MAJ: (A&B) ⊕ (A&C) ⊕ (B&C);

  • CH: (E&F) ⊕ ( ~ E&~F);

  • F2: POTR^2(A) ⊕ POTR^13(A) ⊕ POTR^22(A);

  • F3: POTR^6(E) ⊕ POTR^11(E) ⊕ POTR^25(E);



四、SHA-256接口

在这里插入图片描述

  需要注意的是,在处理过程中,数据块长度>447时,Padding操作将带来额外一拍数据,这会使得入口无法线速处理数据,但是出口仍是线速,所以这里将采用反压机制。

  且SHA-256数据无条件输出,若后级处理速度不够,需要外围自行buffer处理





若有不专业或错误之处,欢迎指正!

具体电路实现及验证环境代码会在准备完毕后开源,目前暂时不能给出,请见谅


搜索关注我的微信公众号【IC墨鱼仔】,获取我的更多IC干货分享!

这篇关于Verilog开源项目——百兆以太网交换机(三)Hash模块设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/415380

相关文章

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机