第 1 章:多核一致性问题

  • 理解多核系统一致性根本矛盾
  • 明确“可见性”与“顺序性”区别

核心问题

  1. 一个核写入后,其他核何时看到。
  2. 不同核对写入顺序观察是否一致。
  3. 乱序执行与缓存层次放大一致性复杂度。

第 2 章:MESI 协议

  • 掌握 MESI 状态机与状态迁移
  • 能解释典型读写场景下的总线行为

四状态

  1. M(Modified)
  2. E(Exclusive)
  3. S(Shared)
  4. I(Invalid)

练习

  1. 推导“核0写-核1读”迁移序列。
  2. 统计失效广播次数。

第 3 章:目录协议

  • 理解目录协议替代广播嗅探的思路
  • 设计 sharer 集与 home 节点职责

关键点

  1. Home 记录哪些核持有副本。
  2. 写入前向 sharer 发送失效。
  3. 一致性消息与数据消息解耦。

第 4 章:一致性实现

  • 将一致性协议落地为可实现逻辑
  • 处理并发请求、竞态与重试

实践建议

  1. 先实现单请求串行化模型。
  2. 再引入并发与仲裁。
  3. 必做协议断言与死锁检查。

第 5 章:总线互连

  • 理解总线互连特性与限制
  • 分析仲裁、带宽、延迟三者关系

重点

  1. 共享总线易实现但扩展性有限。
  2. 仲裁策略影响公平性与尾延迟。
  3. 时序收敛常由总线扇出限制。

第 6 章:Crossbar 交叉开关

  • 掌握 Crossbar 并行互连模型
  • 理解面积换带宽的工程权衡

关键点

  1. 多主多从可并发传输。
  2. 冲突路径需仲裁。
  3. 规模增大后面积与布线压力明显。

第 7 章:NoC 片上网络

  • 理解 NoC 路由与流控基础
  • 掌握从总线到网络化互连的迁移逻辑

核心组件

  1. Router
  2. Link
  3. VC/Buffer
  4. Routing algorithm

验收

  1. 基础拓扑可连通。
  2. 压力下无死锁。

第 8 章:原子指令

  • 理解原子操作的语义与硬件支持
  • 建立并发安全更新的实现路径

关键点

  1. 读-改-写不可被打断。
  2. 与一致性协议联动。
  3. 失败重试与公平性处理。

第 9 章:LR/SC 实现

  • 掌握 LR/SC 指令语义与实现约束
  • 处理保留失效与重试路径

核心机制

  1. LR 建立 reservation。
  2. SC 仅在 reservation 有效时成功。
  3. 任何冲突写入会使 reservation 失效。

第 10 章:内存序

  • 理解内存序模型与可见性规则
  • 正确使用 fence 保证同步语义

关键主题

  1. 程序顺序 vs 全局可见顺序。
  2. 弱序模型带来的性能与复杂度权衡。
  3. fence 约束重排边界。

第 11 章:AXI 总线

  • 深入掌握 AXI 五通道握手与时序独立性
  • 理解 ID、突发、乱序返回对微架构的影响
  • 建立 AXI 主从接口的可验证实现框架

11.1 AXI 的本质

AXI 不是一条总线信号,而是 5 条相互解耦的握手通道:

  1. 写地址 AW
  2. 写数据 W
  3. 写响应 B
  4. 读地址 AR
  5. 读数据 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 通道解耦意味着什么

  1. AWW 可乱先后到达。
  2. B 必须对应一笔已接受的写事务。
  3. ARR 独立于写通道并行工作。

实现上不能假设“地址和数据同拍到达”。

11.4 ID 与乱序返回

在多笔并发读写下:

  1. 主机用 ID 区分事务。
  2. 从机可按规则返回(系统可支持同 ID 顺序约束)。
  3. 核心侧需用 scoreboard/队列重组或追踪。

