SoC总线

  • 总线提供了系统中各个设备之间一种互连访问共享硬件机制
  • 在数字系统中,总线承担数据传输任务,如处理器和存储器之间的数据传输
  • 总线的传输能力由总线的带宽工作频率决定
  • 总线的设计通常要考虑4个因素:总线宽度、时钟频率、仲裁机制和传输类型

常见的总线有:

  • AMBA:ARM公司定义的总线体系,广泛用于嵌入式SoC,包括 AHB、APB、AXI 等多个子协议
  • OCP:开放式核心接口协议,模块化设计,适合IP核集成
  • Wishbone:由OpenCores定义的开源SoC总线,简单易用,适合教学或FPGA设计
  • Avalon:原Altera公司定义的片上总线协议

AMBA

AMBA-AHB系统
AMBA-AXI系统

常见IP

SoC中的常见IP包括:中断控制器、实时时钟、SPI、定时器、看门狗等。

一个完整的 SoC 通常包含如下模块(IP):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌──────────────────────────┐
│ CPU / DSP │ ← 控制/计算IP
├──────────────────────────┤
│ Cache / MMU / Memory │ ← 存储IP
├──────────────────────────┤
│ AXI / AHB Interconnect │ ← 片上总线IP
├──────────────────────────┤
│ UART | SPI | I²C | GPIO │ ← 外设IP
├──────────────────────────┤
│ DMA / Timer / WDT │ ← 控制类IP
├──────────────────────────┤
│ USB / PCIe / Ethernet │ ← 通信接口IP
├──────────────────────────┤
│ Security / Crypto / PM │ ← 安全与电源管理IP
└──────────────────────────┘

中断控制器

中断控制器(Interrupt Controller)是 SoC中用于管理和分发中断请求(IRQ)的关键模块,直接影响系统的实时性响应能力

  • RISC-V:CLIN、PLIC
  • ARM:NVIC、GIC
  • x86:APIC

实时时钟 RTC

RTC(Real-Time Clock,实时时钟)是SoC中用于提供精确时间和日历功能的独立模块,即使在系统断电时也能持续运行(通常依靠备用电池供电)。RTC拥有报警功能,当达到所需的日期或时间时,可以用来触发中断(唤醒)。

SPI

SPI(Serial Peripheral Interface,串行外设接口)允许与外围设备的全双工同步串行通信。

SPI总线示意图

定时器与看门狗

Timer(定时器)和Watchdog(看门狗)是两种关键的外设模块,分别用于时间管理和系统可靠性保障。它们都基于计时原理,但用途完全不同:

  • 定时器用来“计时与触发事件”;
  • 看门狗用来“监控系统运行是否卡死”。

PMC

PMC(Power Management Controller) 是SoC中负责电源管理、功耗控制、时钟分配和系统唤醒的核心模块,直接影响芯片的能效比和续航能力。主要通过电源管理、时钟管理、软件管理等方式来达到控制功耗的目的。

模式 功耗 唤醒延迟 典型应用
Active CPU全速运行任务。
Idle 微秒级 等待中断(如手机待机)。
Standby 毫秒级 仅保留SRAM和RTC(如IoT设备)。
Off 极低 秒级 完全断电,需硬件复位唤醒。

DMAC

AMD反插

DMAC(Direct Memory Access Controller) 是SoC中用于在不占用CPU资源的情况下,实现外设与内存(或内存与内存)之间高速数据传输的硬件模块。它显著提升系统效率,尤其适用于大数据量、实时性要求高的场景(如音视频处理、网络通信)。

DMAC一般包括如下模块:

  • 通道控制器:每个通道独立配置源地址、目标地址、传输长度等参数
  • 仲裁器:管理多个通道的优先级(固定优先级或轮询)
  • 数据FIFO:缓冲数据,解决源/目标设备速度不匹配问题
  • 寄存器组:存储控制参数(如传输模式、中断使能)
  • 总线接口:连接系统总线(如AXI、AHB),访问内存和外设

中断与异常

中断机制和异常机制即在中断和异常发生时,处理器将暂停当前正在执行的程序,转而执行中断和异常处理程序,返回时处理器恢复之前被执行的程序。对于处理器而言,中断和异常的处理机制基本上一样,因此合称广义异常。

异常可分为两类:

  • 同步异常:原因可以精确定位到某一条执行指令,由当前正在执行的指令本身直接引起的异常。
  • 异步异常:每次发生时指令的PC可能不一样,例如中断便是一种异步异常
    • 精确异步异常:在响应异常后的处理器状态能够精确反映为某一条指令的边界
    • 非精确异步异常:在响应异常后的处理器状态无法精确反映为某一条指令的边界
