资讯动态

AI芯片软硬件协同设计全流程:从算力评估到流片验证的工程实践

发布时间:2026/10/14 2:59:13 来源:尧图企业网站定制
1. AI芯片软硬件设计的整体思路拆解AI芯片这个方向这几年从学术圈一路火到产业界但真正动手做过完整软硬件协同设计的人其实并不多。大部分团队要么偏硬件把芯片流片出来之后发现软件栈跑不通要么偏软件算法调得挺好一上硬件就发现算力利用率连30%都不到。我前后参与过几个不同规模的AI加速器项目踩过的坑足够写一本小册子今天就把这套软硬件设计的完整思路拆开来讲。先说清楚这个内容适合谁看。如果你是做数字IC设计的想了解上层算法对硬件的真实需求如果你是做算法或编译器的想搞清楚底层硬件到底长什么样或者你是学生、刚入行的工程师想系统性地理解AI芯片从需求到落地的全流程那这篇内容应该能帮到你。我会尽量用大白话把关键原理讲透同时给出可以直接参考的参数选择方法和实操步骤。AI芯片软硬件设计的核心矛盾说白了就一句话算法的灵活性和硬件的效率之间怎么平衡。CPU为什么跑AI慢因为它太通用了每个时钟周期都在做取指、译码、分支预测这些和矩阵乘法无关的事。GPU为什么快因为它把大量相同的计算单元堆在一起用SIMT的方式并行处理。但GPU也不是终点它的功耗还是太高于是有了TPU、NPU这些专用加速器。专用就意味着灵活性的丧失所以软件栈必须跟上把算法映射到硬件上。整个设计流程我习惯分成四个阶段需求分析与算力评估、架构设计、软硬件接口定义、协同验证与调优。这四个阶段不是线性的而是螺旋上升的。你可能在架构设计阶段发现算力评估有问题回头重新算也可能在协同验证时发现接口定义不合理回去改架构。下面我逐个展开。1.1 为什么软硬件必须协同设计很多人问为什么不能硬件团队做完芯片软件团队再往上写驱动和框架答案很简单性能瓶颈往往出现在软硬件交界处。我见过一个项目硬件支持INT8量化算力标称128TOPS但软件团队不知道数据怎么排布才能让DMA效率最高结果实际跑ResNet-50只有15TOPS。后来两边坐在一起重新定义了数据布局和指令集同样的硬件跑到了90TOPS以上。协同设计的本质是让软件需求驱动硬件定义让硬件约束反过来优化软件实现。具体来说算法团队需要告诉硬件团队我们主要跑什么网络结构、算子有哪些、数据精度要求是什么、batch size大概多大。硬件团队则要反馈片上缓存有多大、带宽是多少、支持哪些数据格式、指令延迟大概多少。这些信息必须在架构设计阶段就对齐而不是等流片回来再扯皮。1.2 算力评估的实操方法算力评估不是拍脑袋说“我们要做100TOPS”而是从目标应用反推。假设你要做一个面向智能摄像头的AI芯片主要跑目标检测网络帧率要求30fps分辨率1080p。那你可以这样算单帧计算量以YOLOv5s为例大约7.2GFLOPs乘加算2次操作每秒计算量7.2G × 30 216GFLOPs/s考虑利用率实际利用率按40%算这是比较现实的数字需要峰值算力约540GFLOPs/s再考虑未来算法升级余量乘以1.5到2倍最终定在1TOPS左右这个计算过程看起来简单但有几个坑要注意。第一FLOPs不等于实际运算量很多算子在硬件上会有额外的开销比如padding、数据搬运。第二利用率取决于最慢的那个算子如果网络里有一个算子硬件不支持回退到CPU跑那整体帧率就被拖垮了。第三功耗和面积约束往往比算力更早成为瓶颈特别是边缘端芯片。实操心得算力评估时一定要做算子级别的profiling把目标网络拆成算子列表逐个标注计算量、内存访问量、是否支持。我习惯用Excel做一个表列清楚每个算子的参数量、输入输出尺寸、计算量、内存占用然后逐项过。1.3 架构选型的权衡逻辑架构选型没有绝对的对错只有适不适合。常见的AI芯片架构有这么几类架构类型代表形态优势劣势适用场景SIMD/SIMTGPU类灵活生态好功耗高面积大云端训练、通用推理脉动阵列TPU类能效比高灵活性差编译难云端推理、大矩阵数据流架构部分NPU能效比极高编程模型复杂边缘推理、固定算子存内计算新型架构突破冯诺依曼瓶颈工艺不成熟研究阶段、低功耗场景选型时要问自己几个问题目标市场是云端还是边缘主要跑训练还是推理算法迭代速度快不快团队有没有编译器开发能力这些问题想清楚了架构方向基本就定了。2. 核心模块的硬件设计细节硬件设计这块我按数据通路、控制逻辑、存储层次三个维度来讲。每个维度都有一些容易忽略但影响巨大的细节。2.1 计算阵列的设计与参数选择计算阵列是AI芯片的核心决定了峰值算力和能效比。以最常见的脉动阵列为例假设你要设计一个128x128的MAC阵列每个MAC做一次8bit乘加那峰值算力就是128 × 128 × 2 × 频率 32768 × 2 × 1GHz 65.5TOPS这个数字看起来很美好但实际能达到多少取决于数据供给能不能跟上。计算阵列的利用率瓶颈通常不在计算本身而在数据搬运。我见过太多设计阵列做得很大但片上缓存带宽不够MAC单元经常饿着。参数选择上有几个经验值可以参考阵列尺寸边缘端一般64x64到128x128云端可以到256x256甚至更大。再大就要考虑良率和功耗密度了。数据精度训练用FP16/BF16推理用INT8部分场景可以用INT4。精度越低面积和功耗越小但量化误差需要评估。频率边缘端通常500MHz到1GHz云端可以到1.5GHz以上。频率越高功耗非线性增长要慎重。注意事项阵列尺寸不是越大越好。我做过一个对比128x128阵列在跑小batch时利用率只有30%换成64x64反而能到60%以上。因为小阵列的调度粒度更细更适合小算子。2.2 存储层次的设计要点AI芯片的存储层次一般分三级寄存器文件、片上缓存、片外内存。设计的关键是让数据在正确的时间出现在正确的地方。寄存器文件在计算单元旁边延迟最低但面积最大。片上缓存通常是SRAM容量从几百KB到几十MB不等。片外内存就是DDR或HBM容量大但带宽和延迟都是问题。一个典型的AI芯片存储带宽需求可以这样估算假设算力是64TOPS每个MAC操作需要读取2个操作数8bit那理论带宽需求是64T × 2 × 1Byte 128TB/s这个数字远超任何片外内存的带宽所以必须靠片上缓存复用数据。实际设计中片上缓存带宽通常做到计算带宽的3到5倍通过数据复用把片外带宽需求降到1/10甚至更低。数据复用有三种基本模式卷积复用、权重复用、输入复用。卷积复用是同一个卷积核在多个输入通道上滑动权重复用是多个输出通道共享同一组权重输入复用是同一块输入数据参与多个卷积核的计算。好的架构应该支持这三种复用模式的组合。2.3 控制逻辑与指令集设计控制逻辑决定了芯片怎么被编程。有两种主流思路CISC风格的大指令和RISC风格的精简指令。大指令的思路是一条指令完成一个完整的算子比如“卷积层输入尺寸224x224x3卷积核7x7x64步长2”。这种方式的优点是编译器简单硬件自己会调度缺点是灵活性差遇到不支持的算子就抓瞎。精简指令的思路是把算子拆成更细粒度的操作比如“加载数据到缓存”、“执行矩阵乘”、“写回结果”。这种方式灵活但编译器复杂度高对软件团队要求高。我个人的经验是边缘端芯片适合大指令云端芯片适合精简指令。边缘端场景固定算子变化少大指令能降低软件门槛云端场景复杂算法迭代快精简指令更能适应变化。指令集设计时要注意几个细节指令位宽太窄了表达力不够太宽了浪费面积。一般128bit到256bit比较合适。流水线深度太浅了频率上不去太深了分支惩罚大。AI芯片一般5到10级。同步机制多核之间怎么同步计算单元和DMA之间怎么同步这些都要在指令集层面考虑。3. 软件栈的分层设计与实现软件栈是AI芯片能不能用起来的关键。硬件做得再好软件难用客户也不会买账。我习惯把软件栈分成四层驱动层、运行时层、编译器层、框架层。3.1 驱动层与运行时设计驱动层直接和硬件打交道负责寄存器配置、中断处理、内存管理。运行时层在驱动之上负责任务调度、内存分配、多核协同。驱动层的一个关键设计是内存管理。AI芯片通常有多个存储层次数据在不同层次之间搬运需要驱动来协调。我推荐用统一虚拟地址的方式让软件看到一块连续的内存空间驱动负责把虚拟地址映射到实际的物理存储。这样上层软件不用关心数据到底在SRAM还是DDR里。运行时层的核心是任务图调度。一个神经网络可以表示成一张有向无环图每个节点是一个算子边是数据依赖。运行时需要根据硬件资源把这张图调度到不同的计算单元上同时管理数据搬运和同步。实操心得运行时调度最容易出的问题是死锁。我建议在调度器里加一个超时机制任何任务超过预期时间还没完成就报错方便定位问题。另外任务图的依赖关系一定要做静态检查避免循环依赖。3.2 编译器后端的关键技术编译器是软件栈里最难的部分。AI编译器要做的事情简单说就是把高层框架的算子图映射到硬件的指令序列上。这个过程涉及算子融合、内存分配、指令调度、量化等多个环节。算子融合是最能提升性能的优化。比如ConvBNReLU这三个算子如果不融合需要写三次内存、读三次内存融合之后数据在寄存器里就算完了内存访问量降到1/3。我实测过一个网络融合前后性能差了2.3倍。内存分配是另一个大头。AI芯片的片上缓存有限怎么把有限的缓存分配给不同的张量直接影响性能。常用的策略有内存池、生命周期分析、原地操作。内存池是预分配一块大内存按需切分生命周期分析是找出每个张量的活跃区间复用不重叠的内存原地操作是让输出直接覆盖输入省掉一份内存。指令调度要考虑流水线并行、数据依赖、资源冲突。好的调度能让计算单元和DMA同时工作把利用率拉满。我习惯用列表调度算法先算每个节点的优先级然后按优先级依次分配资源。3.3 框架适配与算子库建设框架层是给用户用的要尽量屏蔽硬件细节。主流做法是提供一个自定义算子接口让框架能调用硬件加速器。比如在PyTorch里注册一个自定义算子底层调用芯片的运行时库。算子库的建设是个长期活。我建议先覆盖常用算子再逐步扩展。常用算子包括卷积、全连接、池化、激活、归一化、softmax。这些覆盖了90%以上的网络。剩下的长尾算子可以用CPU回退或者用可编程计算单元实现。算子库的性能优化有几个方向向量化、流水线、多核并行、数据预取。向量化是利用硬件的SIMD能力一次处理多个数据流水线是让不同阶段重叠执行多核并行是把大算子拆到多个核上数据预取是提前把数据搬到缓存里。4. 协同验证与性能调优实录软硬件都做完了能不能跑起来、跑得好就看验证和调优了。这个阶段最容易暴露问题也最能体现团队的水平。4.1 功能验证的完整流程功能验证分三个层次模块级、子系统级、系统级。模块级验证针对单个硬件模块比如计算阵列、DMA、缓存控制器。用SystemVerilog或UVM搭建测试平台跑随机激励检查输出是否符合预期。这个阶段要尽量覆盖边界情况比如缓存满、DMA冲突、计算溢出。子系统级验证把多个模块连起来验证它们之间的交互。比如计算阵列和缓存的读写、DMA和计算的重叠。这个阶段要用真实的算子序列做激励比如一个完整的卷积层。系统级验证在FPGA原型或仿真平台上跑完整的网络。这个阶段最接近真实场景能发现很多模块级和子系统级发现不了的问题。我建议至少跑三个网络一个CNN如ResNet、一个Transformer如BERT、一个检测网络如YOLO。注意事项验证时一定要做覆盖率收集包括代码覆盖率、功能覆盖率、断言覆盖率。覆盖率不达标就说明验证不充分不能 tapeout。4.2 性能调优的实操案例性能调优是个细活我拿一个真实案例来讲。某边缘AI芯片标称算力4TOPS跑MobileNetV2只有80fps目标是要到200fps。第一步profiling。用硬件计数器收集每个算子的执行时间、内存访问量、计算单元利用率。发现瓶颈在深度可分离卷积利用率只有25%。第二步分析原因。深度可分离卷积的通道数少计算量小但内存访问量大。硬件的数据复用机制没生效每次都要从DDR读数据。第三步优化方案。把多个深度卷积合并成一个增加通道数调整数据布局让连续的数据在内存里也连续用DMA预取下一层的数据。第四步验证效果。优化后深度可分离卷积利用率提到65%整体帧率到180fps。再微调了一下调度策略最终到210fps。这个案例说明性能瓶颈往往不在计算而在数据搬运。调优时要先看内存访问模式再看计算利用率。4.3 常见问题速查表问题现象可能原因排查方法解决方案算力利用率低数据供给不足看DMA带宽和缓存命中率优化数据复用增加预取精度不达标量化误差累积逐层对比浮点和量化结果调整量化策略混合精度死锁任务依赖成环检查任务图打破循环依赖加超时功耗超标频率过高或电压过高看功耗分布降频降压时钟门控编译时间过长搜索空间太大看编译器日志限制搜索空间加启发式算子不支持硬件指令集缺失看算子列表软件回退或硬件扩展4.4 流片前的检查清单流片是最后一道关过了就改不了了。我整理了一份检查清单每次流片前逐项过功能验证覆盖率是否达标代码95%功能100%时序是否收敛WNS0TNS0功耗是否在预算内典型场景和 worst case 都要看DFT是否完整扫描链、MBIST、边界扫描封装和引脚是否确认软件栈是否能在FPGA上跑通完整网络是否有backup方案万一流片失败怎么办这份清单看起来简单但每项背后都是一堆工作。我见过一个项目功能验证都过了但忘了做MBIST流片回来发现SRAM有坏块整批芯片报废。5. 软硬件接口的标准化与扩展软硬件接口是协同设计的抓手。接口定义得好软硬件可以并行开发定义得不好两边互相等项目进度拖慢。5.1 接口定义的核心要素一个完整的软硬件接口应该包括指令集架构硬件支持哪些指令每条指令的编码格式、操作数、语义。寄存器映射哪些寄存器控制什么功能读写权限是什么。内存映射哪些地址段对应哪些存储访问属性是什么。中断机制硬件什么时候产生中断软件怎么响应。同步原语多核之间、计算和DMA之间怎么同步。接口定义要用文档固化下来最好用机器可读的格式如JSON或YAML这样软件可以自动生成头文件硬件可以自动生成验证平台。5.2 可扩展性设计AI算法迭代很快今天支持的算子明天可能就过时了。接口设计要留扩展余地。一种做法是预留指令空间。比如指令编码里留几位作为扩展位未来可以定义新指令。另一种做法是可编程计算单元用微码或FPGA的方式实现新算子。我倾向于混合方案固定功能单元覆盖常用算子可编程单元覆盖长尾算子。这样既能保证常用算子的能效又能适应算法变化。5.3 跨平台软件栈的考虑如果芯片有多个型号或者要兼容其他硬件软件栈要设计成可移植的。关键是把硬件相关的部分抽象成接口比如// 硬件抽象层接口示例 typedef struct { int (*init)(void); int (*alloc_mem)(size_t size); int (*free_mem)(void* ptr); int (*launch_kernel)(Kernel* kernel, void* args); int (*sync)(void); } HardwareOps;这样上层软件只依赖HardwareOps接口换硬件时只需要实现新的HardwareOps。6. 项目实操中的经验与避坑指南最后这部分我分享一些文档里不会写、但实际项目中非常重要的经验。6.1 团队协作的实操建议软硬件协同设计最大的挑战不是技术是沟通。硬件工程师和软件工程师的思维方式不一样硬件喜欢确定性的、时序精确的东西软件喜欢灵活的、可抽象的东西。两边坐在一起讨论时经常鸡同鸭讲。我的建议是用数据说话用原型验证。不要争论“这样设计好不好”而是做一个快速原型跑一下看数据。FPGA原型是很好的沟通工具软件工程师能在上面跑真实网络硬件工程师能看到真实负载。另外接口文档要先行。软硬件接口定下来之后两边就可以并行开发。接口变更要走变更流程评估影响范围。6.2 成本与周期的现实考量AI芯片项目动辄几千万到几亿的投入周期一年半到三年。成本主要分几块人力成本、IP授权费、流片费、封装测试费、软件生态建设费。流片费是大头先进工艺一次流片几千万。所以第一版芯片不要追求完美先做一个能跑通的版本验证核心架构第二版再优化。这叫小步快跑。软件生态建设容易被低估。硬件流片回来软件跑不通芯片就是砖头。我建议软件团队从项目第一天就介入和硬件团队一起定义接口提前开发驱动和编译器。6.3 未来演进方向的个人判断AI芯片的未来我个人看好几个方向Chiplet把大芯片拆成小芯片用先进封装连起来提高良率降低成本。存内计算把计算单元放进存储阵列里突破冯诺依曼瓶颈能效比提升一个数量级。光计算用光信号做计算速度快、功耗低但工艺还不成熟。可重构架构硬件可以根据算法动态重构兼顾灵活性和效率。这些方向都有团队在做但离大规模商用还有距离。如果你现在要做AI芯片我建议先把成熟的架构做好再考虑前沿方向。毕竟芯片是工程不是科研可靠性比先进性更重要。最后分享一个小技巧做AI芯片项目时一定要建一个性能模型用Python或C写一个周期精确的模拟器。这个模型可以在硬件还没做出来的时候就评估不同架构的性能和功耗。我每个项目都会花两周时间建这个模型后面省下的时间远超这两周。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