ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

自研芯片从设计到量产:如何定义和验证‘快’

自研芯片从设计到量产:如何定义和验证‘快’ 我们造了一颗芯片而且它很快。这句话听起来像一句爽文总结但真正把芯片项目做完一轮之后我反而对“很快”这两个字越来越谨慎。一颗芯片从立项到上板验证最难的往往不是把逻辑写出来而是怎么定义快、怎么测快、怎么证明它稳定地快。下面以自研芯片项目的完整链路为主线从需求定义、架构拆分、验证方法、SoC 启动、驱动调试、性能分析到量产前的检查逐步讲清楚一个项目组在说“我们造了一颗芯片而且它很快”之前到底要经历哪些事。适合哪些人看正在做嵌入式芯片选型或方案评估的工程师刚接触芯片后端、芯片测试、SoC 启动和 AI 芯片驱动开发的同学以及准备上自研芯片项目但还没有做过全流程评估的团队。看完至少要明白一件事芯片真正的性能不是跑一个 demo 跑出来的是拆成延迟、吞吐、资源占用、功耗、稳定性和生态适配之后一项一项验证出来的。1. 造芯片之前先定义“快”到底指什么1.1 你需要的是一颗什么样的芯片很多项目把“造芯片”理解成“设计一颗 CPU”。实际上大多数自研芯片团队并不需要做通用处理器而是针对某一个或几个重复出现的任务做专用加速芯片。比如边缘 AI 推理、图像预处理、加密计算、音视频编解码。这类芯片的定位更接近“协处理器”主控芯片负责调度协处理器负责把最耗时的计算任务加速。所以第一条建议在写任何 RTL 之前先把“快”翻译成具体的场景。是单次任务延迟要缩短还是每秒能处理的请求数要增加是功耗约束下做到同样算力还是必须跑在某个特定操作系统里如果这些问题没有答案后续的所有测试都会变成自说自话。芯片形态也需要提前分清SoC、MCU、ASIC 加速器、FPGA 原型甚至电源管理芯片和接口芯片属于完全不同的开发路径。“嵌入式芯片与系统”这个概念本身就很宽热词里能看到的 DCDC 芯片、充电芯片、LED 驱动芯片和数字逻辑芯片的开发方法差别非常大。项目标题里说“它很快”通常意味着数字逻辑部分有明确性能诉求而不是只管供电或接口。1.2 选对参照物RK3588、STM32、ESP32 都不是同一个赛道设计芯片一定要先选参照物。我们当时选了三个方向做对比和 STM32 这类 MCU 比属于嵌入式控制领域裸机或 RTOS 环境资源紧张启动链路简单但算力天花板很低。和 ESP32 这类无线 MCU 比重点是联网能力和低功耗做协议类任务更合适不适合做重计算。和 RK3588 这类应用处理器比能跑 Linux能跑复杂算法生态成熟但功耗和成本都高不适合所有场景。自研芯片最忌“什么都想比一比”。一颗专用芯片只要在目标场景里比通用方案更有价值就已经算成功。比如只做某个固定尺寸的图像缩放也许不需要 GPU一块很小的硬件加速逻辑就能比通用处理器快很多。问题是这个优势必须在真实链路里被测量出来而不是在表里比较参数。更具体一点可以参考下面这个对比思路参照平台典型场景自研芯片想替代它核心优势应该是什么STM32 类 MCU裸机控制、简单信号处理更低成本、更低功耗、更小的裸片面积或者专用算法加速ESP32 类无线 MCU无线连接、轻量物联网更低的待机功耗、更稳定的射频链路或者协议处理加速RK3588 类应用处理器Linux 系统、多媒体、边缘 AI单任务吞吐更高、单位功耗算力更高或者 BSP 更轻量这颗芯片可能不是最快的但在某一个场景里它必须比通用方案更合适。这是立项时最需要想清楚的事。1.3 架构选择直接决定性能上限架构阶段需要确定几件事数据位宽、总线结构、存储层次、时钟策略、是否走 DMA。原因很简单芯片的算力上限在架构阶段就已经被锁死了后面靠后端优化只能改善时序很难改变吞吐能力。比如做矩阵运算加速常见做法是设计一组并行计算单元通过 DMA 从 DDR 取数据计算结果写回。这里最影响性能的不是计算单元本身而是数据搬运带宽。很多团队把计算单元做得很强但总线和存储带宽跟不上最终实际吞吐只有理论值的零头。所以如果你要和别人讨论芯片性能不要只盯着“频率”和“算力”先看数据通路的瓶颈在哪。这样后面做性能分析时才知道该优化哪里。2. 设计阶段最耗时间的不是写 RTL是验证2.1 前端、后端、验证三件事的边界芯片项目通常分成三条线前端设计写 RTL定义模块功能和接口。验证用仿真、断言、覆盖率检查尽力找出逻辑 bug。后端综合、布局布线、时序收敛、物理实现。大多数人一开始只关注前端设计结果流片回来才发现问题。芯片后端决定的是“能不能在目标频率下稳定跑”验证决定的是“逻辑对不对”。两者缺一不可。“芯片后端”这个词看起来离软件开发很远但它直接影响“很快”能不能成立。如果综合后时序无法收敛你设计里的高主频就是个摆设实际只能降频运行。这块没有捷径只能通过调整流水线、优化关键路径、约束时钟树来做。2.2 仿真验证要覆盖边界而不是只跑 happy path仿真阶段最常见的错误是只跑功能正常的样例。比如一个模块应该处理 4 字节数据测试用例全用 4 字节等到实际场景碰到非对齐地址、空数据、超过缓存大小的输入时就会在硬件上出现偶发异常。验证的关键是构造边界条件最大输入、最小输入、空输入、异常状态、并发访问、中断到来时的数据一致性。这些用例在 RTL 仿真阶段能跑通后面上板才会省心。芯片测试这个词范围很大包括晶圆测试、封装后测试、系统级测试。设计团队最容易忽略的是系统级测试因为它在真实环境中把芯片和软件跑在一起很多逻辑 bug 其实是在这个环节暴露的。2.3 FPGA 原型验证上板前最值得做的一步在流片之前FPGA 原型是最接近真实硬件的验证手段。我们可以把 RTL 综合到 FPGA 上接上真实外设跑真实操作系统和驱动。好处是验证速度快调试方便很多问题能提前暴露。坏处是 FPGA 的时序和真实 ASIC 不完全一致频率、功耗、延迟都不能直接当成最终结果。不过从软件工程师的角度看FPGA 原型也是驱动开发的起点。AI 芯片驱动开发、SoC 启动跑通、外设接口验证都可以先在 FPGA 上完成。这个过程会让我们提前知道芯片软件栈需要哪些东西而不是等芯片回来了才手忙脚乱。3. “很快”要怎么测性能指标的五个层次3.1 先建立端到端任务别拿点灯当性能结果芯片刚回来第一件事一定是点灯、打印串口日志、跑基础寄存器读写。这些只能证明芯片活着不能证明性能达标。要证明“快”必须有一个端到端任务输入数据进入芯片经过处理输出结果。比如一个图像缩放任务从图片送入 DDR到处理完写回 DDR再到 CPU 读取结果整个链路花多少时间。这个时间才是用户能感知的快慢。判断标准很简单把任务拆成“采集输入 — 搬运数据 — 计算 — 搬出结果 — 生成输出”五段逐段计时。哪个阶段占比最高下一步就优化哪里。3.2 延迟、吞吐、排队三个数字必须分开看单任务延迟是指一个任务从请求开始到结果完成的时间。它适合评估交互式场景比如控制指令响应。吞吐量是指单位时间能完成多少个任务。它适合评估数据流型场景比如视频编解码、批量图像处理。还有一个容易被忽略的指标是排队时间。当多个请求同时到达或者任务还没结束时又有新任务进来系统会不会互相阻塞我们在测试中发现有些模块单任务延迟很好但连续批量跑时因为缓冲区和总线竞争吞吐会明显下降。所以性能测试不能只跑一次要多条任务连续跑统计平均耗时、最大耗时、最小耗时和尾部延迟。3.3 资源占用和功耗快得“贵”也是问题一个加速单元如果快但占用了几乎所有总线和内存带宽导致主 CPU 无法正常响应中断那整体系统并没有变快。需要同时记录的指标至少包括内存占用、DMA 带宽占用、CPU 占用率、功耗和温度。对于嵌入式芯片与系统功耗往往比性能更敏感。一个小体积设备如果芯片算力翻倍但温度过高最后只能降频使用等于没快。3.4 性能测试的可复现性自动化脚本和日志缺一不可手工测试最大的问题是不可复现。之前我们调过一个问题某次测试显得很快换一个人跑或者换一个输入文件数据完全变了。后来我们固定了测试方法用同一批输入数据生成固定格式的日志记录每次任务的开始时间、结束时间、资源占用、返回值。脚本必须能重复跑跑完自动出报告。这样在后续优化驱动和参数时才有对比依据。4. 从最小系统到 SoC 启动驱动和调试的坑4.1 先搭最小系统电源、时钟、复位、调试口芯片上板之后先不要急着跑完整软件先搭最小系统。CPU 上电后执行的第一段代码可能来自 Boot ROM也可能来自外部 Flash看芯片设计。启动失败的排查顺序通常是电源电压是否稳定、时钟是否起振、复位时序是否正常、调试接口能不能连接。很多时候问题不在芯片逻辑而在外部的去耦电容不够、电源纹波太大、复位引脚毛刺这类问题量示波器和逻辑分析仪比改代码更有效。4.2 SoC 芯片启动为什么比 MCU 复杂做过 STM32、ESP32 这类 MCU 的工程师都知道有芯片包、有 IDE、有现成的启动文件几乎不用关心启动细节。但自研 SoC 没有这些现成资源。你要自己写或移植引导代码初始化 DDR配置存储控制器切页表才能进到 C 语言环境。这个过程最容易踩的坑是 DDR 初始化参数不对。寄存器配错一个值系统要么启动失败要么跑一段时间内存报错。所以 SoC 启动调试的核心就是先确认 CPU 在跑再确认 DDR 能读写再确认中断和外设正常一步一步往上垫。如果你用 keil、STM32CubeMX 习惯了自研芯片上很容易找不到工具链支持。很多开发工具只支持已知芯片新芯片要自己扩展 Flash 算法或者用命令行工具链。用 J-Flash 这类烧录器时芯片型号列表里可能没有新器件需要自己配置烧录算法。所以团队里至少要有一个熟悉链路的人从启动代码到烧录配置都能改。4.3 AI 芯片驱动开发不要让驱动吃掉硬件的速度AI 芯片驱动和普通外设驱动不太一样。除了配置寄存器还要处理内存分配、DMA 描述符、中断、缓存一致性。很多时候硬件加速器算得很快但驱动层频繁地分配内存、同步缓存、轮询状态导致整体速度还不如纯软件。我一般建议先把寄存器级驱动跑通再封装成基础接口最后再给上层算法调用。每一步都做一个小测试验证延时是否和预期一致。不要一上来就把驱动写得很复杂否则出问题很难定位。驱动层面还要特别注意缓存一致性问题。如果 CPU 和硬件加速器共享一块内存CPU 写完数据后没有做 cache clean硬件加速器可能读到旧数据硬件写完后没有做 cache invalidateCPU 也可能读到旧数据。这个坑很容易被当成芯片 bug实际是软件没有正确管理缓存。4.4 上板调试工具串口、逻辑分析仪、JTAG、示波器调 SoC 启动串口是最重要的通道。bootloader 阶段打印的信息量少但足够判断卡在哪一步。逻辑分析仪适合看时序比如 SPI、SDIO、DDR 命令。示波器看电源纹波和时钟信号。JTAG 负责停下来看 CPU 内部寄存器。工具不用一次上齐但至少要保证串口和 JTAG 可用。调试时先看日志再量波形不要一上来就猜代码。5. 输出异常时按这个顺序排查5.1 先分现象再决定排查方向芯片相关问题最容易误判因为现象可能来自硬件也可能来自软件。我把现象分成四类完全无输出可能是启动失败、时钟未起振、Flash 没烧录、串口引脚错误。输出错误可能是算法实现错误、输入数据排列不对、DDR 读写异常。偶发错误可能是时序问题、电源噪声、中断竞争、缓存一致性问题。速度不达标可能是总线带宽不足、驱动等待太长、缓存未命中太多。不同现象对应的排查链路完全不同。上来就改代码通常效率最低。5.2 我的排查顺序输入 → 环境 → 参数 → 工具链 → 芯片本身第一步看输入。文件格式、字节序、数据结构、长度是不是和测试用例一致。很多“芯片算错”其实是输入给错了。第二步看环境。电压是否稳定、温度是否过高、时钟是否准确、DDR 有没有报错。第三步看参数。驱动参数、DMA 描述符、内存地址对齐、中断申请方式任何一项配置错都会导致异常。第四步看工具链。编译器版本、链接脚本、烧录算法、调试器驱动都可能引入问题。第五步才怀疑芯片本身。而且怀疑芯片时也要先从设计文档、RTL 仿真波形、后端时序报告查起而不是直接断定是制造问题。5.3 常见的三种误判第一种把驱动 bug 当成芯片 bug。驱动里一个寄存器写错值现象和硬件故障很像。第二种把输入格式问题当成性能问题。比如测试数据本身有大量非对齐访问导致总线上多传输了很多无效字节速度自然上不去。第三种把功耗温升当成逻辑挂死。高压高负载下芯片温度升高频率自动降低看起来像性能变差实际是热设计没做好。5.4 低配置环境下能不能开发验证如果你没有高性能服务器和昂贵 EDA 工具也可以在低配置环境里开始学习用开源工具链做 RTL 仿真用 FPGA 开发板验证原型。低配置能跑通不代表适合批量验证但足以做功能验证和性能趋势判断。真正做大规模回归测试、跑复杂 SoC 仿真时还是要有内存和磁盘足够的机器不然仿真时间会拖到无法接受。这个边界要提前知道不要等任务卡住了才意识到。6. 从“我们造了一颗芯片”到真正能交付6.1 流片回来只是样品不是终点芯片从工厂回来后要做的工作比设计阶段还多。第一批芯片数量有限可能出现部分芯片功能异常、频率窗口不一、温度和电压边界不同的问题。芯片测试在量产阶段不是“测一次能不能跑”而是要测出每个芯片在不同电压、温度、频率下的行为判断良率。ATE 测试、老化测试、温度循环这些对量产产品很重要。如果只是实验室原型至少也要跑长时间压力测试比如连续工作 24 小时、反复启动和掉电确认没有偶发故障。6.2 性能验证要覆盖电压、温度和时间芯片频率不是锁定一个固定值就万事大吉。温度升高时芯片稳定性会变化。电压降低后时序裕量会变化。所以做“很快”的结论时要注明测试条件环境温度、供电电压、散热方式、运行时长。如果散热不好芯片在高负载下持续跑温度升高可能触发降频这时“快”就变得不稳定。量产级验证通常会让芯片在高温、低温、高电压、低电压下各跑一轮确定安全窗口。6.3 生态和工具链决定芯片能不能被用起来一个芯片算得再快如果工程师无法方便地编译程序、烧录、调试也很难推广。对比 STM32 的生态完整的芯片包、IDE、示例代码、社区资料让新手几小时就能跑起来。RK3588 有现成的 BSP 和系统镜像软件团队可以快速切入。自研芯片最缺的往往就是这部分。至少要准备工具链支持、烧录方法、最小系统启动包、寄存器手册、驱动例程、常见问题文档。没有这些东西后面每个使用者都会踩一遍我们已经踩过的坑。6.4 项目组最该盯住的不是口号是边界“我们造了一颗芯片而且它很快”这句话只有在把测试条件写清楚之后才有意义。到底是哪个任务快、和谁比快、在什么电压温度下快、能稳定跑多久这些边界问题才是项目真正价值所在。如果让我给一个建议先做单任务验证再做批量任务先保证输出正确再谈优化性能先把日志和测试用例管理好再谈自动化回归。芯片项目永远不缺惊喜缺的是把每一个“快”都落到可测量、可复现的实验记录里。踩过几次之后我发现很多问题不是芯片能力不够而是前置环境和输入材料没有处理干净。先把“快”变成一个可追问的问题这颗芯片才真正算数。
返回列表