浅谈CPU和硬件加速器接口 1
随着狭义摩尔定律的终结,单纯依靠CPU这种通用算力完成特定领域计算任务已经越来越不可行,面向特定领域完成专用ASIC设计是芯片设计过程中的一项主要任务。一名合格的ASIC架构师,接到一项新的工作任务时,一般需要首先考虑如下四个问题:
1. 决定软硬件分工
更准确的说,是决定ASIC承接哪些feature,又把哪些feature交还给软件。
-) 一般而言,固定的大规模计算(譬如加解密和编解码)和数据流的搬移是ASIC一定要承接的任务
-) 可以灵活实现的复杂控制和演进过程中的计算则需要交还给CPU/DSP(说白了就是软件实现)
-) 对于实时性要求高且又需要一定灵活编程能力的控制可以选择软件定义硬件(SDH, Software Defined Hardware)来实现
2. 梳理control flow和data flow
确定HWA(Hardware Accelerator)需要实现的功能后,接下来就需要完成control flow和data flow的整理,通俗的讲,是确定以下内容:
-) HWA的上游是什么,HWA or SW
-) HWA的下游是什么,HWA or SW
-) 控制信息是如何输入的,又该怎么把状态结果输出给下游
-) 数据是如何流入的,又怎么供给到下游使用
做好控制流和数据流的梳理,确定控制和数据的流动模型,是做好HWA架构的前提。在架构设计时,一般需要考虑如下两个方面,做好架构层面的trade-off
-) 高效的完成控制流和数据流的输入和输出,减少软件MIPS消耗
-) 保持适度的灵活性,保留灵活配置能力、调试能力、工程打补丁能力和后续升级能力
听起来似乎是相互矛盾的,这就是芯片设计的现实,没有完美的解决方案,只有根据自己根据需求理解和工作经验进行的trade off,需要找到的永远是最合适的解决方案,而不是最好的解决方案或者某个维度最优的解决方案
3. 定义软硬件接口
作为干过HWA和SOC、Modem和AP、硬加速和SDR的人,有时候比较惊讶的发现自己和很多兄弟对软硬件接口设计的理解是如此不同的,这也是我写这篇文章的主要目的,好好讲讲我理解的软硬件接口。
于我而言,软硬件接口设计是否合适,是芯片设计是否成功的关键因素。一般来说,软硬件接口的设计原则如下:
-) 极致的PPA并不是最优的追求,特别是最优的area和power,往往意味着普通的performance和极度紧绷的弹性。以成本为目标的设计,是工程师最偷懒的考量,很直接也很明确却往往不是本质。
-) 保留适当的灵活度,是软硬件接口的更高原则。首先,合适的灵活接口设计和HWA硬对接设计的PPA整体在相同的量级;其次,灵活设计带来的time2market能力和软件work around能力,是更重要的事情。“软件能绕开的事情,不管多么复杂,都不能算ASIC bug”
常见的软硬件接口有4种,后续再详细介绍
-) “单步”
-) “pingpong”
-) “批处理”
-) “B&Q MAN”
4. 定义外部接口、block划分和block之间的接口
解耦,解耦,解耦,关键的问题要说三遍。一个不懂的解耦的工程师,不管年纪多大,永远是Junior Engineer。实际上从芯片级到RTL代码级,都需要很明确的思考清楚如何做好解耦,功能解耦、电源域解耦、时钟域解耦、几十行的寄存器级代码解耦。遗憾的是,这一两年来发现外面似乎并不理解如何解耦,所以这种模块划分甚至端口定义的工作,都成了架构设计的一部分