11.5 突发传输要点

  1. LEN/SIZE/BURST 定义突发长度与步进。
  2. WLAST / RLAST 标记突发末 beat。
  3. 地址边界与对齐必须合法。

11.6 与 CPU 流水线的耦合

  1. IF/MEM 发请求后,ready_go 往往与返回通道有效绑定。
  2. 后端阻塞时,AXI 请求发起节奏要受 backpressure 控制。
  3. flush 后需处理在途事务返回的过滤。

11.7 最小验证清单

  1. valid 高且未握手时 payload 不变。
  2. 并发读写时无通道互相阻塞死锁。
  3. 突发末拍 LAST 位置正确。
  4. 读写响应 ID 匹配且计数守恒。

第 12 章:外设集成

  • 建立 SoC 外设集成的统一框架
  • 规范 MMIO 地址映射、寄存器语义和时序接口
  • 保证外设访问在流水线与总线系统中可验证

12.1 外设集成三件事

  1. 地址映射:每个外设分配不重叠地址区间。
  2. 总线适配:AXI/AHB/APB 或自定义桥接。
  3. 语义定义:寄存器读写 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

要求:

  1. 译码互斥或明确优先级。
  2. 未命中地址返回可诊断错误码。

12.3 寄存器设计规范

  1. RWROW1C 等属性明确。
  2. 复位值明确。
  3. 写入副作用(触发发送/清中断)明确。

12.4 与流水线交互

  1. 访问外设通常是高延迟路径,应支持 backpressure。
  2. 有些寄存器读可能具 side effect,不能重复发起。
  3. 异常/flush 时要避免重复提交 MMIO 写。

12.5 最小验证

  1. 地址边界测试:首地址、末地址、越界地址。
  2. 读写一致性:写后读回。
  3. side effect 测试:一次写仅触发一次行为。

第 13 章:中断控制器

  • 掌握 PLIC 的优先级仲裁与 claim/complete 协议
  • 将外设中断源安全路由到多核上下文
  • 保证中断处理路径可重入、可恢复、可验证

13.1 PLIC 工作模型

  1. 外设拉起中断源 irq_i
  2. PLIC 根据优先级与使能计算 pending。
  3. CPU 读取 claim 得到中断号。
  4. CPU 处理后写 complete 完成清除流程。

13.2 核心寄存器

  1. Priority:每个源的优先级。
  2. Pending:源是否待处理。
  3. Enable:每个 context 的使能位图。
  4. Threshold:低于阈值不投递。

13.3 Claim/Complete 语义

  1. claim 读取会“消费”一个可服务中断。
  2. complete 写回对应中断号,通知处理结束。
  3. claim 与 complete 不匹配会导致中断状态异常。

13.4 多核注意事项

  1. 每核 context 独立配置。
  2. 同一中断源同一时刻只能被一个 context claim。
  3. 需防止重复投递与丢中断。

13.5 最小验证

  1. 单源单核:完整 claim/complete 回路。
  2. 多源同拍:优先级选择正确。
  3. 双核竞争:同一源不被双重 claim。

第 14 章:DMA 控制器

  • 理解 DMA 提升吞吐与降低 CPU 负担的机制
  • 掌握描述符、传输状态机、中断回报流程
  • 处理 DMA 与 Cache 一致性问题

14.1 DMA 最小路径

  1. CPU 配置源地址、目的地址、长度、启动位。
  2. DMA 发起总线传输并搬运数据。
  3. 传输完成置位状态并触发中断。

14.2 DMA 状态机

  1. IDLE
  2. FETCH_CFG
  3. TRANSFER
  4. DONE/IRQ
  5. ERROR(可选)

14.3 与 Cache 一致性

DMA 绕过 CPU 管线直接访存,常见问题:

  1. CPU cache 中有脏数据,DMA 读到旧值。
  2. DMA 写回内存后,CPU 仍读到 cache 旧副本。

