# 面向模拟 IC 工程师的数字设计课程

这是完整数模混合控制课程的 01–24 基础部分。已选方向、25–48 专项课及结课目标见 [48 节方向总纲](../mixed_signal/00_course.md)。本页原有讲义和实验继续使用。

版本：2026-10-03。对象：熟悉晶体管、电路时序、负载和 PVT，尚未系统学习 RTL 的模拟 IC 工程师。

## 学完要能做什么

独立完成一个小型数模控制模块的规格、RTL、验证和逻辑综合；能解释时序约束的物理来源，识别跨时钟与配置更新风险；具备阅读布局布线结果的基础。

贯穿案例是 SPI 控制模拟配置。先用单系统时钟 Master 建立同步设计直觉，再学习 Slave、跨时钟和配置提交。不会一开始就同时加入全部 SPI 模式、处理器、DMA 或复杂总线。

这是一套完整的课程讲义、实验任务、答案和验收标准。第 01 阶段有现成且已验证的 RTL/testbench；后续阶段的设计题由学习者逐步实现，并不代表仓库已经包含这些模块的可运行实现。

## 如何使用

每节先读“讲解”，自己完成练习，再看 [参考答案](07_answers.md)。每阶段留下三种证据：一张电路/时序图、一份实验记录、一段对结果的解释。工具运行成功和学习验收分别记录。

建议安排 60–90 小时，按每周 6–8 小时约需 8–15 周；这是起始预算，按理解程度调整。每次学习约 60–90 分钟：20 分钟理解，30–50 分钟预测与实验，10–20 分钟复盘。通过验收再推进，不以日期强行跳过基础。

已有模拟知识可以直接用于理解门延迟、负载和时钟质量。需要特别训练的是：离散状态、寄存器更新语义、接口契约、自动验证、约束与实现的一致性。

## 课程目录

| 节次 | 主题 | 练习产物 |
|---|---|---|
| 01 | SPI 规格与接口契约 | 接口和时序表 |
| 02 | A5/3C 逐沿推演 | 完整一帧采样表 |
| 03 | 寄存器与非阻塞赋值 | 数据通路和 next-state 推导 |
| 04 | 分频、计数器与状态机 | 分频计算及状态转移图 |
| 05 | 复位、请求和完成语义 | 边界行为表 |
| 06 | 自检查验证与错误注入 | 覆盖矩阵和失败证据 |
| 07 | Liberty 与标准单元 | 单元模型对照表 |
| 08 | 综合、优化与网表 | 37 个触发器的解释 |
| 09 | setup/hold 与时序报告 | 两类 slack 手算 |
| 10 | SDC 与真实 SPI 预算 | 约束假设和外部预算 |
| 11 | SPI Slave 架构选择 | SCLK 域与过采样方案比较 |
| 12 | 单比特 CDC 与亚稳态 | 同步器及脉冲传输方案 |
| 13 | 多位数据与握手 | mailbox 时序图 |
| 14 | 影子寄存器与原子提交 | 模拟配置更新协议 |
| 15 | 多域复位、读回与 CDC 验证 | 异常恢复矩阵 |
| 16 | 模块分层与寄存器语义 | 地址表和接口规格 |
| 17 | FIFO、流控与吞吐量 | 同步 FIFO 边界推演 |
| 18 | 可选 APB 接口 | 握手表与适配器设计 |
| 19 | 物理实现输入与 floorplan | 数据依赖表和资源预算 |
| 20 | CTS 与时钟质量 | setup/hold 偏斜比较 |
| 21 | 布线、寄生与时序收敛 | 违例归因及修复计划 |
| 22 | 活动、功耗与数模耦合 | 活动统计和功耗预算 |
| 23 | SPI 模拟配置控制器规格 | 完整顶层契约 |
| 24 | 综合设计评审与交付 | 证据包和验收报告 |

## 六个阶段

| 顺序 | 讲义 | 学习门槛 |
|---|---|---|
| 一 | [01–06：同步 RTL 与 SPI Master](01_sync_spi.md) | 看懂首位、末位、复位和 done；验证能发现错误 |
| 二 | [07–10：综合与时序](02_synth_sta.md) | 把报告对应到电路，分别计算 setup/hold |
| 三 | [11–15：SPI Slave、CDC 与配置](03_slave_cdc.md) | 证明配置一致性，明确跨域与复位协议 |
| 四 | [16–18：集成与流控](04_integration.md) | 明确一次操作何时接受、等待或拒绝 |
| 五 | [19–22：物理实现与功耗](05_physical.md) | 根据物理数据解释时序变化和功耗来源 |
| 六 | [23–24：综合项目](06_capstone.md) | 规格、实现、验证和约束形成可审查的证据链 |

[实验记录与验收表](08_workbook.md) 用于记录自己的结果。[现有 SPI 讲义](../01_spi_master.md) 和 [真实综合报告解读](../02_read_first_reports.md) 是前两个阶段的工程参考。

## 实验环境和证据边界

本地保存源码，服务器 `IC_Server` 上运行独立 batch job。先读 [进度记录](../progress.md)，不重复安装已有工具。运行方式见 [统一运行指南](../running.md)。不要修改现有 GUI 会话、共享服务或全局 PATH。

默认规格固定为 50 MHz 系统时钟、1 MHz SCLK、Mode 0、8 bit、MSB first；当前 Master 内部全部寄存器只由 `clk` 驱动，`rst_n` 同步低有效。后续 Slave 的时钟架构在单独阶段讨论，不回改第 01 课契约。

做修改前先查看 `git status` 和 `git diff`，保留未提交工作。改变 RTL/testbench/SDC 后，先运行 `scripts/run_sim.sh` 的分频 1、3、25 全套测试，再运行 `scripts/run_synth.sh`。检查退出码、完成标记、映射单元、约束检查及网表。恢复基线时同样确认恢复后的验证结果。

`results/`、波形、日志和 `.tools/` 不进入 Git。文档记录命令、版本、结果摘要及证据位置，不复制许可证、PDK 或教学库正文。传输使用普通 scp，并校验 SHA-256。

现有 tutorial.lib 是教学模型，不是流片 PDK。逻辑综合讲义和数字预算计算可立即完成。Innovus 可执行文件存在并不意味着配套的技术 LEF、单元 LEF、RC 数据和多角库已具备；缺这些数据时，第五阶段做计算与报告阅读练习，不能虚构布局布线结果。

RTL 仿真不等于形式等价；正 slack 不等于接口或流片签核。后续物理实验是否能通过，需要真实运行确认。

## 第一轮学习安排

先做 01–02，不修改 RTL。标注默认参数第一帧的八个采样点，解释首位提前有效和末尾 CS 保持。把答案写入实验记录，再与老师讨论。之后推进 03–06，用小范围错误注入检查自己是否理解电路与验证。

不要先背完 SystemVerilog 语法。每遇到一段 RTL，都先回答：它描述哪些寄存器？D 端由什么逻辑产生？在哪个时钟边沿更新？外部信号需要满足什么时序？
