2. SoC设计基础:从概念到芯片、SoC的典型组成、设计流程与抽象层次

好,我们正式开始聊SoC设计的基础。这一章,说白了就是帮大家建立一张「全局地图」。你想想看,做SoC就像盖一栋摩天大楼,你不能上来就砌砖,得先知道这楼长什么样、分几层、用什么材料、施工顺序是什么。

我个人习惯,在开始任何项目前,先画一张大图。把概念、组成、流程、层次这四件事想清楚,后面才不会跑偏。咱们一个一个来。

2.1 从概念到芯片:一个SoC的诞生

什么是SoC?System on Chip,片上系统。就是把一个完整的电子系统,包括处理器、内存、外设接口、模拟电路等等,全部集成到一颗芯片上。

我经常跟新人说:别把SoC想得太玄乎。它本质上就是一个「微型电脑主板」,只不过所有东西都焊死在同一块硅片上了。

从概念到芯片,大致要经历这么几个阶段:

  • 需求定义:你要做什么?跑Linux还是RTOS?功耗多少?成本目标?
  • 架构设计:选什么CPU核?总线怎么连?内存多大?
  • RTL编码:用Verilog或SystemVerilog把设计写出来。
  • 验证:仿真、形式验证、FPGA原型验证。
  • 后端实现:综合、布局布线、时序收敛。
  • 流片:把GDSII文件交给晶圆厂。
  • 测试与封装:回来之后测功能、测性能,然后封装成成品。

嗯,这里要注意:很多团队在「需求定义」这一步就翻车了。我见过一个项目,客户说「我要一个AI芯片」,结果连跑什么模型都没想清楚,最后流片回来发现算力够了但带宽不够,白花了几千万。

避坑指南:我曾经参与过一个项目,架构师拍脑袋定了DDR接口频率,结果后端死活跑不到。后来查原因,是PCB走线太长,信号完整性过不了。所以,概念阶段就要考虑物理实现,别光顾着画框图。

2.2 SoC的典型组成

一个典型的SoC,到底包含哪些东西?我画了一张图,大家先看个整体印象。

典型SoC组成结构图 处理器子系统 RISC-V CPU Core L1/L2 Cache MMU / TLB 内存子系统 SRAM / ROM DDR Controller eFlash / OTP 外设子系统 UART / SPI / I2C GPIO / Timer USB / Ethernet 互联总线(NoC / AXI / AHB) 负责所有模块之间的数据通信 专用加速器 NPU / DSP 加密引擎 模拟与混合信号 PLL / ADC / DAC PMU / LDO 调试与安全 JTAG / Trace TrustZone / OTP Key

这张图里,我特意把RISC-V CPU Core放在了左上角。为什么?因为它是整个SoC的大脑。我这些年做过的项目,从IoT芯片到边缘计算芯片,核心都是这颗RISC-V核。

具体来说,SoC的组成可以归纳为以下几大块:

子系统 典型模块 说明
处理器子系统 RISC-V Core、Cache、MMU 执行指令,管理内存映射
内存子系统 SRAM、DDR Controller、eFlash 存储代码和数据
互联总线 AXI/AHB/NoC 模块间的通信高速公路
外设接口 UART、SPI、I2C、USB 与外部设备交互
专用加速器 NPU、DSP、加密引擎 处理特定计算密集型任务
模拟与混合信号 PLL、ADC、PMU 时钟生成、信号转换、电源管理
调试与安全 JTAG、TrustZone 调试接口与安全隔离
个人经验:我刚开始做SoC时,总觉得「互联总线」不重要,随便选个AHB就完事了。后来项目规模大了,发现总线带宽成了瓶颈。所以现在我做架构设计,第一件事就是算总线带宽,看看会不会堵车。

2.3 设计流程:从想法到硅片

SoC的设计流程,说白了就是一条流水线。每个阶段都有明确的目标和产出物。我把它分成五个主要阶段:

  1. 架构探索阶段:用高级语言(C/C++/SystemC)建性能模型,评估不同方案。比如,选单核还是双核?Cache多大合适?
  2. RTL设计与验证:写Verilog代码,做功能仿真。这个阶段最耗时,也最容易出bug。
  3. 逻辑综合:把RTL代码转成门级网表。说白了,就是把「行为描述」变成「电路连接」。
  4. 物理设计:布局布线,生成GDSII。这一步要考虑时序、功耗、面积。
  5. 流片与测试:交给晶圆厂制造,回来之后做ATE测试和系统级测试。

嗯,这里我要强调一点:不要等到流片前才做验证。我见过太多团队,前面写代码飞快,最后验证阶段发现bug,改都来不及。正确的做法是:验证贯穿整个流程,从架构阶段就开始。

核心原则:SoC设计流程中,验证工作通常占整个项目时间的60%-70%。别觉得这是浪费,这是省钱。流片一次几百万,验证多花一个月,值。

2.4 抽象层次:从系统到晶体管

抽象层次,是芯片设计里最重要的概念之一。你想想看,一颗芯片上有几十亿个晶体管,你不可能一个一个去画。所以我们需要分层抽象。

常见的抽象层次,从高到低是这样的:

  • 系统级(System Level):用C/C++/SystemC描述整个SoC的行为。不关心具体实现,只关心功能对不对。
  • 寄存器传输级(RTL):用Verilog/VHDL描述寄存器之间的数据传输。这是数字设计的主流抽象层次。
  • 门级(Gate Level):用与门、或门、触发器描述电路。综合后的网表就是这个层次。
  • 晶体管级(Transistor Level):用PMOS/NMOS描述电路。模拟电路和标准单元库在这个层次。
  • 版图级(Layout):物理掩膜版图,直接用于制造。

我个人习惯,做SoC架构设计时,至少要在系统级和RTL级之间来回迭代几次。先用系统级模型验证算法和架构,再写RTL代码。这样能避免「架构没问题但RTL实现不了」的尴尬。

避坑指南:我曾经接手过一个项目,前同事直接跳过了系统级建模,上来就写RTL。结果写到一半发现总线协议选错了,所有模块的接口都得重写。白白浪费了三个月。所以,抽象层次不是摆设,该有的步骤一个都不能省。

好了,这一章的内容就到这里。SoC设计的基础框架已经搭好了:概念、组成、流程、层次。后面我们会深入每个细节,从RISC-V核的选型到总线的设计,一步步把这张地图填满。