这是我2019.09这个月的项目任务。之前比较忙,现在以此文记录之。
这实际上是第一届复旦微电子设计大赛数字赛道的参赛题目。借此题可以主动对深度学习,机器学习进行学习了解,由于是零基础,所以都是重零开始,对于初学者,文中难免有些生僻概念,部分会给出参考文献。
此外,本次数字设计要求使用UVM平台进行设计的验证,故也可以借此机会入手UVM,毕竟对于数字IC设计来说,多掌握验证的知识,也是锦上添花。
首先,给出题目要求如下:
【1】功能要求:使用数字电路实现特定卷积层的计算。具体如下
【2】验证要求
按照传统卷积神经网络的操作步骤,结合题目要求对乘法器个数的限制性要求。本文讨论并对比了如下的总体方案,并进行最终的方案确定。实际上方案的差别主要体现在乘法器数量的分配和输出方式的串行和并行与否问题上。如下做详细说明。
方案一:输出128通道并行+子功能模块+全卷积模块128次例化 主要是以输出通道并行为出发点,这儿的全卷积模块,需要将输入64通道的ifm和wgt以及bias数据全部完备输入,这样才能够在输出并行128通道上实现同步输出。
消耗乘法器数量:128*9=1152个 优点:输出通道并行输出;处理速度较快 缺点:数据总线数量较多;全卷积模块对数据的完备性要求高,时序上的错位会导致更容易出错
方案二:输出128通道串行+子功能模块+全卷积模块例化64次 主要以输入通道为出发点,每个输出通道都会有128个对一个的输出通道数据,这样,将每一个输入通道作为顶层全卷积模块方案,最终将输入通道64次加以例化,并能够得到各通道数据,最后相加便得到数据的全部数据。这样,避免了较多的数据总线,且输出串行,时序上更稳健,不易出错。
消耗乘法器数量:9*64=576个 优点:算法容易理解,消耗资源较少,时序要求更低 缺点:处理速度较方案一满了1倍;在串行数据处理上要进行算法优化设计 实际上,方案一也是一种伪并行输出,通道内部数据必须是1个1个串行输出,这样,在多一倍乘法器数量上,也只提速了一倍。综上考虑,本次设计选择方案二。
输入数据存储方案:所有从TXT文件提取的数据均存取在功能代码内部定义的存储器中,存储器声明方式如[7:0]ifm_1[1023:0],[7:0]weight_1[1151:0]。其中输入矩阵ifm和卷积核weight的存储器均有64个,对应输入的64通道。128个偏置bias全部存储在一个宽度为16位,深度为128的存储体中。
输出数据存储方案:在串行输出总线上,将128个通道的数据(每通道256个8bit数据),通过顶层sv实现,将数据打印到txt文本中。进而对整个算法功能的验证和评估。
整个卷积神经网络的算法实现,遵循数据提取卷积池化激活位宽处理数据写入到txt中这样的一个操作思路。输入通道64个,输出通道与卷积核个数共有128个通道,最终将128个通道通过串行总线的方式串行输出,共消耗9*64个乘法器。主要的计算体现在卷积操作,池化,位宽处理以及算法实现过程中的调度,将卷积操作化简为加法和乘法的子操作,通过模块例化的方式实现复杂功能。
首先在testbench中,将文件中所有数据录入并分别存储在ifm_all、weight_all和bias_all中,然后ifm、weightl的所有数据,按通道分别存储,并按照时钟周期,每8位向功能文件的顶层传输一次;bias的所有数据,只按照时钟周期,每16位向功能文件的顶层传输一次。在顶层文件TOP中,将传输过来的数据存储到相应的存储体中,等待其他功能模块的使用。
整个操作以输入通道数为基准,每个阶段的输出为串行实现,最后将128输出通道归一化到同一组串行总线上输出并打印到txt文档中。
本文只更新题题目要求和设计方案两部分,有关方案的具体实现,详见下一篇博客。