超大规模集成电路设计笔记:第五篇
SoC总线
- 总线提供了系统中各个设备之间一种互连的访问共享硬件机制
- 在数字系统中,总线承担数据传输任务,如处理器和存储器之间的数据传输
- 总线的传输能力由总线的带宽和工作频率决定
- 总线的设计通常要考虑4个因素:总线宽度、时钟频率、仲裁机制和传输类型
常见的总线有:
- AMBA:ARM公司定义的总线体系,广泛用于嵌入式SoC,包括 AHB、APB、AXI 等多个子协议
- OCP:开放式核心接口协议,模块化设计,适合IP核集成
- Wishbone:由OpenCores定义的开源SoC总线,简单易用,适合教学或FPGA设计
- Avalon:原Altera公司定义的片上总线协议
AMBA
常见IP
SoC中的常见IP包括:中断控制器、实时时钟、SPI、定时器、看门狗等。
一个完整的 SoC 通常包含如下模块(IP):
1 | ┌──────────────────────────┐ |
中断控制器
中断控制器(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,串行外设接口)允许与外围设备的全双工同步串行通信。
定时器与看门狗
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域值更新为引发进入调试模式的触发原因
- 调试中断一旦被接收,便会冲刷流水线,处理器PC跳转到
- dret:触发处理器退出异常模式(调试模式)
- 被当作一种跳转指令来执行,跳转PC为CSR寄存器dpc的值
- 将dcsr寄存器中的
cause域清除
未来:超越摩尔定律
DSA(Domain-Specific Architecture,领域专用架构)方面:
- 使用专用内存以最大限度地减少数据移动
- 将资源投入到更多的运算单元或更大的内存中
- 使用与域匹配的最简单的并行形式
- 将数据大小和类型减少到域所需的最简单程度
- 使用域特定的编程语言


