# Architecture Design

> 芯片架构设计技能 - 从需求定义到模块划分，完整指导芯片架构开发

- Skill: `tangyangchao578-art/architecture-design` (Agent Skill)
- Install (CLI): `npx skillmds@latest add tangyangchao578-art/architecture-design`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tangyangchao578-art/architecture-design/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: tangyangchao578-art (https://skillmd.com/u/tangyangchao578-art)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tangyangchao578-art/architecture-design

---


# 芯片架构设计技能

当用户需要进行芯片架构设计时，启用此技能。此技能提供芯片架构设计的完整指导，从需求定义到模块划分，遵循工业界最佳实践。

## When to Activate

- 新项目启动，需要定义整体芯片架构
- 项目新增功能模块，需要定义接口和交互
- 对现有架构进行重构优化
- 需要评估不同架构方案的优缺点
- 需要进行架构权衡分析（面积vs性能vs功耗）

---

## 行业经验数值

### 架构设计经验值

| 参数 | 典型值 | 说明 |
|------|--------|------|
| 模块大小 | 10k-100k 门 | 单个模块大小 |
| 层次深度 | 3-4 层 | 模块层次深度 |
| 时钟域数量 | 3-10 个 | 时钟域数量 |
| 复位域数量 | 2-5 个 | 复位域数量 |
| 电源域数量 | 2-4 个 | 电源域数量 |
| 面积余量 | 10-15% | 预留面积余量 |
| 功耗余量 | 15-20% | 预留功耗余量 |

### PPA 权衡参考

| 设计目标 | 面积优化 | 性能优化 | 功耗优化 |
|----------|----------|----------|----------|
| 逻辑设计 | 资源共享 | 流水线 | 门控时钟 |
| 存储器 | 单端口 | 多端口 | 低漏电 |
| 总线 | 窄总线 | 宽总线 | 按需唤醒 |
| 时钟 | 少时钟域 | 多时钟域 | 时钟门控 |

### IP 选型经验值

| IP 类型 | 评估周期 | 授权费用 | 集成周期 |
|---------|----------|----------|----------|
| CPU | 1-2 月 | $50k-500k | 2-4 月 |
| DDR 控制器 | 1 月 | $20k-100k | 1-2 月 |
| PCIe 控制器 | 1 月 | $20k-100k | 1-2 月 |
| USB 控制器 | 2 周 | $10k-50k | 2-4 周 |
| 以太网 MAC | 2 周 | $10k-50k | 2-4 周 |
| PLL | 2 周 | $5k-20k | 1-2 周 |

---

## 故障诊断框架

### 症状1：架构无法满足性能需求

**诊断步骤：**

```
1. 分析性能瓶颈
2. 检查总线带宽
3. 检查存储器延迟
4. 检查流水线深度
```

**判断标准：**

| 性能差距 | 判断 | 行动 |
|----------|------|------|
| < 10% | 可接受 | 微调优化 |
| 10-30% | 需优化 | 流水线/并行 |
| > 30% | 架构问题 | 重新设计 |

**根本原因定位：**

| 根本原因 | 诊断特征 | 解决方案 |
|----------|----------|----------|
| 总线带宽不足 | 总线利用率 > 80% | 增加总线宽度/增加总线 |
| 存储器延迟大 | 命中率低 | 增加缓存/预取 |
| 流水线浅 | 关键路径长 | 增加流水级 |
| 模块串行执行 | 利用率低 | 并行化设计 |

### 症状2：面积超出预算

**诊断步骤：**

```
1. 分析面积分布
2. 识别面积大户
3. 检查是否有优化空间
4. 检查是否有冗余功能
```

**根本原因定位：**

| 根本原因 | 诊断特征 | 解决方案 |
|----------|----------|----------|
| 存储器过大 | 存储器占比 > 50% | 压缩算法/减少容量 |
| 逻辑冗余 | 有未使用功能 | 删除冗余功能 |
| IP 选择不当 | IP 面积大 | 更换 IP |
| 设计过度 | 安全裕度过大 | 减少冗余 |

### 症状3：功耗超出预算

**诊断步骤：**

```
1. 分析功耗分布
2. 识别功耗大户
3. 检查时钟门控率
4. 检查电源域划分
```

**根本原因定位：**

| 根本原因 | 诊断特征 | 解决方案 |
|----------|----------|----------|
| 时钟门控率低 | < 70% | 增加门控条件 |
| 电源域过少 | 无可关断域 | 增加电源域 |
| 漏电功耗高 | 静态功耗占比高 | 降低电压/使用低漏电库 |
| 活动因子高 | 动态功耗高 | 优化算法/减少翻转 |

---

## 步骤 1：需求收集和分析

在开始设计之前，必须收集并明确所有需求。

### 1.1 收集功能需求

**做什么：** 从产品经理/系统工程师获取完整功能需求列表。

**怎么做：**
1. 召开需求评审会议，邀请产品、系统、验证、后端代表
2. 逐条确认每个功能点的输入、输出、边界条件
3. 记录每个功能的优先级：P0（必须有）、P1（应该有）、P2（可以有）

**输出：** 功能需求列表表格

| 功能 ID | 功能名称 | 描述 | 优先级 | 来源 |
|---------|----------|------|--------|------|
| F001 | PCIe Gen4 x4 | 支持 PCIe Gen4 x4，带宽 64Gbps | P0 | 产品需求 |
| F002 | DDR4 控制器 | 支持 DDR4-3200，最大 16GB | P0 | 产品需求 |
| F003 | 安全启动 | 支持 secure boot | P1 | 安全需求 |

### 1.2 收集性能需求

**做什么：** 明确性能指标，这些直接影响架构决策。

**怎么做：**
1. 确认目标工作频率
2. 确认峰值吞吐量
3. 确认平均延迟和最坏延迟要求
4. 确认带宽瓶颈在哪里

**输出：** 性能需求表格

| 指标 | 数值 | 来源 |
|------|------|------|
| 目标频率 | 500MHz | 系统需求 |
| PCIe 峰值带宽 | 64 Gbps | 产品需求 |
| DDR 延迟 | < 100ns (平均) | 系统需求 |
| 功耗 | < 5W | 产品需求 |

### 1.3 收集面积和功耗预算

**做什么：** 明确面积和功耗限制，这些是架构的硬约束。

**怎么做：**
1. 与后端确认工艺和面积预算
2. 与封装/热设计确认功耗预算
3. 分解总预算到各子系统

**输出：** PPA 预算分配表

| 子系统 | 面积预算 (mm²) | 动态功耗 (mW) | 静态功耗 (mW) |
|--------|----------------|---------------|---------------|
| CPU | 2.0 | 500 | 50 |
| DDR 控制器 | 1.5 | 300 | 30 |
| PCIe | 1.0 | 200 | 20 |
| 其他 | 0.5 | 100 | 10 |
| **总计** | **5.0** | **1100** | **110** |

### 1.4 收集接口需求

**做什么：** 明确所有片外接口和片上总线接口。

**怎么做：**
1. 列出所有片外接口（PCIe、DDR、USB、以太网等）
2. 列出片上总线接口（AXI、AHB、APB）
3. 确认每个接口的协议版本和参数

**输出：** 接口需求列表

| 接口名称 | 类型 | 协议 | 宽度 | 频率 |
|----------|------|------|------|------|
| PCIe | 片外 | PCIe Gen4 | x4 | 250MHz |
| DDR | 片外 | DDR4-3200 | 64-bit | 400MHz |
| AXI 主 | 片上 | AXI4 | 128-bit | 500MHz |
| AXI 从 | 片上 | AXI4-Lite | 32-bit | 500MHz |

### 1.5 收集安全和测试需求

**做什么：** 明确功能安全等级和 DFT 需求。

**怎么做：**
1. 确认功能安全等级（ASIL A/B/C/D）
2. 确认 DFT 覆盖率要求
3. 确认测试时间限制

**输出：** 安全和测试需求

| 需求类型 | 要求 | 来源 |
|----------|------|------|
| 功能安全 | ASIL-B | ISO 26262 |
| DFT 覆盖率 | > 98% | 公司标准 |
| 测试时间 | < 1s | 量产需求 |

### 1.6 IP 需求识别

**做什么：** 识别需要外购或复用的 IP 模块。

**怎么做：**
1. 列出所有功能模块
2. 标注哪些可以购买 IP
3. 标注哪些可以复用已有设计
4. 标注哪些需要自研

**输出：** IP 需求列表

| 模块 | 来源选项 | 推荐来源 | 理由 |
|------|----------|----------|------|
| CPU | 外购/自研 | 外购 ARM/RISC-V | 开发周期短 |
| DDR 控制器 | 外购 | Synopsys/Cadence | 协议复杂 |
| PCIe 控制器 | 外购 | Synopsys | 协议复杂 |
| UART | 复用/自研 | 复用 | 已有成熟设计 |
| 特殊加速器 | 自研 | 自研 | 无合适 IP |

### 1.7 需求评审和签字

**做什么：** 需求文档评审，所有相关方签字确认。

**怎么做：**
1. 发送需求文档给所有相关方评审
2. 召开需求评审会议
3. 记录所有问题和修改意见
4. 修改后重新评审
5. 所有相关方签字确认

**检查清单：**
- [ ] 所有功能需求都已明确
- [ ] 所有性能指标都已量化
- [ ] 面积功耗预算都已分配
- [ ] 所有接口协议都已确认
- [ ] 安全和测试需求都已明确
- [ ] 所有相关方都已签字确认

---

## 步骤 2：顶层接口定义

需求明确后，首先定义顶层接口。

### 2.1 定义片外接口

**做什么：** 确定芯片与外部世界的所有接口。

**怎么做：**
1. 根据需求列表，列出所有片外接口
2. 确定每个接口的物理参数（引脚数、电平、协议）
3. 确定电源和地引脚数量
4. 初步估计总引脚数

**输出：** 顶层接口列表

```
芯片顶层接口：
├── 电源接口
│   ├── VDD (数字核心电源) × 20
│   ├── VDDIO (IO电源) × 10
│   ├── VSS (地) × 30
│   └── VDDA (模拟电源) × 5
├── 时钟接口
│   ├── CLK_REF (参考时钟输入)
│   └── CLK_OUT (时钟输出，可选)
├── 复位接口
│   └── RST_N (复位输入)
├── 功能接口
│   ├── PCIe (x4, 差分)
│   ├── DDR (64-bit + ECC)
│   ├── UART (调试)
│   └── JTAG (测试)
└── GPIO
    └── GPIO[15:0] (通用IO)
```

### 2.2 定义片上总线接口

**做什么：** 确定内部模块之间的通信协议。

**怎么做：**
1. 选择总线协议（AXI4/AXI4-Lite/AXI4-Stream/AHB/APB）
2. 确定数据宽度和地址宽度
3. 确定主从关系
4. 画出总线拓扑图

**总线协议选择参考：**

| 协议 | 适用场景 | 优点 | 缺点 |
|------|----------|------|------|
| **AXI4** | 高带宽存储器映射 | 乱序、QoS、区域保护 | 协议复杂、面积大 |
| **AXI4-Lite** | 寄存器配置 | 简单、轻量 | 低带宽 |
| **AXI4-Stream** | 数据流 | 适合视频/网络 | 不支持随机访问 |
| **AHB** | 中带宽系统 | 简单 | 不支持乱序 |
| **APB** | 低带宽外设 | 非常简单 | 低带宽 |

**输出：** 总线拓扑图

```
                    ┌─────────────┐
                    │   CPU       │
                    └──────┬──────┘
                           │ AXI4 主
                    ┌──────┴──────┐
                    │ AXI 互联    │
                    └──────┬──────┘
           ┌───────────────┼───────────────┐
           │               │               │
     ┌─────┴─────┐   ┌─────┴─────┐   ┌─────┴─────┐
     │ DDR 控制器 │   │ PCIe 控制器│   │ 外设桥    │
     │ (AXI 从)  │   │ (AXI 从)  │   │ (AXI 从)  │
     └───────────┘   └───────────┘   └─────┬─────┘
                                           │ APB
                                    ┌──────┴──────┐
                                    │ UART/SPI... │
                                    └─────────────┘
```

### 2.3 定义时钟和复位接口

**做什么：** 确定时钟源和复位策略。

**怎么做：**
1. 列出所有需要的时钟频率
2. 确定时钟源（外部晶振、内部PLL、外部输入）
3. 确定复位源（外部复位、上电复位、看门狗复位）
4. 确定复位策略（同步复位 vs 异步复位）

**输出：** 时钟复位规划表

| 时钟名称 | 频率 | 来源 | 用途 |
|----------|------|------|------|
| clk_sys | 500MHz | 内部 PLL | 系统主时钟 |
| clk_ddr | 400MHz | 内部 PLL | DDR 控制器 |
| clk_pcie | 250MHz | 内部 PLL | PCIe 控制器 |
| clk_ref | 25MHz | 外部晶振 | 参考时钟 |

| 复位名称 | 来源 | 复位域 |
|----------|------|--------|
| rst_n | 外部引脚 | 全局复位 |
| por_n | 上电检测 | 上电复位 |
| wdt_rst | 看门狗 | 安全复位 |

### 2.4 定义电源接口

**做什么：** 确定电源域划分和电压。

**怎么做：**
1. 列出所有电源域
2. 确定每个电源域的电压
3. 确定哪些电源域可以关断
4. 确定电平转换器和隔离单元位置

**输出：** 电源域规划图

```
电源域规划：
├── VDD_ALWAYS (1.0V, 始终上电)
│   ├── CPU
│   ├── 中断控制器
│   └── 电源管理模块
├── VDD_CORE (1.0V, 可关断)
│   ├── DDR 控制器
│   ├── PCIe 控制器
│   └── 其他功能模块
└── VDD_IO (3.3V, 始终上电)
    └── 所有 IO
```

**检查清单：**
- [ ] 所有片外接口都已定义
- [ ] 片上总线协议已确定
- [ ] 时钟源和频率已确定
- [ ] 复位策略已确定
- [ ] 电源域划分已完成
- [ ] 接口总数已估计，封装可行性已确认

---

## 步骤 3：模块划分

顶层接口定义完成后，进行模块划分。

### 3.1 自上而下分层分解

**做什么：** 把系统分解成子系统，子系统分解成模块，模块分解成单元。

**怎么做：**
1. 从顶层开始，列出所有一级子系统
2. 每个子系统再分解成二级模块
3. 每个模块再分解成三级单元
4. 直到每个单元规模合理（< 50k 门）

**分解原则：**

| 原则 | 说明 | 检查方法 |
|------|------|----------|
| 单一职责 | 每个模块只做一件事 | 能用一句话描述模块功能 |
| 松耦合 | 模块间依赖最少 | 接口数量少 |
| 高内聚 | 模块内部紧密关联 | 修改只影响一个模块 |
| 大小适中 | 每个模块 < 100k 门 | 门级估算 |

**输出：** 模块层次树

```
SoC 顶层
├── CPU 子系统
│   ├── CPU 核心 (RISC-V)
│   ├── 指令缓存
│   ├── 数据缓存
│   └── 中断控制器
├── 存储子系统
│   ├── DDR 控制器
│   ├── SRAM 控制器
│   └── DMA 引擎
├── 外设子系统
│   ├── UART 控制器
│   ├── SPI 控制器
│   ├── I2C 控制器
│   └── GPIO 控制器
├── 高速接口子系统
│   ├── PCIe 控制器
│   │   ├── PCIe PHY
│   │   ├── PCIe MAC
│   │   └── NVMe 协议层
│   └── 以太网控制器
└── 系统控制子系统
    ├── 时钟管理
    ├── 复位管理
    ├── 电源管理
    └── JTAG TAP
```

### 3.2 定义每个模块的功能

**做什么：** 为每个模块编写功能描述。

**怎么做：**
1. 用一句话描述模块的核心功能
2. 列出模块的主要特性
3. 列出模块的输入和输出

**输出：** 模块功能描述模板

```markdown
## 模块名称：DDR 控制器

### 功能描述
DDR 控制器负责管理 DDR4 存储器的读写访问，提供给 CPU 和 DMA 引擎统一的存储器访问接口。

### 主要特性
- 支持 DDR4-3200
- 支持 64-bit 数据宽度 + 8-bit ECC
- 支持突发长度 8
- 支持读写优先级可配置
- 支持低功耗模式

### 输入接口
| 接口名 | 类型 | 宽度 | 描述 |
|--------|------|------|------|
| clk | 时钟 | 1 | 控制器时钟 |
| rst_n | 复位 | 1 | 异步复位 |
| axi_aw* | AXI4 | - | AXI 写地址通道 |
| axi_w* | AXI4 | - | AXI 写数据通道 |
| axi_ar* | AXI4 | - | AXI 读地址通道 |

### 输出接口
| 接口名 | 类型 | 宽度 | 描述 |
|--------|------|------|------|
| axi_b* | AXI4 | - | AXI 写响应通道 |
| axi_r* | AXI4 | - | AXI 读数据通道 |
| ddr_* | DDR4 | - | DDR 物理接口 |
```

### 3.3 定义模块间接口

**做什么：** 定义模块之间的通信接口。

**怎么做：**
1. 确定模块间的数据流向
2. 选择合适的接口协议
3. 定义接口信号列表
4. 定义接口时序

**接口设计原则：**

| 原则 | 说明 |
|------|------|
| 使用标准协议 | 优先使用 AXI/APB/AHB 等标准协议 |
| 握手机制 | 必须有 valid/ready 握手 |
| 错误处理 | 定义错误响应机制 |
| 文档化 | 每个接口都有详细文档 |

**✅ 好的接口设计：ready/valid 双向握手**

```systemverilog
// 发送方接口
output logic        o_valid,    // 数据有效
output logic [31:0] o_data,     // 数据
input  logic        i_ready,    // 接收方可以接收

// 接收方接口
input  logic        i_valid,    // 数据有效
input  logic [31:0] i_data,     // 数据
output logic        o_ready,    // 可以接收数据
```

**❌ 不好的接口设计：**
- 没有握手，发送方不管接收方状态
- 只有 valid 没有 ready，接收方无法反压
- 时序没有明确定义

### 3.4 定义模块面积预算

**做什么：** 把总面积预算分配到每个模块。

**怎么做：**
1. 根据功能复杂度估算每个模块面积
2. 查找类似模块的历史数据作为参考
3. 留出 10-15% 的余量

**输出：** 面积预算表

| 模块 | 面积预算 (mm²) | 估算依据 | 风险 |
|------|----------------|----------|------|
| CPU 核心 | 0.8 | 参考设计 | 低 |
| DDR 控制器 | 0.5 | 类似项目 | 低 |
| PCIe 控制器 | 0.4 | 类似项目 | 低 |
| ... | ... | ... | ... |
| **总计** | **4.5** | | |
| **余量** | **0.5** | 10% | |
| **总计+余量** | **5.0** | | |

**检查清单：**
- [ ] 模块层次已定义，最多 3-4 层
- [ ] 每个模块功能描述已编写
- [ ] 模块间接口已定义
- [ ] 接口使用标准协议
- [ ] 面积预算已分配
- [ ] 没有循环依赖
- [ ] 每个模块 < 100k 门

---

## 步骤 3.5：IP 选型评估

对于需要外购的 IP，进行选型评估。

### 3.5.1 IP 供应商评估

**做什么：** 评估候选 IP 供应商。

**评估维度：**

| 维度 | 权重 | 评估内容 |
|------|------|----------|
| 技术成熟度 | 30% | IP 是否经过量产验证 |
| 技术支持 | 20% | 技术支持响应速度和质量 |
| 文档质量 | 15% | 文档是否完整清晰 |
| 授权费用 | 15% | 是否在预算内 |
| 版税 | 10% | 版税是否可接受 |
| 交付周期 | 10% | 是否满足项目时间 |

**供应商评估表：**

| 供应商 | 技术成熟度 | 技术支持 | 文档质量 | 授权费用 | 版税 | 交付周期 | 总分 |
|--------|------------|----------|----------|----------|------|----------|------|
| 供应商A | 9/10 | 8/10 | 9/10 | 7/10 | 8/10 | 9/10 | 8.3 |
| 供应商B | 8/10 | 9/10 | 8/10 | 8/10 | 7/10 | 8/10 | 8.1 |
| 供应商C | 7/10 | 7/10 | 7/10 | 9/10 | 9/10 | 7/10 | 7.6 |

### 3.5.2 IP 技术评估

**做什么：** 评估 IP 的技术指标。

**评估内容：**

| 评估项 | 说明 | 方法 |
|--------|------|------|
| 功能完整性 | 是否满足所有功能需求 | 功能检查表 |
| 性能指标 | 是否满足性能要求 | 数据手册分析 |
| 面积 | 是否在面积预算内 | 参考设计面积 |
| 功耗 | 是否在功耗预算内 | 参考设计功耗 |
| 工艺兼容 | 是否支持目标工艺 | IP 工艺支持列表 |
| 总线接口 | 是否支持目标总线协议 | 接口检查 |

**技术评估表：**

| 评估项 | 需求 | IP A | IP B | IP C |
|--------|------|------|------|------|
| 功能完整性 | 100% | 95% | 100% | 90% |
| 频率 | 500MHz | 600MHz | 500MHz | 450MHz |
| 面积 | < 1mm² | 0.8mm² | 1.2mm² | 0.9mm² |
| 功耗 | < 100mW | 80mW | 120mW | 90mW |
| 工艺支持 | 28nm | 支持 | 支持 | 不支持 |
| 总线接口 | AXI4 | 支持 | 支持 | 支持 |

### 3.5.3 IP 集成评估

**做什么：** 评估 IP 集成的复杂度。

**评估内容：**

| 评估项 | 说明 |
|--------|------|
| 接口复杂度 | IP 接口是否标准，是否需要适配 |
| 配置复杂度 | IP 配置参数是否合理 |
| 验证复杂度 | IP 是否提供验证组件 |
| 文档完整度 | 集成指南是否详细 |
| 集成周期 | 预估集成时间 |

**集成风险评估：**

| 风险 | 概率 | 影响 | 缓解措施 |
|------|------|------|----------|
| 接口不匹配 | 中 | 高 | 提前确认接口协议 |
| 配置错误 | 高 | 中 | 详细阅读文档 |
| 验证困难 | 中 | 高 | 购买 VIP |
| 性能不达标 | 低 | 高 | 预留性能余量 |

### 3.5.4 IP 选型决策

**做什么：** 根据评估结果选择 IP。

**决策流程：**

```
1. 排除不满足基本需求的 IP
2. 对剩余 IP 进行综合评分
3. 考虑风险因素
4. 选择综合评分最高的 IP
5. 记录决策理由
```

**IP 选型决策记录：**

```markdown
## IP 选型决策记录

### 决策 ID: IP-001
### 决策内容: 选择供应商 A 的 DDR 控制器 IP

### 候选 IP:
- IP A: 供应商 A DDR4 控制器
- IP B: 供应商 B DDR4 控制器
- IP C: 供应商 C DDR4 控制器

### 评估结果:
| 维度 | IP A | IP B | IP C |
|------|------|------|------|
| 技术成熟度 | 9 | 8 | 7 |
| 性能 | 8 | 7 | 6 |
| 面积 | 8 | 6 | 8 |
| 功耗 | 9 | 7 | 8 |
| 授权费用 | 7 | 8 | 9 |
| 集成复杂度 | 8 | 8 | 7 |
| **总分** | **8.2** | **7.3** | **7.5** |

### 选择理由:
IP A 在技术成熟度和功耗方面最优，虽然授权费用略高，但整体风险最低。

### 决策人: XXX
### 决策日期: 2024-01-15
```

**IP 选型检查清单：**
- [ ] IP 功能满足需求
- [ ] IP 性能满足要求
- [ ] IP 面积在预算内
- [ ] IP 功耗在预算内
- [ ] IP 支持目标工艺
- [ ] IP 支持目标总线
- [ ] 授权费用在预算内
- [ ] 技术支持有保障
- [ ] 集成复杂度可接受
- [ ] 已记录选型决策

## 步骤 4：时钟域规划

模块划分完成后，进行时钟域规划。

### 4.1 确定时钟域数量

**做什么：** 确定需要多少个时钟域。

**怎么做：**
1. 列出所有需要的时钟频率
2. 相同频率的模块可以放在同一时钟域
3. 不同来源的时钟必须放在不同时钟域
4. 考虑时钟门控需求

**时钟域划分原则：**

| 原则 | 说明 |
|------|------|
| 频率不同 | 不同频率必须不同时钟域 |
| 来源不同 | 不同来源时钟必须不同时钟域 |
| 关断需求 | 需要独立关断的模块单独时钟域 |
| 数量适中 | 时钟域不要太多，增加复杂度 |

### 4.2 定义时钟域关系

**做什么：** 确定时钟域之间的同步/异步关系。

**怎么做：**
1. 画出所有时钟域
2. 标注每个时钟域的频率
3. 标注时钟域之间的数据流向
4. 确定是同步还是异步

**输出：** 时钟域关系图

```
时钟域规划：

clk_sys (500MHz)          clk_ddr (400MHz)         clk_pcie (250MHz)
    │                          │                         │
    ▼                          ▼                         ▼
┌─────────┐               ┌─────────┐              ┌─────────┐
│ CPU     │───异步FIFO───│ DDR     │───异步FIFO──│ PCIe    │
│ 缓存    │               │ 控制器  │              │ 控制器  │
│ 外设    │               │         │              │         │
└─────────┘               └─────────┘              └─────────┘
    │                          │                         │
    └──────────────同步────────┴───────────异步─────────┘
```

### 4.3 定义跨时钟域处理方法

**做什么：** 为每个跨时钟域信号确定同步方法。

**怎么做：**

| 数据类型 | 同步方法 | 适用场景 |
|----------|----------|----------|
| 单比特控制信号 | 两级同步器 | 慢时钟域到快时钟域 |
| 单比特脉冲 | 脉冲展宽 + 两级同步 | 快时钟域到慢时钟域 |
| 多比特数据 | 异步 FIFO | 数据总线 |
| 多比特控制 | 握手协议 | 请求/响应信号 |

**输出：** 跨时钟域信号列表

| 信号名 | 源时钟域 | 目标时钟域 | 同步方法 | 负责模块 |
|--------|----------|------------|----------|----------|
| cpu_req | clk_sys | clk_ddr | 异步FIFO | DDR控制器 |
| ddr_ack | clk_ddr | clk_sys | 异步FIFO | DDR控制器 |
| pcie_irq | clk_pcie | clk_sys | 两级同步 | PCIe控制器 |

### 4.4 定义时钟门控策略

**做什么：** 确定哪些模块需要时钟门控。

**怎么做：**
1. 列出所有模块
2. 标注哪些模块可以关闭时钟
3. 确定时钟门控条件
4. 估算功耗节省

**输出：** 时钟门控规划表

| 模块 | 是否门控 | 门控条件 | 预计功耗节省 |
|------|----------|----------|--------------|
| CPU | 否 | - | - |
| DDR 控制器 | 是 | 空闲 100ns | 20% |
| PCIe 控制器 | 是 | 无连接 | 30% |
| UART | 是 | 空闲 | 5% |

**检查清单：**
- [ ] 所有需要的时钟频率都已列出
- [ ] 时钟域数量合理（通常 < 10 个）
- [ ] 跨时钟域信号都已识别
- [ ] 跨时钟域同步方法已确定
- [ ] 时钟门控策略已规划
- [ ] 没有异步逻辑混入同步时钟域

---

## 步骤 5：复位域规划

时钟域规划完成后，进行复位域规划。

### 5.1 选择复位策略

**做什么：** 确定整个项目使用同步复位还是异步复位。

**同步复位 vs 异步复位：**

| 特性 | 同步复位 | 异步复位 |
|------|----------|----------|
| 复位时机 | 需要时钟 | 不需要时钟 |
| STA 影响 | 友好 | 需要特殊处理 |
| 面积 | 略大 | 略小 |
| 毛刺 | 无 | 复位释放可能有毛刺 |

**项目级规则：**
> ⚠️ 整个项目保持一致！要么全同步复位，要么全异步复位，不要混合。

**选择建议：**
- 大多数模块有时钟 → 同步复位
- 有模块需要无时钟复位 → 异步复位 + 同步释放

### 5.2 划分复位域

**做什么：** 确定哪些模块需要独立复位。

**怎么做：**
1. 列出所有复位源
2. 确定哪些模块需要同时复位
3. 确定哪些模块可以独立复位
4. 安全相关模块通常有独立复位域

**输出：** 复位域规划图

```
复位域规划：

全局复位 (rst_n)
    │
    ├── 复位域 0: 核心逻辑
    │   ├── CPU
    │   ├── 缓存
    │   └── 总线互联
    │
    ├── 复位域 1: 外设
    │   ├── UART
    │   ├── SPI
    │   └── GPIO
    │
    └── 复位域 2: 高速接口（独立复位）
        ├── DDR 控制器
        └── PCIe 控制器

安全复位 (wdt_rst)
    │
    └── 复位域 3: 安全模块
        ├── 看门狗
        └── 错误监控
```

### 5.3 设计复位序列

**做什么：** 确定复位释放顺序。

**怎么做：**
1. 确定哪个复位域先释放
2. 确定各复位域之间的等待时间
3. 确保时钟稳定后再释放复位

**复位序列示例：**

```
上电序列：
1. 上电复位 (por_n) 有效
2. 等待电源稳定
3. 等待时钟稳定
4. 释放核心复位域
5. 等待 100us
6. 释放外设备位域
7. 等待 100us
8. 释放高速接口复位域
9. 开始正常工作
```

### 5.4 异步复位同步释放

如果使用异步复位，必须同步释放：

```systemverilog
// 异步复位，同步释放电路
module reset_sync (
    input  wire i_clk,        // 时钟
    input  wire i_async_rst_n,// 异步复位输入
    output logic o_sync_rst_n // 同步后的复位输出
);
    (* async_reg = "true" *) logic r_rst1;
    (* async_reg = "true" *) logic r_rst2;

    always_ff @(posedge i_clk or negedge i_async_rst_n) begin
        if (!i_async_rst_n) begin
            r_rst1 <= 1'b0;
            r_rst2 <= 1'b0;
        end else begin
            r_rst1 <= 1'b1;
            r_rst2 <= r_rst1;
        end
    end

    assign o_sync_rst_n = r_rst2;
endmodule
```

**检查清单：**
- [ ] 复位策略已确定（同步/异步）
- [ ] 复位源已列出
- [ ] 复位域已划分
- [ ] 复位序列已定义
- [ ] 异步复位同步释放电路已设计（如果使用异步复位）
- [ ] 整个项目复位风格一致

---

## 步骤 6：存储器规划

### 6.1 计算存储器容量需求

**做什么：** 为每个模块估算存储器容量。

**怎么做：**
1. 列出每个模块需要的存储器
2. 计算数据宽度
3. 计算深度
4. 确定是否需要 ECC

**存储器容量计算公式：**

```
FIFO 深度 = 速率差 × 突发长度 × 安全系数(1.5~2)

缓存容量 = 带宽要求 × 延迟容忍时间

缓冲容量 = 最大突发长度 × 数据宽度
```

**输出：** 存储器需求表

| 模块 | 存储器名称 | 宽度 | 深度 | 类型 | ECC |
|------|------------|------|------|------|-----|
| CPU | 指令缓存 | 256-bit | 512 | SRAM | 否 |
| CPU | 数据缓存 | 256-bit | 512 | SRAM | 否 |
| DDR控制器 | 写缓冲 | 64-bit | 32 | FIFO | 否 |
| PCIe | 收发缓冲 | 128-bit | 64 | FIFO | 是 |

### 6.2 选择存储器类型

**做什么：** 为每个存储器选择合适的类型。

**存储器类型选择：**

| 类型 | 特点 | 适用场景 |
|------|------|----------|
| 单端口 SRAM | 面积最小 | 只读或只写 |
| 伪双端口 SRAM | 可同时读写 | 大多数场景 |
| 真双端口 SRAM | 可同时读写同地址 | 面积大，特殊需求 |
| 单端口 ROM | 只读 | 启动代码、常数表 |
| 寄存器堆 | 最灵活，容量小 | 小容量存储 |

### 6.3 规划存储器位置

**做什么：** 确定存储器在芯片中的物理位置。

**怎么做：**
1. 存储器靠近使用它的模块
2. 大容量存储器考虑 IO 位置
3. 考虑布线拥塞

**检查清单：**
- [ ] 所有模块存储器需求已统计
- [ ] 存储器类型已选择
- [ ] 是否需要 ECC 已确定
- [ ] 总存储器面积已估算

---

## 步骤 7：电源规划

### 7.1 划分电源域

**做什么：** 确定哪些模块可以独立关断电源。

**怎么做：**
1. 列出所有模块
2. 标注哪些模块可以关断
3. 标注哪些模块必须始终上电
4. 安全相关模块通常始终上电

**电源域划分原则：**

| 原则 | 说明 |
|------|------|
| 始终上电 | 安全模块、电源管理、唤醒逻辑 |
| 可关断 | 大功耗模块、不常用模块 |
| 独立电压 | 不同性能需求的模块 |

### 7.2 设计电源网络

**做什么：** 规划电源分布网络。

**怎么做：**
1. 确定电源环宽度
2. 确定电源 strap 间距
3. 确保 IR 降满足要求

**电源网络检查：**
- IR 降 < 5% Vdd
- 电迁移满足要求
- 电源密度合理

### 7.3 插入电平转换器和隔离单元

**做什么：** 在不同电压域和可关断域之间插入特殊单元。

| 场景 | 需要的单元 |
|------|------------|
| 高电压域 → 低电压域 | 电平转换器 |
| 低电压域 → 高电压域 | 电平转换器 |
| 可关断域 → 始终上电域 | 隔离单元 |
| 始终上电域 → 可关断域 | 保持寄存器 |

**检查清单：**
- [ ] 电源域已划分
- [ ] 电源网络已规划
- [ ] 电平转换器位置已确定
- [ ] 隔离单元位置已确定
- [ ] IR 降预估满足要求

---

## 步骤 8：DFT 规划

### 8.1 扫描链规划

**做什么：** 确定扫描链数量和长度。

**怎么做：**
1. 确定扫描链数量（通常 2-8 条）
2. 确定每条扫描链长度（尽量平衡）
3. 确定扫描输入/输出引脚

### 8.2 存储器 BIST 规划

**做什么：** 为每个存储器规划 BIST。

**怎么做：**
1. 列出所有存储器
2. 确定是否需要 BIST（所有可写存储器都需要）
3. 确定 BIST 控制器数量

### 8.3 JTAG 规划

**做什么：** 规划 JTAG TAP 控制器。

**怎么做：**
1. 确定 JTAG 引脚（TCK, TMS, TDI, TDO, TRST）
2. 确定指令寄存器长度
3. 确定支持的指令（EXTEST, SAMPLE, BYPASS 等）

**检查清单：**
- [ ] 扫描链规划已完成
- [ ] 存储器 BIST 规划已完成
- [ ] JTAG TAP 规划已完成
- [ ] DFT 覆盖率目标已确定（> 98%）

---

## 步骤 9：架构评估和决策

### 9.1 制定候选方案

**做什么：** 提出多个架构候选方案。

**怎么做：**
1. 根据需求提出 2-3 个候选方案
2. 每个方案有不同权衡
3. 记录每个方案的优缺点

### 9.2 评估候选方案

**做什么：** 对每个候选方案进行评估。

**评估维度：**

| 维度 | 评估方法 | 权重 |
|------|----------|------|
| 可验证性 | 是否容易搭建验证环境 | 15% |
| 可实现性 | 是否满足 PPA 预算 | 25% |
| 可调试性 | 是否有足够观测点 | 10% |
| 可扩展性 | 是否方便未来扩展 | 10% |
| 功耗 | 是否满足功耗预算 | 15% |
| 面积 | 是否满足面积预算 | 15% |
| 时序 | 能否达到目标频率 | 10% |

### 9.3 选择最终方案

**做什么：** 根据评估结果选择最终方案。

**怎么做：**
1. 对每个方案打分
2. 加权计算总分
3. 选择总分最高的方案
4. 记录选择理由

**输出：** 架构决策记录

```markdown
## 架构决策记录

### 决策 ID: ARCH-001
### 决策内容: 选择方案 A 作为最终架构

### 候选方案:
- 方案 A: 集中式总线架构
- 方案 B: 分布式网状架构
- 方案 C: 混合架构

### 评估结果:
| 维度 | 方案A | 方案B | 方案C |
|------|-------|-------|-------|
| 可验证性 | 4 | 3 | 3 |
| 可实现性 | 5 | 3 | 4 |
| 可调试性 | 4 | 4 | 3 |
| 可扩展性 | 3 | 5 | 4 |
| 功耗 | 4 | 3 | 3 |
| 面积 | 5 | 3 | 4 |
| 时序 | 4 | 4 | 4 |
| **总分** | **4.2** | **3.5** | **3.6** |

### 选择理由:
方案 A 在可实现性和面积方面最优，虽然可扩展性略逊于方案 B，但满足当前需求且风险最低。

### 决策人: XXX
### 决策日期: 2024-01-15
```

---

## 步骤 10：输出架构文档

架构设计完成后，必须输出完整的架构文档。

### 10.1 架构设计文档

**内容：**
- 整体架构描述
- 设计决策和理由
- 模块列表和功能
- 接口描述
- 时钟复位规划
- 存储器规划
- 电源规划
- DFT 规划

### 10.2 模块接口规格

**内容（每个模块）：**
- 模块功能描述
- 输入信号列表
- 输出信号列表
- 时序要求
- 面积预算

### 10.3 存储器映射表

**内容：**
- 地址空间分配
- 每个寄存器地址
- 每个寄存器位定义

### 10.4 时钟复位规划图

**内容：**
- 时钟域列表
- 时钟域关系图
- 跨时钟域信号列表
- 复位域列表
- 复位序列

### 10.5 顶层框图

**内容：**
- 模块框图
- 模块间连接
- 外部接口

---

## 最终检查清单

架构设计交付前必须完成：

- [ ] 所有强制性需求都已满足
- [ ] 模块划分清晰，单一职责
- [ ] 每个模块功能描述已编写
- [ ] 所有接口定义清楚，协议明确
- [ ] 时钟域划分正确，跨时钟域处理明确
- [ ] 复位策略一致，复位域划分合理
- [ ] 存储器容量满足需求
- [ ] 电源规划满足低功耗需求
- [ ] DFT 规划满足覆盖率要求
- [ ] 面积时序功耗预算都满足
- [ ] 架构决策已记录
- [ ] 所有文档完整

---

## 反模式（要避免）

❌ **过度设计**：现在就添加十年后才需要的功能
❌ **设计不足**：没有考虑未来扩展，一年后就要重构
❌ **模糊接口**：接口定义不清晰，集成时才发现问题
❌ **忽略验证**：架构不容易验证，后期验证找不到 bug
❌ **忽略后端**：架构布局完全不考虑后端实现
❌ **不记录决策**：做了决策但不记录理由，后面忘记为什么这么做

---

## 代理协作

- 架构定义完成后，使用 `rtl-designer` 代理实现 RTL
- 使用 `verification-engineer` 代理开发验证平台
- 如果有功能安全需求，使用 `functional-safety-engineer` 代理进行安全分析