常见解决:

  1. 传输前后执行 cache flush/invalidate。
  2. 指定 DMA 区域为 non-cacheable。
  3. 使用硬件一致性互连(复杂度更高)。

14.4 最小验证

  1. 小包与大包传输都正确。
  2. 错误地址触发错误状态而非死锁。
  3. 完成中断仅触发一次。

第 15 章:SMP 操作系统

  • 理解 SMP OS 在多核 SoC 上的关键依赖
  • 建立调度、同步、中断在多核环境下的联合视角
  • 为后续系统联调准备可观测指标

15.1 SMP 运行基本条件

  1. 每核可独立启动与响应中断。
  2. 定时器/IPI 可用。
  3. 一致性与内存序满足 OS 假设。

15.2 关键交互

  1. 调度器跨核迁移任务。
  2. 锁与原子操作保护共享数据。
  3. 中断负载分布影响系统尾延迟。

15.3 常见问题

  1. 核间可见性延迟导致锁失效。
  2. IPI 路径异常导致调度卡死。
  3. 中断亲和性配置不当导致单核过载。

15.4 最小验证

  1. 双核启动并报告在线 CPU 数。
  2. 多线程压力测试无死锁。
  3. 锁竞争场景结果一致。

第 16 章:调试器集成

  • 建立多核 SoC 的分层调试策略
  • 把“系统症状”快速映射到“具体模块”
  • 提升复杂问题复现与定位效率

16.1 分层调试方法

  1. 系统层:是否卡死、重启、吞吐下降。
  2. 事务层:互连/一致性消息是否异常。
  3. 模块层:核内流水线、外设状态机。

16.2 推荐观测信号

  1. 每核 commit_pc/commit_valid
  2. 一致性事务计数。
  3. 中断入口/返回事件。
  4. AXI outstanding 深度。

16.3 断点与触发

  1. 以“异常提交”或“超时无提交”作为触发条件。
  2. 保留最近 N 条事务日志环形缓冲。
  3. 出错后自动导出最小复现信息。

16.4 最小验收

  1. 能定位一次真实死锁/卡顿问题。
  2. 给出复现步骤、根因和修复结果。

第 17 章:性能优化

  • 在多核 SoC 级别开展系统调优
  • 建立“性能-功耗-复杂度”三方权衡意识
  • 输出可复现优化结论

17.1 优化维度

  1. 核内:预测、缓存、流水线参数。
  2. 核间:一致性流量、互连拥塞。
  3. 系统:中断策略、DMA 策略、任务绑核。

17.2 指标体系

  1. 吞吐:IPC、任务完成时间。
  2. 延迟:尾延迟、中断响应时间。
  3. 流量:NoC 利用率、一致性消息量。

17.3 调优原则

  1. 先定位最大瓶颈再动手。
  2. 一次只改一个主因素。
  3. 所有优化必须回归正确性与稳定性。

17.4 交付要求

  1. 基线与优化后数据表。
  2. 每项优化的收益与副作用。
  3. 可复现实验脚本。

项目目标

实现双核 SoC 原型并运行多核负载,验证一致性、互连、外设中断、DMA 协同与系统稳定性。

必做能力

  1. 双核启动与同步机制。
  2. 一致性协议可运行并可观测。
  3. AXI/外设通路稳定。
  4. PLIC/定时器中断正确分发。
  5. DMA 与 cache 协同可控。

阶段里程碑

  1. 双核裸机通信跑通。
  2. 一致性压力测试通过。
  3. 中断与 DMA 联调通过。
  4. 多核系统负载稳定运行。

验收标准

  1. 正确性:无数据不一致、无错路提交。
  2. 稳定性:长时间压力无死锁。
  3. 性能:给出多核加速比与瓶颈分析。
  4. 文档:架构图、时序图、调试复盘。

提交物

  1. 源码与构建脚本。
  2. 自动回归脚本。
  3. 关键波形与日志。
  4. 性能调优报告。

更新时间: