FireFly-v1-FPGA Simulation
参考文献
FireFly: A High-Throughput Hardware Accelerator for Spiking Neural Networks With Efficient DSP and Memory Optimization, IEEE Transactions on Very Large Scale Integration (VLSI) Systems, 10.1109/TVLSI.2023.3279349
URL: https://ieeexplore.ieee.org/document/10143752/
其他参考资料
-
UltraScale Architecture DSP Slice, UG579 (v1.7) June 4, 2018
1. 通过单个 DSP48E2 进行突触交叉计算 (Synaptic Crossbar Computation by a Single DSP48E2)
DSP48E2是Xilinx Ultrascale SoC中会提供的一个数字信号运算IP,基本架构在下两图所示,由三部分组成:
-
27位预加器 (27’b pre-adder)
-
27 x 18 乘法器(multiplier)
-
一个灵活的 48 位 ALU(flexible 48-bit ALU),负责进行加法减法(post-adder/subtractor)、累加(accumulator)、逻辑运算(logic unit)
让我们先看看论文中的表述:
思想:将一组量化成INT8的权重数送到DSPMux里,再利用输入脉冲决定哪些权重通过做后续运算,哪些不通过(不通过等价于卷积乘了0,不参与累加运算)。
四组INT8权重经过有符号拓展成INT12,再拼接成48位的大向量。上30位送进A端口,下18位送进B端口。
DSP48E2有几个控制端口,论文中分为静态设置和动态控制。静态设置主要设置DSP工作方式(计算方式),动态控制主要是利用脉冲控制多路选择器。在本文中,静态设置4-bit ALUMODE = 4'b0000
, 5-bit INMODE = 5’b10001
。标志位置设置完成后,工作状态如下图所示
INMODE说明: 最低位和最高位负责控制A,B输入打几拍之后再输出(即经过几个时钟周期/过了几个filp-flop再输出)。INMODE[0]和INMODE[4]置为1,表示A,B均打一拍之后输出。
ALUMODE说明: ALU则被设置为SIMD(单指令多数据, Single Instruction, Multiple Data)模式。输入的48位数据可以被分成12位的4个数据切片/段(data segments),每个小数据段(W, X, Y, Z)独立进行相同的计算,互不干扰。
将ALUMODE设成全0,ALU工作在SIMD ADD模式:Z + (W + X + Y + CIN)
下面是DSP IP块的动态控制。论文中主要通过输入脉冲来动态控制一个9位的OPMODE端口来控制WXYZ四个Mux的输出。OPMODE端口的定义和功能如下图所示。
以论文fig-2为例,OPMODE={2{s2},3'b001,2'b00,2{s3}}
; Z的输出为PCIN(来自上一级经由专用 DSP 级联路径(Dedicated DSP Cascade Path)传到此一级),Y的输出恒为0,s2脉冲控制W输出,s3脉冲控制X输出。
DSP模块E1和E2在端口上的区别
附:Verilog代码实现:
1 | module single_dsp48( |
PS:不要直接用IP Catelog里的DSP Macro IP核,高度定制化的IP核还是应参照Xilinx数据手册,编写原语实现。
当然,上述代码只能过RTL和Synthesis仿真,不能进行布局布线,因为我们把 OPMODE[5:4] 设置为 ‘01’,这表示正在使用 PCIN 总线,但在上述代码中所有的 PCIN 总线引脚被连接到 GND。
勘误:
原论文中的fig-2©中的第三个赋值语句,赋值顺序应颠倒,即
1 | assign {A, B} = {w_30, w_31, w_32, w_33}; |