芯片研发全流程及固件部门职责详解
芯片研发全流程及固件部门职责详解
从市场需求到量产交付,全面解析芯片研发的完整生命周期,以及固件(Firmware)部门在其中扮演的关键角色
目录
1. 芯片研发全流程概览
一颗芯片从概念到量产,通常需要 18~36 个月,经历以下十大阶段:
市场调研/产品定义
│
▼
芯片架构设计 ◄─────────────────────────┐
│ │
▼ │
RTL设计(数字前端) │
│ │
▼ │
功能验证(DV) │
│ │
▼ │
逻辑综合 / DFT │
│ │
▼ │
物理设计(后端/版图) │
│ │
▼ │
流片前签核(Sign-off) ─── 发现问题 ──────┘
│
▼
流片(Tape-out)→ 晶圆制造(约3~4个月)
│
▼
晶圆测试(CP Test)
│
▼
封装 + 成品测试(FT Test)
│
▼
样片验证 / Bring-up ◄──── 固件核心参与
│
▼
量产(Mass Production)
│
▼
客户支持与维护
关键数字:一颗 28nm 工艺的 SoC 芯片,研发成本约 500 万~5000 万美元;7nm 以下先进工艺则可达 1~5 亿美元。
2. 芯片研发各阶段详解
2.1 市场需求分析与产品定义(Market Requirement & Product Definition)
时间跨度:2~4 个月
目标:回答"我们要做什么芯片,为什么做,卖给谁"
| 工作内容 | 说明 |
|---|---|
| 市场调研 | 分析目标市场的规模、增长率、竞争格局 |
| 客户需求收集 | 走访大客户,收集应用场景和性能需求 |
| 竞品分析 | 对标竞争对手芯片的性能、功耗、成本、功能特性 |
| 产品规格书(Product Brief) | 初步定义芯片的关键参数(主频、功耗、接口类型、封装形式等) |
| 商业论证(Business Case) | 评估研发投入、预期出货量、毛利率、回收期 |
| 立项评审 | 项目正式立项(Kick-off),组建核心团队 |
输出文档:MRD(市场需求文档)、PRD(产品需求文档)、立项报告
参与部门:产品管理(PM)、市场部、销售部、系统架构师
2.2 芯片架构设计(Architecture Design)
时间跨度:3~6 个月
目标:将市场需求转化为可实现的芯片架构方案
| 工作内容 | 说明 |
|---|---|
| 系统架构设计 | 整体方案设计,包括 CPU 选型、总线架构(如 AXI/AHB/APB)、内存子系统、外设接口等 |
| 软硬件划分(HW/SW Partition) | 决定哪些功能用硬件实现(性能好、功耗低),哪些用软件实现(灵活性高) |
| 性能建模 | 使用 SystemC 或其他 ESL 工具建立性能模型,评估吞吐量和瓶颈 |
| 功耗估算 | 早期功耗预算,确定各模块功耗分配 |
| IP 选型 | 确定使用自研 IP 还是第三方授权 IP(如 ARM CPU、DDR 控制器、USB PHY 等) |
| 存储子系统设计 | Cache 大小、SRAM 分布、DDR 接口规格、NAND Flash 控制器等 |
输出文档:架构设计文档、子系统框图、IP 选型列表、功耗预算表
参与部门:架构师团队、系统设计、硬件设计、软件/固件部门(开始介入)
2.3 RTL 设计与逻辑综合(RTL Design & Synthesis)
时间跨度:4~8 个月(SoC 中最耗时、人力最密集的阶段)
目标:用硬件描述语言(HDL)将架构设计转化为可综合的寄存器级电路逻辑
| 工作内容 | 说明 |
|---|---|
| 模块级 RTL 编码 | 使用 Verilog / SystemVerilog / VHDL 编写各功能模块的代码 |
| 自底向上集成 | 将各模块逐层集成到顶层,处理跨时钟域(CDC)、复位、电源域等系统问题 |
| 代码规范检查 | Lint 检查(语法、风格、可综合性) |
| 逻辑综合(Synthesis) | 将 RTL 代码映射到目标工艺库的标准单元库,得到门级网表 |
| DFT(可测试性设计) | 插入扫描链(Scan Chain)、BIST(内建自测试)、MBIST(Memory BIST)等 |
| 形式化验证 | 使用等价性检查工具确保综合前后逻辑一致 |
输出文档:RTL 代码、综合后网表、DFT 脚本、时序约束文件(SDC)
参与部门:数字前端设计团队、DFT 团队、验证团队(并行工作)
2.4 功能验证(Functional Verification / DV)
时间跨度:与 RTL 设计并行,4~10 个月
目标:确保 RTL 实现的功能与设计规格完全一致,验证工程师通常与设计工程师的比例达到 2:1 甚至 3:1
| 工作内容 | 说明 |
|---|---|
| 验证计划制定 | 根据设计规格制定测试点分解、验证策略 |
| 测试平台搭建 | 使用 UVM(Universal Verification Methodology)搭建 SystemVerilog 验证环境 |
| 定向测试 | 针对特定功能编写定向测试用例 |
| 随机约束测试 | 使用约束随机激励覆盖更广泛的操作空间 |
| 覆盖率分析 | 代码覆盖率(行/分支/条件/翻转)+ 功能覆盖率 |
| 门级仿真 | 综合后门级网表的仿真,考虑时序延迟 |
| 固件在环验证(FW-in-the-loop) | 将真实固件二进制加载到仿真环境中运行(后文重点讨论) |
输出文档:验证计划、测试用例库、功能覆盖率报告、Bug 报告
参与部门:验证团队(主要)、设计团队、固件团队(辅助验证)
2.5 物理设计(Physical Design / Backend)
时间跨度:3~6 个月
目标:将门级网表转化为可制造的版图(GDSII 文件)
| 工作内容 | 说明 |
|---|---|
| 布局规划(Floorplan) | 确定各模块在芯片上摆放的位置、I/O Pad 布局、电源网络规划 |
| 单元放置(Placement) | 将标准单元、宏单元(SRAM/Analog IP)摆放到规划的位置 |
| 时钟树综合(CTS) | 构建低 skew 的时钟网络,确保时钟信号同时到达所有时序单元 |
| 布线(Routing) | 完成所有单元之间的物理连线 |
| 时序收敛(Timing Closure) | 反复迭代,确保所有路径满足建立时间和保持时间要求 |
| 物理验证 | DRC(设计规则检查)、LVS(版图与电路一致性检查)、ANT(天线效应检查) |
| IR Drop / EM 分析 | 电源网络压降和电迁移分析 |
| 最终签核 | 所有检查通过后,生成 GDSII 交付给晶圆厂 |
输出文档:GDSII 版图文件、最终时序报告、物理验证报告
参与部门:后端设计团队、CAD 团队
2.6 流片前签核(Pre-Tapeout Sign-off)
时间跨度:1~2 个月
目标:在最终流片前进行全面的最终审查,确保不出现致命的设计错误
| 工作内容 | 说明 |
|---|---|
| 设计审查轮次 | 多轮全团队设计审查(Design Review) |
| 功能覆盖率达标确认 | 确保功能覆盖率满足公司标准(通常 > 95%) |
| 后端签核检查 | 时序收敛、DRC/LVS 均 clean |
| 功耗分析确认 | 确保在指定工作模式下功耗低于规格 |
| 固件签核检查 | 固件团队确认仿真环境中的固件功能验证通过 |
| ESD / Latch-up 审查 | 静电防护和闩锁效应审查 |
| Tape-out 评审会议 | 各部门负责人签字确认,管理层批准流片 |
2.7 流片与晶圆制造(Tape-out & Fabrication)
时间跨度:2~4 个月(取决于工艺节点)
| 工作内容 | 说明 |
|---|---|
| GDSII 交付 | 将最终版图数据交付给晶圆代工厂(如 TSMC、SMIC) |
| 光罩制作(Mask Making) | 制造掩模版,先进工艺可能需要 60~80 层光罩 |
| 晶圆制造 | 在硅片上通过光刻、刻蚀、沉积等工艺制造晶体管和金属互连 |
| 晶圆测试(CP / Probe) | 晶圆完成后,用探针卡对每颗 Die 进行基本电性测试,标记良/坏 Die |
| 晶圆减薄与切割 | 将晶圆减薄到合适厚度,然后切割为单个 Die |
2.8 封装与成品测试(Assembly & Final Test)
时间跨度:1~2 个月
| 工作内容 | 说明 |
|---|---|
| 封装(Assembly) | 将良品 Die 封装到芯片外壳中(BGA / QFP / QFN 等) |
| 成品测试(FT) | 对封装后的芯片进行全面功能测试、AC/DC 参数测试 |
| SLT(系统级测试) | 将芯片装在实际系统板上进行系统级功能测试 |
| 可靠性测试 | HTOL(高温工作寿命)、TC(温度循环)、HAST(高温高湿加速)等 |
| 特性分析(Characterization) | 在全温度/电压范围内标定芯片的关键参数 |
2.9 样片验证与 Bring-up(Sample Validation & Bring-up)
时间跨度:3~12 个月(这是固件部门的核心战场)
目标:拿到第一颗封装好的芯片,让它真正"跑起来",验证其在真实系统中的行为
| 工作内容 | 说明 |
|---|---|
| 硬件验证板准备 | 设计并生产 EVB(Evaluation Board)或参考设计板 |
| Power-on 初始化 | 首次上电,检查各电源轨是否正常、时钟是否起振 |
| Boot ROM 验证 | 运行 Boot ROM 代码,验证 CPU 启动流程 |
| 各 IP 模块验证 | 逐个验证芯片内部各 IP 模块的功能(USB、I2C、SPI、UART、DDR、NAND 等) |
| 性能测试 | 验证芯片的主频能力、功耗水平是否达到设计目标 |
| 兼容性测试 | 与外接设备(如 DDR 颗粒、NAND Flash、PMIC 等)的兼容性验证 |
| 问题定位与 Debug | 当芯片不按预期工作时,配合设计团队定位问题是 RTL Bug 还是 Fabrication 问题 |
2.10 量产与客户支持(Mass Production & Customer Support)
时间跨度:持续(芯片生命周期通常 5~10 年)
| 工作内容 | 说明 |
|---|---|
| 良率爬坡 | 与新订单和 Fab 协作,持续提升晶圆良率和封装良率 |
| 量产测试优化 | 优化 FT/SLT 程序,降低测试成本,提高测试覆盖率 |
| 客户导入支持 | 帮助客户完成基于该芯片的产品设计、驱动移植 |
| 版本迭代 | 根据市场反馈和问题,推出芯片升级版本(ECO / 新版本 mask) |
| EOL 管理 | 芯片生命周期结束时的停产规划 |
3. 固件部门概述
3.1 什么是固件(Firmware)
固件(Firmware) 是介于硬件和操作系统/应用程序之间的一层软件,直接运行在芯片内部的 CPU/MCU 上,负责初始化硬件、管理硬件状态、提供硬件抽象接口,以及执行实时的控制逻辑。
┌─────────────────────────────────┐
│ 应用层 (Application) │ ︎ 用户态软件
├─────────────────────────────────┤
│ 操作系统 (OS / RTOS) │ 系统软件
├─────────────────────────────────┤
│ 固件层 (Firmware) ◄────────── │ 芯片内的软件
│ ├─ Boot ROM (不可修改) │
│ ├─ HAL / Driver │
│ ├─ 电源管理 (PMU Firmware) │
│ └─ 协议栈 (如 UFS/NVMe 协议) │
├─────────────────────────────────┤
│ 硬件层 (Hardware) │ 芯片电路
└─────────────────────────────────┘
3.2 固件部门的职责范围
固件部门(Firmware Team)在芯片公司中的核心职责包括:
| 职责领域 | 具体内容 |
|---|---|
| Boot ROM 开发 | 芯片上电执行的第一段代码,固化在 ROM 中,不可修改 |
| HAL 开发 | 硬件抽象层(Hardware Abstraction Layer),屏蔽底层寄存器差异 |
| 设备驱动开发 | 各外设 IP 的底层驱动程序(Driver) |
| 固件协议栈 | 如 UFS 协议栈、NVMe 协议栈、PCIe 协议栈等 |
| 电源管理固件 | 动态电压频率调整(DVFS)、休眠/唤醒状态机 |
| 安全固件 | Secure Boot、TrustZone、加密引擎驱动 |
| 工具链支持 | 下载工具、调试工具、量产烧录工具 |
| 芯片验证支持 | 在仿真环境、FPGA 原型、样片上运行固件 |
3.3 固件工程师的典型技能树
┌─────────────────────────────────────┐
│ 固件工程师技能树 │
├─────────────────────────────────────┤
│ ① 编程语言:C(核心)、汇编、Python │
│ ② 体系架构:ARM / RISC-V / x86 │
│ ③ 硬件知识:寄存器、中断、DMA、MMU │
│ ④ 协议协议:UFS / NVMe / SPI / I2C / │
│ UART / USB / PCIe │
│ ⑤ 调试工具:JTAG(OpenOCD/J-Link)、 │
│ Trace(ETM)、逻辑分析仪 │
│ ⑥ RTOS:FreeRTOS / ThreadX / μC/OS │
│ ⑦ 开发流程:Git、CI/CD、自动化测试 │
│ ⑧ 行业规范:JEDEC / PCI-SIG / MIPI │
└─────────────────────────────────────┘
4. 固件部门在芯片研发全流程中的参与
这是本文的核心部分。固件部门并非只在芯片回来后(Bring-up)才开始工作,而是从架构设计阶段就深度参与,贯穿整个芯片研发周期。
4.1 产品定义阶段(固件的参与)
| 参与活动 | 具体工作 |
|---|---|
| 可编程性评估 | 评估哪些功能需要用固件实现,哪些用硬件状态机实现 |
| Boot 方案讨论 | 确定芯片的启动方式:从哪种介质启动(NAND / SPI NOR / eMMC),是否需要 Secure Boot |
| 调试接口需求 | 提出固件调试所需的硬件接口需求(JTAG / SWD / UART debug console) |
| 固件存储方案 | Firmware 存在什么地方:Boot ROM + SRAM / Mask ROM / OTP / Flash 映射 |
| SRAM 容量需求 | 评估 Boot ROM 和早期启动阶段的 SRAM 大小需求 |
| 产品规格评审 | 从固件实现角度评审产品规格的可行性和合理性 |
这个阶段固件团队的产出:FW Requirement Document(固件需求文档)
4.2 架构设计阶段(固件的核心参与)
这是固件团队最有影响力的阶段——此时修改芯片硬件还有余地和成本空间。
| 参与活动 | 具体工作 |
|---|---|
| 寄存器规划 | 参与定义各 IP 模块的控制/状态寄存器(CSR) 布局,确保固件能高效访问 |
| 中断系统设计 | 定义中断号分配、中断优先级、中断向量表布局 |
| DMA 方案设计 | 针对数据密集型操作(如 NAND 数据传输)设计 DMA 通道和描述符格式 |
| 存储映射设计 | 参与决定芯片的地址空间划分:哪些地址映射给 SRAM、哪些给 MMIO 外设、哪些给 DDR |
| 电源状态机设计 | 参与设计芯片的电源域划分和电源状态转换(Active ↔ Sleep ↔ DeepSleep) |
| Clock / Reset 架构 | 定义各模块的时钟门控、复位策略、模块级复位和系统级复位的关系 |
| Boot 流程设计 | 设计完整的 Boot Flow:Reset Vector → Boot ROM → 加载第二阶段 Bootloader → 跳转到主固件 |
| 安全架构设计 | Secure Boot 链、OTP fuse 分配、加密引擎的固件接口 |
| 软硬件接口文档 | 编写 HLD(High-Level Design)中的固件部分,详细定义 HW/FW 接口协议 |
关键原则:固件团队在架构阶段提出的每一个"这里加一个状态寄存器"或"这里加一个中断",都比芯片流片后再改硬件要便宜 100 倍。
案例:以某款嵌入式 SoC 中的 NAND Flash 控制器设计为例——
固件团队在架构评审中发现:
• 硬件团队最初设计的 ECC 校验结果寄存器只返回"成功/失败"
• 固件团队提出:需要"错误位置 + 错误比特数"让固件可以执行软纠错
• 硬件团队修改:在 ECC 模块增加错误位置寄存器
→ 结果:流片后,NAND Flash 的高 bit 错误率场景下,固件可执行软纠错,良率提升 3%
4.3 RTL 设计阶段(固件的参与)
| 参与活动 | 具体工作 |
|---|---|
| 寄存器视图验证 | 检查各 IP 模块的寄存器定义是否符合固件预期——地址是否正确、位域是否合理 |
| 固件驱动开发 | 针对各 IP 模块开始编写底层的 HAL(硬件抽象层)代码 |
| Boot ROM 实现 | 编写 Boot ROM 代码——这是流片后芯片上电执行的第一段代码 |
| Linker Script 规划 | 定义固件代码在芯片存储空间中的加载布局 |
4.4 验证阶段(固件的深度参与)
这是固件团队在流片前最重要的贡献领域——用固件验证硬件。
4.4.1 固件在环验证(FW-in-the-Loop / FW-Driven Verification)
传统的硬件验证是用 SystemVerilog / UVM 写测试激励。但 UVM 测试向量和真实固件之间存在差距:
- UVM 测试可能遗漏固件特有的操作序列和时序
- 真实固件的代码路径和 UVM 测试覆盖的路径可能不一致
- UVM 测试不验证 Boot ROM、中断响应等固件关键功能
固件在环验证的流程:
硬件仿真环境 (Simulation / Emulation)
│
▼
加载真实固件二进制 (Boot ROM + F/W binary)
│
▼
CPU 模型执行固件指令
│
▼
固件操作硬件寄存器 → 硬件行为被验证
│
▼
固件输出结果 → 与预期对比
| 验证活动 | 说明 |
|---|---|
| Boot 流程验证 | 在仿真环境中运行 Boot ROM + SPL,验证上电初始化流程 |
| Driver 验证 | 将固件中各 IP 的 driver 代码在仿真环境中运行,验证寄存器读写行为 |
| 中断响应验证 | 通过仿真模拟外设产生中断,验证固件的中断处理流程 |
| 错误处理验证 | 验证固件在异常情况下的处理——如 NAND 读错误时的重试/纠错逻辑 |
| 电源切换验证 | 在仿真中执行电源状态切换,验证电源管理固件的状态机 |
| 协议一致性 | 固件实现的 UFS/NVMe 协议栈在仿真环境中与参考模型对比 |
4.4.2 FPGA 原型验证
在流片前,会将 RTL 代码综合到 FPGA 上构建原型系统:
| 工作 | 说明 |
|---|---|
| FPGA 移植 | 协助将芯片 RTL 移植到 FPGA 平台,处理时钟/复位差异 |
| FPGA 固件调试 | 在 FPGA 上运行固件,定位功能问题 |
| 性能摸底 | 在 FPGA 上大致摸底芯片的性能(但 FPGA 无法准确反映最终时序性能) |
| 系统集成测试 | 在 FPGA 上运行完整的固件 + 驱动栈,验证系统级功能 |
经验原则:一个 bug 在仿真中发现修复的成本是 1 倍,在 FPGA 验证中发现是 10 倍,在流片后才发现是 100 倍。
4.5 流片前(固件的签核检查)
在 Tape-out 之前,固件团队需要完成以下签核检查:
| 检查项 | 说明 |
|---|---|
| 寄存器一致性确认 | 固件中使用的所有寄存器地址、位域与 RTL 完全一致 |
| Boot ROM 代码冻结 | Boot ROM 代码必须最终确定,因为 ROM 无法修改 |
| 固件功能覆盖率确认 | 在仿真环境中的固件测试覆盖率达到公司要求 |
| 启动流程确认 | Boot 流程已通过仿真验证 |
| 基本外设驱动确认 | 关键外设(UART、Timer、GPIO 等)的 Driver 已在仿真中验证通过 |
| 紧急问题清单关闭 | 所有 P0/P1 级别的优先级问题必须解决 |
4.6 样片 Bring-up 阶段(固件的核心战场)
这是固件团队在整个芯片研发过程中最高光、最紧张、最有技术含金量的阶段。
芯片流片回来后,硬件设计团队无法直接验证芯片是否正常工作——只有固件能让芯片真正"跑起来"。
4.6.1 Bring-up 的典型流程
拿到样片 → 焊接到 EVB → 上电检查 → Boot ROM 启动 → 串口输出打印 →
逐个使能外设 → DDR 初始化 → 加载主固件 → 模块级功能测试 → 系统级测试
4.6.2 固件在各子阶段的具体工作
① Power-on 阶段(0~1 天):
| 工作 | 说明 |
|---|---|
| 电源轨检查 | 配合硬件工程师,用示波器检查芯片各电源域的电平是否正确 |
| 时钟检查 | 检查主时钟 / PLL / RTC 时钟是否正常起振 |
| 复位时序 | 检查芯片的复位释放时序是否符合预期 |
| 最小系统启动 | 让 Boot ROM 成功运行,在调试串口输出第一个字符 |
② 最小系统 Bring-up(1 天 ~ 1 周):
| 工作 | 说明 |
|---|---|
| JTAG/SWD 调试 | 确认调试接口正常工作,可以通过 JTAG 下载和单步调试固件 |
| SRAM 读写测试 | 验证片上 SRAM 可以正确读写(March 测试算法) |
| DDR 初始化 | 配置 DDR PHY 和控制器参数,完成 DDR 训练,验证 DDR 读写正确性 |
| 中断控制器验证 | 触发软中断,验证中断控制器和中断向量表工作正常 |
| Clock Gating 验证 | 验证各模块时钟门控是否正常工作 |
③ 外设 Bring-up(1 周 ~ 1 个月):
按优先级逐个使能和验证各外设 IP:
| 外设 | 验证内容 |
|---|---|
| UART | 基础通信(往往是第一个验证的外设,用于输出调试信息) |
| GPIO | 输入输出功能验证 |
| SPI / I2C | 与外部器件的通信验证 |
| Timer / Watchdog | 定时器精度、看门狗复位功能 |
| DMA | 数据传输正确性、带宽测试 |
| USB | 设备枚举、数据传输、速度模式切换 |
| SD / eMMC | 数据读写、速度模式 |
| NAND Flash 控制器 | Read/Write/Erase 验证、ECC 功能验证 |
| DDR 接口 | 全地址范围的数据一致性测试 |
| Ethernet | MAC/PHY 初始化、网络数据收发 |
④ 协议栈 Bring-up(2 周 ~ 3 个月):
对于存储类芯片(如 UFS、SSD 主控),这是最耗时也最关键的部分:
| 工作 | 说明 |
|---|---|
| UFS 协议栈验证 | UniPro 初始化、链路训练、SCSI 命令处理、RPMB 安全功能 |
| NVMe 协议栈验证 | 队列管理、命令提交/完成处理 |
| PCIe 链路训练 | PHY 初始化、链路训练状态机(LTSSM)验证 |
| 热插拔处理 | 设备热插拔时的链路重训练 |
⑤ 性能调优(1 周 ~ 1 个月):
| 工作 | 说明 |
|---|---|
| 吞吐量优化 | 调节 DMA burst size、缓存策略、命令流水线深度以最大化带宽 |
| 延迟优化 | 分析关键路径延迟,优化固件的中断响应和命令处理时间 |
| 功耗调优 | 调整时钟门控策略、电源状态切换阈值 |
| 稳定性测试 | 长时间(> 48 小时)压力测试,确保系统不会死锁或崩溃 |
⑥ 问题定位与 Debug:
Bring-up 中的 Bug 可能来自多个层面,固件团队负责协助定位问题的根本原因:
问题现象:芯片写入 NAND Flash 后读取校验失败
固件排查步骤:
1. 确认固件发出的 NAND 命令序列正确 ──── 通过 JTAG 读取命令 FIFO
2. 确认 NAND 控制器状态寄存器状态 ────── 检查是否有错误标志置位
3. 确认 ECC 编码/解码结果 ───────────── 比对输入数据和 ECC 校验值
4. 确认时序参数配置 ────────────────── 检查 tR/tPROG 等时序参数是否匹配
5. 如果以上都正确 → 可能是硬件问题 ──── 通知硬件团队检查 RTL
结果:最终定位到 NAND 控制器的数据路径中有一个 RACE condition
→ 固件临时规避(增加延迟读取时序)
→ 硬件修复在下一版本 RTL 中
4.6.3 Bring-up 中的经典 Debug 方法
| 方法 | 说明 |
|---|---|
| GPIO Toggle | 在固件关键位置设置 GPIO 翻转,用逻辑分析仪测量时间点 |
| UART 日志 | 从调试串口输出关键状态信息(最常用) |
| 寄存器 Dump | 异常时将所有关键寄存器的值打印出来 |
| JTAG 断点 | 在关键代码位置设置硬件断点,查看 CPU 状态 |
| Trace | 使用 ETM(嵌入式跟踪宏单元)捕获全指令流 |
| 二分法 | 不断缩小问题代码范围,找到首次出现异常的代码位置 |
4.7 量产阶段(固件的参与)
| 参与活动 | 具体工作 |
|---|---|
| 量产固件开发 | 与 Bring-up 固件不同,量产固件需要更稳定、更优化,去除调试信息 |
| FW OTA 方案 | 设计固件的在线升级方案(如双备份 + 回滚机制) |
| 量产测试固件 | 支持 ATE(自动测试设备)的测试固件,用于 FT/SLT 环节 |
| 校准固件 | 针对芯片个体差异的 calibration 流程 |
| 测试覆盖率优化 | 优化量产测试程序,在保持高覆盖率的同时缩短测试时间 |
| 良率分析固件 | 固件级别的数据分析,协助良率提升(如记录 ECC 错误频次、时序裕量等) |
4.8 客户支持阶段(固件的参与)
| 参与活动 | 具体工作 |
|---|---|
| SDK 发布 | 提供完整的固件开发套件、文档和示例代码给客户 |
| 客户问题分析 | 客户在产品集成中遇到问题时,配合分析是客户软件问题、协议兼容性问题还是芯片问题 |
| 补丁/热修复 | 针对严重问题的紧急固件补丁 |
| 定制化固件 | 针对大客户的特殊需求提供定制化固件版本 |
| 平台移植支持 | 支持客户将芯片移植到不同平台(Linux / Android / RTOS) |
5. 固件与其他部门的协作关系
5.1 协作关系图
┌──────────────┐
│ 产品管理 │
│ (PM) │
└──────┬───────┘
│ 需求输入
▼
┌──────────┐ ┌──────────────┐ ┌──────────┐
│ 架构团队 │◄─┤ 固件团队 ├─►│ 设计团队 │
│(Arch) │ │ (Firmware) │ │(RTL/HW) │
└──────────┘ └───────┬──────┘ └──────────┘
│
┌───────────┼───────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 验证团队 │ │ 测试团队 │ │ 软件团队 │
│ (DV) │ │ (ATE) │ │ (SDK) │
└─────────┘ └─────────┘ └─────────┘
5.2 各部门协作要点
| 协作对象 | 协作内容 | 常见冲突点/解决方式 |
|---|---|---|
| 与架构团队 | 定义软硬件接口、寄存器规划、Boot 流程 | 架构团队倾向于简化硬件(让固件多做),固件倾向于硬件开放更多控制权→需要 trade-off 讨论 |
| 与 RTL 设计团队 | 寄存器映射验证、RTL Bug 定位、ECO 建议 | 发现 RTL Bug 时,固件先写 workaround,硬件在下一版本修复 |
| 与验证团队 | 固件在环验证、FPGA 验证支持 | 验证团队需要了解固件运行的特性和时序,固件需要理解仿真环境的局限 |
| 与测试团队 | 量产测试固件、ATE 支持 | 测试团队关注测试覆盖率和测试时间(成本),固件需要在两者间平衡 |
| 与软件团队 | 系统级驱动接口定义、SDK 交付 | 固件层和 OS 驱动层的接口定义需要对齐,常见问题是 OOP vs 过程式开发风格差异 |
| 与产品管理 | 固件功能优先级、交付时间 | PM 倾向于"功能全开",固件需要理性评估开发工时和风险 |
6. 固件部门的交付物与里程碑
6.1 芯片研发各阶段的固件交付物
| 研发阶段 | 固件交付物 |
|---|---|
| 架构阶段 | FW Architecture Document、HW/FW Interface Spec |
| RTL 阶段 | 寄存器定义文档(.h 头文件)、HAL 层 Driver 代码 |
| 验证阶段 | Boot ROM 仿真代码、FW-in-the-loop 测试用例、仿真报告 |
| 流片前 | Boot ROM 最终二进制(冻结)、FW Sign-off 报告 |
| Bring-up | Bring-up Plan、Bring-up Report、各 IP Driver 验证代码 |
| 量产阶段 | Production FW 二进制、量产测试固件、烧录工具 |
| 客户支持 | SDK 包、固件参考代码、文档、FAQ |
6.2 固件开发的里程碑节点
M0: 架构设计完成 ─── FW Architecture Review
M1: RTL Freeze ─── 寄存器头文件发布
M2: Tape-out ─── Boot ROM 代码冻结
M3: 样片到手 ─── Bring-up 开始
M4: 最小系统跑通 ─── 串口有输出
M5: DDR 初始化完成 ─── 可以通过 DDR 加载固件
M6: 关键外设验证完成 ─── UART/SPI/GPIO/Timer 等
M7: 全部外设验证完成 ─── 所有 IP 模块验证通过
M8: 协议栈验证完成 ─── 主协议(UFS/NVMe 等)通过一致性测试
M9: 性能达标 ─── 读/写吞吐量达到规格目标
M10: 量产固件发布 ─── Production FW Release
7. 固件开发在芯片研发中的核心价值
7.1 为什么固件如此重要
| 维度 | 说明 |
|---|---|
| 芯片的"灵魂" | 硬件是芯片的"躯体",固件是芯片的"灵魂"——没有固件,芯片只是一块硅片 |
| 硬件缺陷的救火队 | 芯片流片后发现的硬件 Bug,有很多可以通过固件 Workaround 来规避,避免芯片直接报废 |
| 性能的放大器 | 同样的硬件设计,优秀的固件可以让性能提升 20~50% |
| 灵活性的保障 | 固件可以在芯片量产后不断升级修复问题、增加功能,延长芯片的寿命 |
| 协议标准的实现者 | UFS / NVMe / PCIe 等复杂协议的实现主要在固件中 |
7.2 固件在芯片研发中的独特地位
硬件设计团队: "我们负责把芯片造出来"
验证团队: "我们负责检查芯片没做错"
固件团队: "我们负责让芯片真正干活的"
一个真实的例子:
• 流片回来后发现 DDR 接口在某些 PVT 条件下不稳定
• 改 RTL?——不可能,已经流片了
• 改封装?——成本太高
• 固件方案:在固件中的 DDR 训练流程里增加 adaptive calibration 算法
→ 解决问题,无需硬件改动
7.3 固件团队的职业路径
初级固件工程师
│ └ 掌握单一模块驱动开发、调试基础技能
▼
中级固件工程师
│ └ 独立负责子系统固件开发、Bring-up、Debug
▼
高级固件工程师
│ └ 主导芯片级固件架构设计、复杂问题排障、团队技术指导
▼
固件架构师 / 技术专家
│ └ 负责多代芯片的固件整体架构、前沿技术预研、行业标准贡献
▼
技术总监 / Fellow
8. 附录:芯片研发常用术语表
8.1 研发流程术语
| 术语 | 英文 | 说明 |
|---|---|---|
| 流片 | Tape-out | 将芯片版图数据提交给晶圆厂进行制造的阶段 |
| 签核 | Sign-off | 各部门负责人签字确认,同意进入下一阶段 |
| ECO | Engineering Change Order | 流片后的工程变更,通过修改光罩来修复 Bug |
| RTL | Register Transfer Level | 用硬件描述语言描述的数字电路逻辑 |
| 综合 | Synthesis | 将 RTL 代码映射到工艺库标准单元的过程 |
| 物理设计 | Physical Design | 将门级网表转化为物理版图的过程 |
| DRC | Design Rule Check | 设计规则检查,确保版图符合晶圆厂的制造规则 |
| LVS | Layout vs. Schematic | 版图与电路一致性检查 |
| DFT | Design for Test | 可测试性设计,插入扫描链、BIST 等 |
| GDSII | Graphic Design System II | 芯片版图的标准文件格式 |
8.2 固件相关术语
| 术语 | 英文 | 说明 |
|---|---|---|
| Boot ROM | Boot Read-Only Memory | 芯片上电执行的第一段固化代码 |
| HAL | Hardware Abstraction Layer | 硬件抽象层,屏蔽寄存器细节的最高层接口 |
| Bring-up | Bring-up | 芯片样片首次上电使其正常工作的过程 |
| Workaround | Workaround | 针对硬件 Bug 的固件层面规避方案 |
| Linker Script | Linker Script | 链接脚本,定义代码和数据的存储分布 |
| CSR | Control/Status Register | 控制/状态寄存器,固件与硬件交互的接口 |
| MMIO | Memory-Mapped I/O | 内存映射输入输出,通过内存地址访问外设寄存器 |
| ISR | Interrupt Service Routine | 中断服务程序 |
| RTOS | Real-Time Operating System | 实时操作系统 |
| JTAG | Joint Test Action Group | 标准的芯片调试接口 |
| SWD | Serial Wire Debug | 串行线调试(ARM 的 JTAG 替代方案) |
8.3 测试与验证术语
| 术语 | 英文 | 说明 |
|---|---|---|
| CP | Chip Probing | 晶圆级探针测试 |
| FT | Final Test | 封装后的成品测试 |
| SLT | System Level Test | 系统级测试 |
| ATE | Automatic Test Equipment | 自动测试设备 |
| DV | Design Verification | 芯片设计功能验证 |
| UVM | Universal Verification Methodology | 通用的 SystemVerilog 验证方法学 |
| FPGA 原型 | FPGA Prototype | 在 FPGA 上实现 RTL 原型系统 |
本文适用范围:主要适用于 SoC / ASIC 类芯片的研发流程,尤其针对包含嵌入式 CPU 核的复杂芯片(如手机 SoC、存储主控芯片、IoT MCU、汽车电子芯片等)。不同公司、不同芯片类型的研发流程会有所调整,但核心逻辑和固件部门的参与模式具有共性。
参考资料来源:本文基于半导体行业通用的芯片研发最佳实践、JEDEC 标准开发流程以及多个芯片公司的实际项目经验总结而成。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐




所有评论(0)