资讯动态

AI芯片软硬件协同设计:从SoC启动到模型推理的完整链路

发布时间:2026/10/27 16:51:15 来源:尧图企业网站定制
做AI芯片这几年我最深的体会是真正难的不是把NPU算力堆上去而是让软件能把这笔算力“支取”出来。“AI 芯片的软硬件设计”这个系列我想把自己在SoC启动、芯片后端、驱动与AI软件栈之间来回折腾的经验拆开揉碎讲清楚。本文是系列第一篇适合三类人想入行AI芯片的在校生、做嵌入式开发要接NPU/GPU的工程师、以及做芯片前端后端想了解软件视角的设计师。你会看到一颗芯片如何从复位向量一路跑到AI模型推理中途每一个软硬件交点到底是靠什么决策的。1. AI芯片软硬件协同设计的全局拆解1.1 为什么AI芯片不能只堆硬件一款AI芯片的指标单上最抓眼球的通常是TOPS/W。但芯片最终交付的价值不是“能跑多少理论算力”而是“能把多少实际模型跑得又快又稳”。我见过不少芯片标称几十TOPS跑个ResNet勉强还行一上Transformer就露馅实际利用率不到30%。原因不在算力宏单元而在软件栈算子库缺这缺那、编译器生成的指令低效、数据搬运占掉大半时间。另一个现实是AI模型的结构迭代太快。从CNN到Transformer再到各类多模态大模型硬件如果只盯着一两个算子做固化加速过两年就会被新模型结构甩开。所以“软硬件协同设计”不是一句口号而是从架构定义阶段就必须一起做的事。硬件要留出通用可编程的余地软件要尽早介入硬件规格评审否则等RTL冻结后再想把新算子支持上去代价可能是重新流片。我常给团队打一个比方硬件是城市的道路和立交桥软件是交通调度系统。道路建得再宽如果红绿灯配不好、导航软件不更新高峰一样堵死。AI芯片就是一座专门跑AI车流的城市道路规划硬件架构和调度策略软件栈必须一起设计。1.2 从系统视角看软硬件边界软硬件协同不是说所有东西都混在一起做而是要把边界划清楚。一个成熟的AI SoC至少要在下面四个边界上达成一致。指令边界。CPU和NPU/GPU之间不是“各干各的”而是通过指令描述符交互。硬件侧要定义任务队列、寄存器接口、命令格式软件侧按照约定填充描述符交给硬件调度器执行。这个边界一旦确定后续驱动、编译器、运行时都围绕它展开改一个字段都要牵动全栈。数据边界。加速器是直接访问CPU的内存还是有自己的独立内存现在主流AI芯片倾向统一内存地址空间减少拷贝动作但代价是要做Cache一致性或IOMMU管理。数据边界还涉及buffer对齐、页表映射和DMA访问权限软件往往要在这里吃透硬件手册。同步边界。硬件执行完一个kernel后怎么通知软件常用中断、事件计数、或者软件轮询。同步方式直接影响推理延迟和CPU占用率。设计不好模型推理明明很快CPU因为等待忙轮询整机功耗却居高不下。安全边界。安全启动、密钥管理、运行隔离这些是SoC的基础能力。大模型时代还多了“服务和用户数据隔离”的需求多租户场景下不能让一个任务越权读到另一个任务的权重或上下文。边界划分的产物就是那本几百页的“软硬件接口手册”。我参与过的项目里最痛苦的不是写手册而是手册发布后才发现某个功能忘了定义导致前端、软件、验证三方各按各的理解实现最后联调时对不上。1.3 一个典型AI芯片的软硬件分层站在系统角度看AI芯片的软硬件可以分成六层每一层都依赖下一层提供的能力应用层PyTorch、TensorFlow、Triton推理服务以及上层AI Agent框架。 图优化层把模型计算图做算子融合、剪枝、常量折叠输出优化后的计算图。 编译器与运行时层算子选择、任务切分、内存规划、kernel生成、任务下发。 驱动层内核态驱动、IOMMU/MMU配置、中断处理、电源管理。 固件层BootROM、ATF、U-Boot、SCP/MCU固件、安全监控。 硬件层CPU、GPU/NPU、DSP、总线、DDR控制器、外设。这六层不是严格单向依赖。比如AI Agent框架可能需要硬件提供多任务隔离编译器要查询硬件能力寄存器决定算子实现策略BootROM又要从硬件里的eFuse读取安全配置。软硬件协同设计本质上是让这些层之间的接口尽早稳定下来并且每一层都清楚自己能为上层提供什么、对下层有什么要求。一个典型的AI推理过程从应用层发起请求框架将模型转换为计算图编译器把图切分成能在NPU上运行的tiles运行时分配内存并提交命令描述符驱动将描述符写入硬件队列硬件状态机取走描述符并控制计算单元执行。整个过程涉及至少四层软件和两层硬件任何一层出现瓶颈最终都会体现在帧率或令牌生成速度上。2. 硬件侧设计要点从SoC启动到后端实现2.1 SoC芯片启动流程与BootROM设计SoC上电后的第一步是启动这是软硬件设计的第一个正面交锋。CPU复位后从固定地址取指这个地址通常是BootROM——芯片出厂固化的只读代码。BootROM要完成的工作可以归纳为三件事初始化最小系统、验证下一级镜像、把控制权交出去。最小系统包括时钟、DDR、存储控制器。DDR初始化其实是个很“软”的过程需要软件对DDR PHY做训练调整读写延迟、驱动强度、均衡参数。硬件侧提供训练相关的状态寄存器和握手信号软件侧跑训练算法。看起来是软件在做判断但训练算法必须适配硬件的物理实现这就是典型的软硬件纠缠。安全启动是BootROM的重头戏。现在的AI芯片都支持安全启动BootROM里固化验签公钥的哈希上电后用硬件密码引擎校验U-Boot等镜像的签名。这里有个设计细节验签逻辑尽量下放到硬件密码引擎因为BootROM代码没法像U-Boot那样随时打补丁一旦存在漏洞可能只能靠掩膜重新流片来修复。软件团队通常会在BootROM里做极简实现把复杂逻辑留给下一级引导程序。启动介质的选择也很有意思。QSPI Flash、eMMC、SD卡、UART、USB都可能作为启动源。芯片通过采flock启动引脚的电平决定从哪启动软件需要在BootROM里按优先级顺序遍历。很多工程师换了一颗QSPI Flash发现系统起不来就是因为QSPI控制器的时序配置和Flash型号不完全匹配软件需要针对具体Flash调整SPI模式、读取命令、Dummy Cycle等参数。这种问题到量产阶段特别折磨人所以我一直建议BootROM和后续Bootloader要支持通过设备树或环境变量覆盖Flash参数而不是把某个Flash型号的时序硬编码进死代码里。2.2 芯片后端设计中的关键权衡芯片后端对于很多软件工程师来说比较陌生但软硬件协同在这里同样重要。后端Backend指的是从RTL到GDSII的物理实现过程包括逻辑综合、布局布线、时钟树综合、时序收敛、功耗分析、DRC/LVS等。AI芯片因为计算阵列规模大、片上网络复杂后端更容易遇到挑战。功耗是第一个关键权衡。AI芯片在跑大模型时NPU阵列满负荷工作动态功耗和IR drop都很突出。硬件的做法是划分多电压域支持DVFS软件侧则要配合调频调压在负载低时降低频率和电压。这里的配合要非常精细NPU对电压变化敏感如果电压下降过快或频率切换时机不对可能导致计算错误。软硬件需要定义明确的调压调频协议比如先升压再升频、先降频再降压。时钟是另一个容易出问题的地方。CPU、NPU、DDR、外设往往工作在不同时钟域跨时钟域信号需要同步器时钟树综合要尽量降低skew。软件配置PLL分频时必须严格遵守硬件手册的锁定时间和切换步骤。我见过一个案子工程师在跑AI负载时动态调高NPU频率没有等PLL锁定就下发任务结果出现偶发性的计算错误很难复现查了很久才发现是PLL没锁稳。可布线性也和前端架构强相关。AI计算阵列的排布、NoC的布局、SRAM宏单元的位置直接决定后端能不能顺利收敛。好的芯片架构师会在早期做Floorplan估算和后端团队同步迭代而不是等RTL freeze后才让后端硬着头皮布线。另外量产测试也需要软硬件协同。DFT扫描链、BIST、调试接口的设计会影响测试时间软件在硅后测试要能快速跑一个sanity test确认芯片基本功能正常。2.3 电源、时钟与看门狗芯片的搭配AI SoC的电源管理相当复杂。CPU核心、NPU、DDR、IO可能需要不同电压通常由PMIC提供多路输出。PMIC本身有自己的控制逻辑SoC通过I2C/SPI接口与PMIC通信设置输出电压和上电时序。软件在启动流程里必须正确初始化PMIC否则后续DDR初始化、NPU使用都会出问题。这里有一个很容易踩的坑DDR电压和SoC核心电压之间的上电时序如果不对可能导致锁存器异常。外部看门狗芯片是系统稳定性的最后防线。AI应用的特点是高负载、长任务CPU可能长时间被计算任务占用如果喂狗机制设计得不好系统会频繁被误复位。我建议的设计是喂狗动作放在最高优先级的中断或独立MCU中并且让硬件NPU在计算时周期性更新一个“运行水位”寄存器看门狗检查的不是CPU是否响应而是整个SoC是否有计算进展。这样既能防死锁又不会因为高负载而误杀。时钟芯片的选择同样不能马虎。SerDes、DDR、PCIe都对参考时钟的抖动有严格要求低-quality的时钟源会造成随机性错误。软件要能在启动时读取时钟芯片的锁定状态没有锁定时暂停启动流程。配套的DPLL配置参考手册也最好做成表格式让软件可以直接查表。2.4 典型AI芯片硬件架构看协同设计以 RK3588 和 Jetson Orin Nano 为例这两款都是常见的AI边缘计算硬件。RK3588 内部集成了6 TOPS的NPUCPU是4×A764×A55整个SoC是大小核加独立NPU的结构。它的NPU有自己的MMU驱动和运行时通过ioctl和用户态库交互模型转换工具链是RKNN-Toolkit。这种架构下软硬件协同的关键在于模型转换后的中间表示能否完整表达NPU支持的所有算子如果不能就需要拆分到CPU上跑性能立刻掉一截。Jetson Orin Nano则是GPU DLADeep Learning Accelerator的架构。软件栈用CUDA、TensorRTGPU和DLA可以协同推理。这里软硬件协同的挑战在于DLA是固定功能单元能效高但灵活性低于GPUTensorRT需要通过profile配置决定哪些层放到DLA上跑哪些放到GPU上跑。实际使用中层级的layout转换和内存拷贝往往吃掉很多时间。所以NVIDIA提供了融合内存布局和算子选择策略这套策略本身也是软硬件协同设计的产物。这两颗芯片对比下来有一个共同点都提供统一内存地址空间CPU、NPU/GPU可访问同一物理内存省去了拷贝。但代价是要维护设备地址映射IOMMU和缓存一致性。软件在做内存管理时必须考虑buffer的对齐、cache clean操作、以及DMA map/unmap的开销。硬件能做的是提供高效的SMMU/IOMMU软件要注意避免频繁map/unmap带来的TLB抖动。3. 软件侧设计要点Bring-up、驱动与AI软件栈3.1 芯片Bring-up阶段软件做什么芯片流片回来的第一天才真正检验软硬件协同设计的成果。Bring-up的顺序很重要像剥洋葱一样一层层验证。第一步是最小系统电源、时钟、复位、JTAG。用调试器连接SoC读ID寄存器确认芯片活着。这一步如果失败通常不是软件问题而是板级硬件问题比如焊锡短路、电源没起来。第二步是让CPU跑最小程序。先用JTAG把一段极简代码加载到内部SRAM让CPU点亮一个GPIO或往串口打印字符。这一步能验证CPU取指、存储、中断控制器等基础逻辑。第三步才是DDR初始化DDR训练通过后可以把U-Boot加载进DDR跑起来。第四步启动Linux然后逐个使能外设和加速器。在Bring-up阶段软件工程师要养成一个习惯每次只改动一个变量。硅前仿真跑得好好的不代表硅后一定一样真实芯片会有各种噪声、时序、批量差异。如果一次同时启用了DMA、PCIe、NPU出了问题很难定位是哪个模块导致。我有一次在Bring-up时遇到随机死机排查了三天最后发现是某个外设的中断没有清pending标志导致中断风暴。这种问题在仿真环境中很难触发因为仿真用的中断时序太理想。另外建议在Bring-up阶段尽量打印丰富日志。BootROM、U-Boot、Linux kernel的启动日志都留下并且用硬件计数器和错误寄存器辅助定位。很多SoC设计会加入“诊断寄存器”专门记录最近一次总线错误、DMA错误地址、ECC错误信息。这些寄存器要尽早暴露给软件而不是等出了问题再在RTL里打补丁。3.2 设备驱动与内存管理AI加速器驱动的主流模式是“内核态只做必要的事用户态做重逻辑”。内核驱动负责设备初始化、中断、IOMMU配置、电源管理、内存映射用户态库负责模型加载、任务队列、内存池管理、同步。这种划分能减少系统调用次数提升批量推理的吞吐率。内存管理是驱动设计中最容易失衡的地方。加速器需要物理连续的DMA buffer内核驱动通常通过CMA分配器预留一块连续内存或者使用DMA-BUF在不同设备间共享。对AI推理来说输入输出张量会频繁变化大小需要支持Buffer池动态复用动态shape模型还可能要在运行时重新分配内存。如果内存分配逻辑太慢会拖延每个请求的响应时间。秘诀是使用环形缓冲区和预分配策略避免每次推理都走内核分配路径。IOMMU是现代AI芯片标配。它让用户态进程可以使用虚拟地址访问设备内存保护系统安全。但IOMMU page table更新代价不小高频率map/unmap会造成性能下降。硬件如果能提供IOMMU的快速flushing接口或CACHE bypass模式软件就要好好利用在设计推理路径时尽可能复用映射而不是每次请求都重新映射。驱动还要处理错误恢复。NPU在运行中可能遇到page fault、ECC错误、执行超时。一个健壮驱动的表现是检测到错误后把出错上下文记录下来回收被占用的buffer然后让运行时重新对当前请求排队而不是直接panic。这需要硬件提供错误状态寄存器和中断也需要软件在状态机里考虑“错误-恢复”路径。3.3 AI软件栈编译器、运行时、算子库AI软件栈是AI芯片真正能用的关键。光有驱动还不够跑模型需要三个组件紧密配合编译器、运行时、算子库。编译器负责把AI框架的计算图转成硬件可执行的代码。流程通常是从ONNX或自定义IR出发做算子融合比如把Convolution BatchNorm ReLU合成一个fused kernel然后做layout转换把NCHW转成硬件友好的NHWC、NC1HWCO等再做tiling把大矩阵切成能在本地SRAM放下的子块最后生成目标指令。AI芯片如果只能跑CNN编译器相对简单但要支持Transformer就得支持动态shape、变长attention、KV Cache管理等复杂逻辑。这也是为什么MLIR、TVM这类编译器基础设施在大模型时代越来越受重视。运行时负责的是和驱动的接口。它维护一个命令队列把kernel的启动指令、参数地址、同步事件封装成描述符。硬件支持“异步提交、批量执行”时运行时能显著提升吞吐。我记得在某颗芯片上因为驱动每提交一个kernel就要进一次内核态导致单算子延迟10微秒看起来不高但大模型有几百个算子乘下来就是几毫秒非常可观。后来改成批式提交性能立刻翻倍。算子库是手写的优化kernel集合。虽然编译器能生成通用kernel但手写算子往往能把极致性能发挥出来。例如针对卷积优化可以用Winograd或Implicit GEMM来减少乘法次数针对Attention可以用Online Softmax避免中间矩阵存储针对大模型推理还要实现PagedAttention和KV Cache管理。这些算子库代码通常是汇编级优化需要针对具体NPU的指令集、寄存器数量、内存延迟特性来调一轮轮试错。软硬件协同在这里很关键算子库实现方案要反馈给硬件架构师。如果某个算子因为硬件的累加器位宽不足而频繁溢出软件就得拆成多段计算用户体验变差如果硬件能提供连续短指令支持软件就能实现更高效的kernel。所以芯片公司里编译器团队和架构团队往往坐在一起办公不是没有原因的。3.4 AI大模型与AI Agent对芯片软件设计的反向要求过去AI芯片设计主要参考CNN的算子特性现在则要围绕大模型重新思考。大模型推理的瓶颈往往不在算力而在内存带宽和内存容量。一个7B参数模型即使采用INT4量化权重也有约3.5GB这已经超过很多边缘设备的内存。所以硬件架构要考虑大容量内存支持和高带宽存储软件栈要做权重分区、KV Cache管理、批量推理调度。大模型的另一个特点是动态shape。序列长度可变batch会动态变化硬件如果要求固定shape编译器就只能做padding浪费算力和内存。新一代AI芯片的NPU最好支持动态shape的运行时重配置软件才可能实现continuous batching。不支持的芯片就要靠编译器生成多档shape的kernel运行时查表选择灵活性差很多。AI Agent的出现对芯片提出了新的需求。一个agent任务可能是先做语音识别然后调用大模型做语义理解再调用视觉模型做OCR最后用文本模型生成回复。这需要多个模型在同一个SoC上高效切换或并行执行。硬件需要支持多任务隔离、快速上下文切换软件侧的agent runtime要能调用多个推理引擎并管理它们之间的数据流。这些需求其实正在把“以模型为中心”的调度推向“以任务图为中心”的调度。底层的软硬件设计也要随之演进比如NPU任务队列需要支持优先级和抢占驱动需要支持多进程安全隔离。4. 从硬件到AI负载落地的完整链路4.1 板级点亮到系统启动的实操流程纸上谈兵再多不如实操一回。假设你拿到一块基于RK3588或其他AI SoC的板子按下面顺序操作可以少走不少弯路。第一步检查原理图和硬件配置。确认boot引脚选择的是QSPI还是eMMC串口调试引脚是否接好PMIC的默认电压是否符合SoC要求。如果条件允许先用万用表量一下核心电压是否稳定避免一上电就烧芯片。第二步烧录镜像。一般SoC都有生产工具比如Rockchip的RKDevTool、NVIDIA的SDK Manager。进入烧录模式把引导镜像写入QSPI或eMMC。注意区分分区表MiniLoader、U-Boot、boot.img、rootfs各放在哪个偏移跟工具里的配置要对齐。第三步打开串口终端设置波特率上电观察日志。正常流程会看到BootROM打印、DDR训练日志、U-Boot启动信息。如果卡在早期八成是DDR配置问题如果卡在加载内核阶段检查设备树中内存大小、启动介质配置。第四步内核起来后用dmesg查看AI加速器的驱动加载情况。很多加速器还需要在系统里下载固件文件如.rknn、.bin等路径要和驱动匹配。如果驱动报错先确认设备树中节点reg、interrupt、clocks是否正确。第五步运行测试程序。先用芯片厂商自带的例程比如图像分类、目标检测。跑通后再用profiler查看NPU利用率、内存占用、算子耗时。这一步能快速发现软硬件协同中的瓶颈。如果NPU利用率低往往是因为tiling切得太大或太小、layout转换开销高。如果DDR带宽打满说明算子融合不够或者缓存策略没做好。4.2 在一块AI芯片上跑通LLM推理现在很多开发者想在边缘AI芯片上跑大模型我们以在RK3588/Jetson上跑小规模LLM为例个中流程值得讲清楚。首先选择模型。边缘芯片跑7B以上模型会比较吃力可以选0.5B~2B的模型比如Qwen2-0.5B、Phi-2等。模型下载后转成ONNX再做量化。RKNN-Toolkit或TensorRT都支持INT8/INT4量化。量化的关键是校准集要选有代表性的文本片段而不是随便用几个句子否则精度损失会很大。其次模型转换。RKNN-Toolkit会把ONNX模型解析成RKNN格式里面会有网络结构解析、算子支持度检查。如果有算子不支持就必须回到ONNX里修改子图把不支持的算子拆成CPU算子或者在模型层面做算子替换。这一步很耗时也是软硬件协同设计的真实写照硬件能力决定软件必须如何修正模型。再次编写推理程序。通常runtime SDK会提供C/C和Python API。你需要分配输入输出buffer设置生成参数循环执行推理。如果用的是流式生成还要处理KV Cache的管理。有些runtime已经封装好了llm接口但底层仍需要model的上下文长度、max tokens等参数。最后看性能。LLM性能通常用首token延迟和每秒生成token数来评估。我跑过一个0.5B INT8模型在RK3588上首token延迟大约几十毫秒生成速度几十token每秒边缘设备上已经算不错。但如果直接跑FP16延迟和带宽占用都会翻倍。所以量化不是可选项而是部署大模型的必需品。4.3 性能调优算子融合、内存带宽与量化AI芯片性能调优本质上是在硬件限制下让数据流动更快。三条主线很清晰减少数据搬运、增加计算密度、压低精度需求。算子融合是减少数据搬运最直接的手段。把ConvBNReLU融合成一个kernel中间结果不用写回DDR而是留在片上SRAM里继续算。一个典型的CNN模型经过算子融合访存次数可以减少30%~50%。对大模型来说QKV投影内部的多个矩阵乘往往可以拼接成一个大GEMM一次读取权重连续计算能有效提高DDR带宽利用率。tiling策略决定片上缓存利用率。把一个大GEMM切成若干block切太大导致缓存溢出切太小导致启动开销过大。好的策略是根据NPU的SRAM大小、DDR延迟、权重布局来动态决定tile尺寸。这需要编译器做cost model也要运行时在真实硬件上profiling反馈。量化是另一条必由之路。INT8相比FP16计算吞吐可以翻倍内存占用减半。INT4还能进一步压缩但现在很多NPU对INT4支持不够成熟需要软件做小规模权重分块和反量化补偿。量化方式上per-tensor比较简单但精度损失大per-channel和per-group效果好一些需要校准工具不断迭代。除此之外激活值用outlier-aware量化也能在精度和性能之间取得平衡。多引擎并行调度同样重要。如果SoC里既有GPU又有NPU或者NPU有多个核软件要能跨引擎切分模型。比如把大模型的不同层分配到两个NPU核上并行计算或者把batch拆开流水线处理。这里最怕的就是引擎间同步开销过大反而比单核跑更慢。所以调度算法要综合考虑引擎性能差异、内存带宽共享和同步成本。4.4 软硬件协同排查技巧速查以下是我总结的AI芯片软硬件协同问题排查表按症状列出来能省去很多“拆东墙补西墙”的时间。症状可能原因排查手段上电无任何输出电源、时钟、复位异常示波器量电源/时钟检查reset按键电平JTAG连接读ID启动卡在DDR训练DDR配置错误或板级走线问题检查设备树中的DDR型号、频率、时序用DDR training log定位U-Boot启动后无法挂载rootfs存储介质设备树配置错误检查存储控制器节点、分区表、内核命令行的root参数驱动加载失败设备树资源冲突或固件缺失dmesg报错定位中断号、寄存器基地址、固件路径推理结果错误量化精度问题、算子溢出、缓存一致性问题单算子对比CPU结果关闭量化对比打开cache clean/flush测试NPU利用率低tiling不当、内存竞争、驱动提交延迟用profiler看算子耗时分布调整tile大小和队列深度偶发性死机或复位电压不稳、时钟抖动、看门狗误复位打开watchdog日志、电源监控寄存器复现时抓波形任务卡死但CPU仍在运行NPU等待同步信号或死锁用JTAG或诊断寄存器查NPU状态机检查中断是否丢失排查的基本原则是“由静到动、由点到面”。先保证静态通路正确再查动态调度先验证单个算子再跑完整模型先关掉所有不确定性比如DVFS、看门狗、动态时钟再逐个打开。5. 实战经验我踩过的几个软硬件协同坑5.1 QSPI Flash选型与启动失败的教训有一段时间为了降成本我把QSPI Flash换成了一颗国产替代料。结果U-Boot在加载阶段频繁报CRC校验失败系统起不来。一开始以为是焊接问题反复重焊依然如此。后来仔细翻芯片手册和Flash数据手册才发现问题出在两处一是替代Flash默认的读命令序列与控制器初始化配置不一致需要修改设备树里的spi-nor参数二是替代料不支持原来的“reset”命令启动过程会误触发硬复位。最后在内核spi-nor驱动里加了一个兼容性参数才恢复正常。这个教训说明所谓“兼容Flash”不能只看封装和容量还要看SPI命令、时序、状态寄存器行为。芯片原厂通常维护一份“已验证Flash列表”量产选型时尽量选列表里的型号能省掉很多启动兼容性问题。如果一定要换务必在Bring-up阶段就把Flash读写、擦除、下电复位全流程测一遍。5.2 看门狗误复位导致AI任务中断另一个让我记忆深刻的坑是系统在跑长时间大模型推理时每隔几小时就自动复位一次。排查了很久发现是看门狗超时。有趣的是CPU没有死NPU也在正常工作但CPU被NPU的高优任务压得太满喂狗线程迟迟得不到调度。喂狗线程一超时外部看门狗就把整个系统复位了。处理方式分软硬件两边硬件层面把看门狗触发条件从“CPU能否及时清狗”改为“SoC是否有计算进展”利用NPU的进度计数器定期喂狗软件层面把喂狗动作放到一个高优先级中断里并且允许这个中断抢占低优先级计算任务。这个坑也说明了为什么AI芯片设计不能只考虑计算单元的峰值性能还要考虑系统级调度和异常恢复机制。5.3 JTAG调试与日志配合才能高效定位在Bring-up阶段经常会遇到“系统挂死串口日志停在某一行”的场景。如果只靠看日志很难判断是软件死循环、总线错误还是外设hang。我的经验是串口打印要配合JTAG实时调试以及诊断寄存器的快照读取。具体操作是在串口日志的关键节点比如每次DMA完成、每次kernel启动前打印一个序号系统挂死后用JTAG读出CPU的PC和LR寄存器再读诊断寄存器里的“最近总线错误地址”“最近DMA错误状态”。如果PC和日志序号能对应上问题基本定位如果不能对应可能是缓存一致性问题或者中断丢失需要进一步查看硬件计数器。而且我还习惯在代码里加入一个“心跳”任务每隔100毫秒往一个调试寄存器写一个递增计数值就算系统完全卡死硬件也能摸到心跳停在哪里。5.4 芯片测试中软硬件协同的取舍量产芯片测试不只是跑ATPG扫描链。AI芯片负载复杂很多功能性问题需要跑真实AI工作负载才能暴露。于是很多团队在系统启动之后加一段“启动自检”固件比如跑一个小规模的卷积算子和注意力算子检查NPU计算结果是否正确。这个自检能有效拦截部分生产时未被ATPG覆盖的缺陷但代价是会延长系统启动时间。取舍点在于缩短启动时间对用户体验很重要自检又不能省略只能在自检覆盖面和启动时间之间找平衡。我的建议是把自检设计成多级出厂检测用完整版用户每次开机只用快速版跑几个关键算子同时把检测结果存入eFuse或日志方便运维判断芯片健康状况。这套机制本身也是软硬件协同的体现硬件要提供“测试模式”和“性能计数器”软件要设计可拆分的自检流程。只有两者结合才能在量产和运维中快速隔离故障避免“芯片到底坏没坏”这个问题拖住整个项目。写到这里我想起早年间一次联调软件团队说“硬件有问题”硬件团队说“软件没按手册来”两边僵持不下。后来我拉了个会把软硬件接口手册摊开一页页对着找最后发现是某个保留字段没定义清楚两边各自理解成不同含义。那次之后我们立下规矩所有软硬件接口必须有清晰的default值和reserved字段说明任何一边要改动必须同步更新接口文档并评审。做AI芯片软硬件协同设计到最后拼的不只是技术更是流程和沟通。这个系列后续我会继续聊具体模块的实现细节也欢迎在评论区聊聊你踩过的软硬件协同的坑。

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

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

免费获取报价 →
↑