flowchart TD
    A[正常执行: 
PC 指向当前指令] --> B{是否发生
异常/中断?} B -- 否 --> A %% 进入异常 B -- 是 --> C[硬件捕获异常] C --> D[保存现场到 CSR] D -->|mepc ← 触发时的 PC
mcause ← 异常原因
mtval ← 异常相关值(可选)
mstatus ← 更新 MIE→MPIE、切换特权级| E E --> F[PC ← mtvec(陷入入口)] F --> G[开始执行
异常/中断处理程序] %% 处理过程 G --> H{处理完成
并准备返回?} H -- 否 --> G %% 退出异常(机器模式) H -- 是 --> I[执行 MRET 指令] I --> J[硬件恢复状态] J -->|PC ← mepc
mstatus ← 恢复 MPIE→MIE 等| K[返回到
被中断/异常的程序] K --> A

蜂鸟E203的中断处理

E203在处理器顶层接口中有4根中断输入信号,分别是软件中断、计时器中断、外部中断和调试中断。CLINT模块产生一根软件中断信号和一根计时器中断信号,通给蜂鸟E203处理器;PLIC模块接入多个外部中断源,将其仲裁后生成一根外部中断信号,通给蜂鸟E203处理器。SoC层面的调试模块生成一根调试中断,通给蜂鸟E203处理器核。所有的中断信号均由E203的交付模块进行处理。

CLINT

CLINT(Core Local Interrupts Controller,核心本地中断控制器)是一个存储器地址映射的模块,挂载在蜂鸟E203 BIU上,用于产生软件中断定时器中断。CLINT计时器根据低速输入节拍信号(来自电源常开域)进行计时,上电后默认一直计数,可通过蜂鸟E203自定义CSR寄存器mcounterstop来关闭。

PLIC

PLIC(Platform Level Interrupt Controller,平台级中断控制器)是一个存储器地址映射的模块,挂载在蜂鸟E203 BIU上,专门用来管理外部中断源,并将它们统一分发到处理器。

异常处理实现

蜂鸟E203交付模块对中断和异常的处理:

  • 优先级:长指令造成的异步异常 > 中断造成的异步异常 > ALU造成的同步异常
  • 异常一旦发生,便会冲刷流水线,重新从新的PC地址开始取指令
  • mret指令会触发处理器退出异常模式,被当作一种跳转指令来执行,跳转PC为mepc寄存器值
  • 对于同步异常,mepc寄存器更新为当前正在交付指令的PC值
  • 对于精确异步异常(中断),mepc寄存器更新为下一条待交付指令的PC值
  • 对于非精确异步异常(长指令),mepc寄存器更新为发生异常指令的PC值

蜂鸟E203的调试机制

处理器对于运行于其上的软件程序提供调试能力是至关重要的。调试机制是个非常复杂的软硬件协作机制,软硬件的实现难度很大。对于处理器的调试功能而言,常用的两种是“交互式调试”和“追踪调试”:

  • 交互式调试(Interactive Debug)是最常见的调试功能。调试器软件(如GDB)能够直接对处理器取得控制权,进而对其以一种交互方式进行调试,缺点是对处理器的运行具有打扰性。
  • 追踪调试(Trace Debug)只跟踪记录处理器核执行过的所有程序指令,而不会打断干扰处理器的执行过程。相比交互式调试,实现难度更大,硬件开销也更大。

调试资源

E203中已有 DTM(Debug Transport Module)将JTAG标准接口转换成为内部的调试总线(Debug Bus),主要是使用状态机对JTAG协议进行解析。由于DTM模块处于JTAG时钟域,与调试总线要访问的调试模块不属于同一个时钟域,因此需要被同步。

此外,还有调试模块(Debug Module),实现了RISC-V调试文档“0.11版本”中定义的若干寄存器、Debug-ROM和Debug-RAM。这些资源既可以被调试总线访问到,也可以被系统存储总线访问到:

  • Debug-ROM包含了处理器进入调试模式下需要执行的异常处理程序;
  • Debug-RAM主要在运行Debug-ROM中固定异常处理程序时作为数据段使用,用于存放一些临时数据和中间数据。

调试流程

调试机制指令的实现:

  • ebreak:触发处理器进入异常模式(调试模式)
    • 调试中断一旦被接收,便会冲刷流水线,处理器PC跳转到0x800地址
    • CSR寄存器dpc的值更新为当前正在执行的指令PC
    • CSR寄存器dcsr的cause域值更新为引发进入调试模式的触发原因
  • dret:触发处理器退出异常模式(调试模式)
    • 被当作一种跳转指令来执行,跳转PC为CSR寄存器dpc的值
    • 将dcsr寄存器中的cause域清除

未来:超越摩尔定律

DSA(Domain-Specific Architecture,领域专用架构)方面:

  • 使用专用内存以最大限度地减少数据移动
  • 将资源投入到更多的运算单元或更大的内存中
  • 使用与域匹配的最简单的并行形式
  • 将数据大小和类型减少到域所需的最简单程度
  • 使用域特定的编程语言

什么是“域特定的编程语言”?即DSL(Domain-Specific Language,领域专用语言)。比如前两年的MojoTaichi都算是Python细化的DSL。