A 级课程 - 乱序 SoC
第 1 章:多核一致性问题
- 理解多核系统一致性根本矛盾
- 明确“可见性”与“顺序性”区别
核心问题
- 一个核写入后,其他核何时看到。
- 不同核对写入顺序观察是否一致。
- 乱序执行与缓存层次放大一致性复杂度。
第 2 章:MESI 协议
- 掌握 MESI 状态机与状态迁移
- 能解释典型读写场景下的总线行为
四状态
- M(Modified)
- E(Exclusive)
- S(Shared)
- I(Invalid)
练习
- 推导“核0写-核1读”迁移序列。
- 统计失效广播次数。
第 3 章:目录协议
- 理解目录协议替代广播嗅探的思路
- 设计 sharer 集与 home 节点职责
关键点
- Home 记录哪些核持有副本。
- 写入前向 sharer 发送失效。
- 一致性消息与数据消息解耦。
第 4 章:一致性实现
- 将一致性协议落地为可实现逻辑
- 处理并发请求、竞态与重试
实践建议
- 先实现单请求串行化模型。
- 再引入并发与仲裁。
- 必做协议断言与死锁检查。
第 5 章:总线互连
- 理解总线互连特性与限制
- 分析仲裁、带宽、延迟三者关系
重点
- 共享总线易实现但扩展性有限。
- 仲裁策略影响公平性与尾延迟。
- 时序收敛常由总线扇出限制。
第 6 章:Crossbar 交叉开关
- 掌握 Crossbar 并行互连模型
- 理解面积换带宽的工程权衡
关键点
- 多主多从可并发传输。
- 冲突路径需仲裁。
- 规模增大后面积与布线压力明显。
第 7 章:NoC 片上网络
- 理解 NoC 路由与流控基础
- 掌握从总线到网络化互连的迁移逻辑
核心组件
- Router
- Link
- VC/Buffer
- Routing algorithm
验收
- 基础拓扑可连通。
- 压力下无死锁。
第 8 章:原子指令
- 理解原子操作的语义与硬件支持
- 建立并发安全更新的实现路径
关键点
- 读-改-写不可被打断。
- 与一致性协议联动。
- 失败重试与公平性处理。
第 9 章:LR/SC 实现
- 掌握 LR/SC 指令语义与实现约束
- 处理保留失效与重试路径
核心机制
- LR 建立 reservation。
- SC 仅在 reservation 有效时成功。
- 任何冲突写入会使 reservation 失效。
第 10 章:内存序
- 理解内存序模型与可见性规则
- 正确使用 fence 保证同步语义
关键主题
- 程序顺序 vs 全局可见顺序。
- 弱序模型带来的性能与复杂度权衡。
fence约束重排边界。
第 11 章:AXI 总线
- 深入掌握 AXI 五通道握手与时序独立性
- 理解 ID、突发、乱序返回对微架构的影响
- 建立 AXI 主从接口的可验证实现框架
11.1 AXI 的本质
AXI 不是一条总线信号,而是 5 条相互解耦的握手通道:
- 写地址
AW - 写数据
W - 写响应
B - 读地址
AR - 读数据
R
每条通道都遵循同一握手规则:valid && ready 才完成一次传输。
11.2 握手稳定性规则
主机拉高 valid 后,在握手完成前必须保持 payload 稳定。
always @(posedge aclk) begin
if (!aresetn) begin
awvalid <= 1'b0;
end else if (awvalid && !awready) begin
awvalid <= 1'b1; // 继续保持
awaddr <= awaddr; // payload 保持稳定(示意)
end
end
11.3 通道解耦意味着什么
AW与W可乱先后到达。B必须对应一笔已接受的写事务。AR与R独立于写通道并行工作。
实现上不能假设“地址和数据同拍到达”。
11.4 ID 与乱序返回
在多笔并发读写下:
- 主机用
ID区分事务。 - 从机可按规则返回(系统可支持同 ID 顺序约束)。
- 核心侧需用 scoreboard/队列重组或追踪。
11.5 突发传输要点
LEN/SIZE/BURST定义突发长度与步进。WLAST/RLAST标记突发末 beat。- 地址边界与对齐必须合法。
11.6 与 CPU 流水线的耦合
- IF/MEM 发请求后,
ready_go往往与返回通道有效绑定。 - 后端阻塞时,AXI 请求发起节奏要受 backpressure 控制。
- flush 后需处理在途事务返回的过滤。
11.7 最小验证清单
valid高且未握手时 payload 不变。- 并发读写时无通道互相阻塞死锁。
- 突发末拍
LAST位置正确。 - 读写响应 ID 匹配且计数守恒。
第 12 章:外设集成
- 建立 SoC 外设集成的统一框架
- 规范 MMIO 地址映射、寄存器语义和时序接口
- 保证外设访问在流水线与总线系统中可验证
12.1 外设集成三件事
- 地址映射:每个外设分配不重叠地址区间。
- 总线适配:AXI/AHB/APB 或自定义桥接。
- 语义定义:寄存器读写 side effect 清晰可文档化。
12.2 MMIO 译码模板
always @(*) begin
sel_uart = (addr[31:16] == 16'h1fe0);
sel_plic = (addr[31:20] == 12'h0c0);
sel_clint= (addr[31:16] == 16'h0200);
end
要求:
- 译码互斥或明确优先级。
- 未命中地址返回可诊断错误码。
12.3 寄存器设计规范
RW、RO、W1C等属性明确。- 复位值明确。
- 写入副作用(触发发送/清中断)明确。
12.4 与流水线交互
- 访问外设通常是高延迟路径,应支持 backpressure。
- 有些寄存器读可能具 side effect,不能重复发起。
- 异常/flush 时要避免重复提交 MMIO 写。
12.5 最小验证
- 地址边界测试:首地址、末地址、越界地址。
- 读写一致性:写后读回。
- side effect 测试:一次写仅触发一次行为。
第 13 章:中断控制器
- 掌握 PLIC 的优先级仲裁与 claim/complete 协议
- 将外设中断源安全路由到多核上下文
- 保证中断处理路径可重入、可恢复、可验证
13.1 PLIC 工作模型
- 外设拉起中断源
irq_i。 - PLIC 根据优先级与使能计算 pending。
- CPU 读取 claim 得到中断号。
- CPU 处理后写 complete 完成清除流程。
13.2 核心寄存器
- Priority:每个源的优先级。
- Pending:源是否待处理。
- Enable:每个 context 的使能位图。
- Threshold:低于阈值不投递。
13.3 Claim/Complete 语义
- claim 读取会“消费”一个可服务中断。
- complete 写回对应中断号,通知处理结束。
- claim 与 complete 不匹配会导致中断状态异常。
13.4 多核注意事项
- 每核 context 独立配置。
- 同一中断源同一时刻只能被一个 context claim。
- 需防止重复投递与丢中断。
13.5 最小验证
- 单源单核:完整 claim/complete 回路。
- 多源同拍:优先级选择正确。
- 双核竞争:同一源不被双重 claim。
第 14 章:DMA 控制器
- 理解 DMA 提升吞吐与降低 CPU 负担的机制
- 掌握描述符、传输状态机、中断回报流程
- 处理 DMA 与 Cache 一致性问题
14.1 DMA 最小路径
- CPU 配置源地址、目的地址、长度、启动位。
- DMA 发起总线传输并搬运数据。
- 传输完成置位状态并触发中断。
14.2 DMA 状态机
- IDLE
- FETCH_CFG
- TRANSFER
- DONE/IRQ
- ERROR(可选)
14.3 与 Cache 一致性
DMA 绕过 CPU 管线直接访存,常见问题:
- CPU cache 中有脏数据,DMA 读到旧值。
- DMA 写回内存后,CPU 仍读到 cache 旧副本。
常见解决:
- 传输前后执行 cache flush/invalidate。
- 指定 DMA 区域为 non-cacheable。
- 使用硬件一致性互连(复杂度更高)。
14.4 最小验证
- 小包与大包传输都正确。
- 错误地址触发错误状态而非死锁。
- 完成中断仅触发一次。
第 15 章:SMP 操作系统
- 理解 SMP OS 在多核 SoC 上的关键依赖
- 建立调度、同步、中断在多核环境下的联合视角
- 为后续系统联调准备可观测指标
15.1 SMP 运行基本条件
- 每核可独立启动与响应中断。
- 定时器/IPI 可用。
- 一致性与内存序满足 OS 假设。
15.2 关键交互
- 调度器跨核迁移任务。
- 锁与原子操作保护共享数据。
- 中断负载分布影响系统尾延迟。
15.3 常见问题
- 核间可见性延迟导致锁失效。
- IPI 路径异常导致调度卡死。
- 中断亲和性配置不当导致单核过载。
15.4 最小验证
- 双核启动并报告在线 CPU 数。
- 多线程压力测试无死锁。
- 锁竞争场景结果一致。
第 16 章:调试器集成
- 建立多核 SoC 的分层调试策略
- 把“系统症状”快速映射到“具体模块”
- 提升复杂问题复现与定位效率
16.1 分层调试方法
- 系统层:是否卡死、重启、吞吐下降。
- 事务层:互连/一致性消息是否异常。
- 模块层:核内流水线、外设状态机。
16.2 推荐观测信号
- 每核
commit_pc/commit_valid。 - 一致性事务计数。
- 中断入口/返回事件。
- AXI outstanding 深度。
16.3 断点与触发
- 以“异常提交”或“超时无提交”作为触发条件。
- 保留最近 N 条事务日志环形缓冲。
- 出错后自动导出最小复现信息。
16.4 最小验收
- 能定位一次真实死锁/卡顿问题。
- 给出复现步骤、根因和修复结果。
第 17 章:性能优化
- 在多核 SoC 级别开展系统调优
- 建立“性能-功耗-复杂度”三方权衡意识
- 输出可复现优化结论
17.1 优化维度
- 核内:预测、缓存、流水线参数。
- 核间:一致性流量、互连拥塞。
- 系统:中断策略、DMA 策略、任务绑核。
17.2 指标体系
- 吞吐:IPC、任务完成时间。
- 延迟:尾延迟、中断响应时间。
- 流量:NoC 利用率、一致性消息量。
17.3 调优原则
- 先定位最大瓶颈再动手。
- 一次只改一个主因素。
- 所有优化必须回归正确性与稳定性。
17.4 交付要求
- 基线与优化后数据表。
- 每项优化的收益与副作用。
- 可复现实验脚本。
项目目标
实现双核 SoC 原型并运行多核负载,验证一致性、互连、外设中断、DMA 协同与系统稳定性。
必做能力
- 双核启动与同步机制。
- 一致性协议可运行并可观测。
- AXI/外设通路稳定。
- PLIC/定时器中断正确分发。
- DMA 与 cache 协同可控。
阶段里程碑
- 双核裸机通信跑通。
- 一致性压力测试通过。
- 中断与 DMA 联调通过。
- 多核系统负载稳定运行。
验收标准
- 正确性:无数据不一致、无错路提交。
- 稳定性:长时间压力无死锁。
- 性能:给出多核加速比与瓶颈分析。
- 文档:架构图、时序图、调试复盘。
提交物
- 源码与构建脚本。
- 自动回归脚本。
- 关键波形与日志。
- 性能调优报告。