GithubHelp home page GithubHelp logo

brimonzzy / sha-acc Goto Github PK

View Code? Open in Web Editor NEW
4.0 1.0 0.0 2.41 MB

SHA series hash algorithm hardware Coprocessor based on RISC-V 基于RISC-V的SHA系列算法硬件加速协处理器设计及实现

Shell 1.51% Makefile 1.17% Assembly 2.91% C 76.21% Scala 18.20%

sha-acc's Introduction

基于RISC-V的SHA系列哈希算法硬件加速器

关键词:SHA、Rocket Chip、Chipyard、RoCC、FPGA


English version is here


本项目相关的仓库:

本仓库

运行本项目的chipyard环境 ( fork自chipyard v1.11.0 )

支持本项目sha扩展的spike ( fork自riscv-isa-sim v1.1.0 )

支持VCU108的fpga-shell ( fork自rocket-chip-fpga-shells )



文件结构:

.
├── sha3sim // SHA3算法的C语言实现
├── sha3acc // SHA3算法硬件加速器
|   ├── software
|   └── src
├── sha2sim // SHA2算法的C语言实现
├── sha2acc // SHA2算法硬件加速器
|   ├── software
|   └── src
└── doc // 文档


仿真

使用方式:

本项目需要在配套的 chipyard-shaacc 环境中运行:

git clone https://github.com/BriMonzZY/chipyard-shaacc.git

cd chipyard-shaacc

# 这一步可能需要较长的时间,需要占用 >3GB 的存储空间,建议科学上网,并且到网络环境较好的位置,否则可能会初始化失败
./init_env.sh # 初始化chipyard环境

项目代码在 chipyard-shaacc/generators/sha-acc 目录中。

可以执行 build.shchiseltest.sh 或者 run.sh 脚本来编译或者运行本项目:

## 进入目录
cd chipyard-shaacc/generators/sha-acc

## help
./build.sh -h 
./run.sh -h
./fpgabuild.sh -h
./chiseltest.sh -h


./build.sh sha3acc
./build.sh sha3accprint

./build.sh sha2acc
./build.sh sha2accprint

./build.sh test # 编译测试程序

./build.sh clean # 在sims/verilator和sims/vcs和sims/xcelium中执行 make clean 清除编译产生的文件


./run.sh # 运行编译的文件或者编译并运行(TODO还没有完善)


## 运行单元测试
./chiseltest.sh
./chiseltest.sh sha3
./chiseltest.sh sha2


FPGA原型验证

生成FPGA比特流文件

默认生成适用于 Xilinx VCU108 板卡的比特流文件

脚本文件先检查是否有Vivado工具的环境变量,请确认安装了Vivado工具

./fpgabuild.sh -h # 获取帮助

bitstream 生成成功后可以在 fpga/generated-src/<long-name>/obj 中找到比特流文件以及 vivado 的检查点文件,可以查看资源利用率以及时序报告等信息,或者在 checkpoint 上根据 UltraFast 流程插入ILA探针进行调试。


在VCU108板卡XCVU095-2FFVA2104E下进行综合:

image-20240520165200412

在 4.16ns 的时序约束下,关键路径的建立时间的裕量为 1.075ns



运行裸机 ( bare-metal ) 程序

和前面的测试程序不同,运行在FPGA上的程序需要进行一定调整才能正确运行,例如提供对memset、memcopy等内存操作、printf等打印操作的软件支持才能在SoC上运行裸机软件。本文加入了klib模块来提供上面提到了运行时环境。klib提供了kprintf、kputs、kputc、memset、memcopy等常用的功能函数,其中打印功能的函数使用了MMIO的方式来驱动SoC中的串口外设来实现程序运行过程中的消息输出。

chipyard通过固化在ROM的sdboot程序来从SD卡中加载用户程序。

例如我生成一个默认配置的Rocket Core的比特流文件,处理器核的pc将从0x10000开始运行(也就是存放sdboot的ROM的位置),sdboot开始通过SPI协议将SD卡对应位置(34)的程序拷贝到0x80000000开始的内存位置上,随后设置寄存器以及运行其他必要操作(设置a0和a1用于启动Linux)然后跳转到0x80000000地址开始执行程序。

sdboot的代码在fpga/src/main/resources/vcu118/sdboot位置


Chipyard生成的SoC的地址映射关系:


VCU108的Micro-SD外设

板载的SD卡卡槽是连接在ZYNQ7010上的,只能用于板卡的配置,所以需要外接一个SD卡卡槽用于插入SD卡

我使用了PMOD模块连接在VCU108右侧的PMOD接口上,如下图所示


将裸机程序加载进Micro-SD卡

大致流程:将用户程序编译完成后,用objcopy工具生成bin文件,然后用dd指令加载进SD卡。

用于FPGA原型验证的程序在 fpga_prototype_software 文件夹中,根据文件夹中README的提示进行编译和加载即可。(2024-7-20更新)


成功加载SD卡将会输出如下的内容:



初始化SD卡:

可以参考 Chipyard 文档

先用sudo fdisk -l命令寻找SD卡,下面以SD卡在 /dev/sda 位置为例

  1. 使用gdisk工具sudo gdisk /dev/sda,用x命令进入expert模式,输入z命令来格式化SD卡
  2. 重新进入gdisk工具,输入o命令创建新的GPT
  3. 进入expert模式,输入l命令然后输入1,将默认的对齐设置为1
  4. 输入m命令推出expert模式,输入n命令来创建第一个分区:partion number 1 ; select sector 34 ; size +1048576 ; type apfs
  5. 输入w指令保存更改并写入
  6. (可以不创建第二个分区sda2)

这样我们就创建了一个512MiB的 /dev/sda1 ,我们将把bin文件烧录到这个分区


以sha3-sw.bin为例,输入如下指令:

sudo dd if=sha3-sw/bin of=/dev/sda1

等待写入完成后就可以将SD卡插入FPGA板卡了。


测试结果

在FPGA上运行SHA3测试:


运行SHA2测试:



基于RISC-V的SHA系列哈希算法硬件加速器的实物演示视频:https://pan.baidu.com/s/1lb5idFS651VYNDrE4HT7Zg?pwd=rq52 提取码:rq52

sha-acc's People

Contributors

brimonzzy avatar

Stargazers

 avatar  avatar  avatar End avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.