| name | architecture-design |
| description | 芯片架构设计技能 - 从需求定义到模块划分,完整指导芯片架构开发 |
| description.zh | 芯片架构设计技能 - 从需求定义到模块划分,完整指导芯片架构开发 |
| origin | ICER |
| categories | architecture |
芯片架构设计技能
当用户需要进行芯片架构设计时,启用此技能。此技能提供芯片架构设计的完整指导,从需求定义到模块划分,遵循工业界最佳实践。
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 收集功能需求
做什么: 从产品经理/系统工程师获取完整功能需求列表。
怎么做:
- 召开需求评审会议,邀请产品、系统、验证、后端代表
- 逐条确认每个功能点的输入、输出、边界条件
- 记录每个功能的优先级: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 收集性能需求
做什么: 明确性能指标,这些直接影响架构决策。
怎么做:
- 确认目标工作频率
- 确认峰值吞吐量
- 确认平均延迟和最坏延迟要求
- 确认带宽瓶颈在哪里
输出: 性能需求表格
| 指标 | 数值 | 来源 |
|---|
| 目标频率 | 500MHz | 系统需求 |
| PCIe 峰值带宽 | 64 Gbps | 产品需求 |
| DDR 延迟 | < 100ns (平均) | 系统需求 |
| 功耗 | < 5W | 产品需求 |
1.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 收集接口需求
做什么: 明确所有片外接口和片上总线接口。
怎么做:
- 列出所有片外接口(PCIe、DDR、USB、以太网等)
- 列出片上总线接口(AXI、AHB、APB)
- 确认每个接口的协议版本和参数
输出: 接口需求列表
| 接口名称 | 类型 | 协议 | 宽度 | 频率 |
|---|
| 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 需求。
怎么做:
- 确认功能安全等级(ASIL A/B/C/D)
- 确认 DFT 覆盖率要求
- 确认测试时间限制
输出: 安全和测试需求
| 需求类型 | 要求 | 来源 |
|---|
| 功能安全 | ASIL-B | ISO 26262 |
| DFT 覆盖率 | > 98% | 公司标准 |
| 测试时间 | < 1s | 量产需求 |
1.6 IP 需求识别
做什么: 识别需要外购或复用的 IP 模块。
怎么做:
- 列出所有功能模块
- 标注哪些可以购买 IP
- 标注哪些可以复用已有设计
- 标注哪些需要自研
输出: IP 需求列表
| 模块 | 来源选项 | 推荐来源 | 理由 |
|---|
| CPU | 外购/自研 | 外购 ARM/RISC-V | 开发周期短 |
| DDR 控制器 | 外购 | Synopsys/Cadence | 协议复杂 |
| PCIe 控制器 | 外购 | Synopsys | 协议复杂 |
| UART | 复用/自研 | 复用 | 已有成熟设计 |
| 特殊加速器 | 自研 | 自研 | 无合适 IP |
1.7 需求评审和签字
做什么: 需求文档评审,所有相关方签字确认。
怎么做:
- 发送需求文档给所有相关方评审
- 召开需求评审会议
- 记录所有问题和修改意见
- 修改后重新评审
- 所有相关方签字确认
检查清单:
步骤 2:顶层接口定义
需求明确后,首先定义顶层接口。
2.1 定义片外接口
做什么: 确定芯片与外部世界的所有接口。
怎么做:
- 根据需求列表,列出所有片外接口
- 确定每个接口的物理参数(引脚数、电平、协议)
- 确定电源和地引脚数量
- 初步估计总引脚数
输出: 顶层接口列表
芯片顶层接口:
├── 电源接口
│ ├── 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 定义片上总线接口
做什么: 确定内部模块之间的通信协议。
怎么做:
- 选择总线协议(AXI4/AXI4-Lite/AXI4-Stream/AHB/APB)
- 确定数据宽度和地址宽度
- 确定主从关系
- 画出总线拓扑图
总线协议选择参考:
| 协议 | 适用场景 | 优点 | 缺点 |
|---|
| AXI4 | 高带宽存储器映射 | 乱序、QoS、区域保护 | 协议复杂、面积大 |
| AXI4-Lite | 寄存器配置 | 简单、轻量 | 低带宽 |
| AXI4-Stream | 数据流 | 适合视频/网络 | 不支持随机访问 |
| AHB | 中带宽系统 | 简单 | 不支持乱序 |
| APB | 低带宽外设 | 非常简单 | 低带宽 |
输出: 总线拓扑图
┌─────────────┐
│ CPU │
└──────┬──────┘
│ AXI4 主
┌──────┴──────┐
│ AXI 互联 │
└──────┬──────┘
┌───────────────┼───────────────┐
│ │ │
┌─────┴─────┐ ┌─────┴─────┐ ┌─────┴─────┐
│ DDR 控制器 │ │ PCIe 控制器│ │ 外设桥 │
│ (AXI 从) │ │ (AXI 从) │ │ (AXI 从) │
└───────────┘ └───────────┘ └─────┬─────┘
│ APB
┌──────┴──────┐
│ UART/SPI... │
└─────────────┘
2.3 定义时钟和复位接口
做什么: 确定时钟源和复位策略。
怎么做:
- 列出所有需要的时钟频率
- 确定时钟源(外部晶振、内部PLL、外部输入)
- 确定复位源(外部复位、上电复位、看门狗复位)
- 确定复位策略(同步复位 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 定义电源接口
做什么: 确定电源域划分和电压。
怎么做:
- 列出所有电源域
- 确定每个电源域的电压
- 确定哪些电源域可以关断
- 确定电平转换器和隔离单元位置
输出: 电源域规划图
电源域规划:
├── VDD_ALWAYS (1.0V, 始终上电)
│ ├── CPU
│ ├── 中断控制器
│ └── 电源管理模块
├── VDD_CORE (1.0V, 可关断)
│ ├── DDR 控制器
│ ├── PCIe 控制器
│ └── 其他功能模块
└── VDD_IO (3.3V, 始终上电)
└── 所有 IO
检查清单:
步骤 3:模块划分
顶层接口定义完成后,进行模块划分。
3.1 自上而下分层分解
做什么: 把系统分解成子系统,子系统分解成模块,模块分解成单元。
怎么做:
- 从顶层开始,列出所有一级子系统
- 每个子系统再分解成二级模块
- 每个模块再分解成三级单元
- 直到每个单元规模合理(< 50k 门)
分解原则:
| 原则 | 说明 | 检查方法 |
|---|
| 单一职责 | 每个模块只做一件事 | 能用一句话描述模块功能 |
| 松耦合 | 模块间依赖最少 | 接口数量少 |
| 高内聚 | 模块内部紧密关联 | 修改只影响一个模块 |
| 大小适中 | 每个模块 < 100k 门 | 门级估算 |
输出: 模块层次树
SoC 顶层
├── CPU 子系统
│ ├── CPU 核心 (RISC-V)
│ ├── 指令缓存
│ ├── 数据缓存
│ └── 中断控制器
├── 存储子系统
│ ├── DDR 控制器
│ ├── SRAM 控制器
│ └── DMA 引擎
├── 外设子系统
│ ├── UART 控制器
│ ├── SPI 控制器
│ ├── I2C 控制器
│ └── GPIO 控制器
├── 高速接口子系统
│ ├── PCIe 控制器
│ │ ├── PCIe PHY
│ │ ├── PCIe MAC
│ │ └── NVMe 协议层
│ └── 以太网控制器
└── 系统控制子系统
├── 时钟管理
├── 复位管理
├── 电源管理
└── JTAG TAP
3.2 定义每个模块的功能
做什么: 为每个模块编写功能描述。
怎么做:
- 用一句话描述模块的核心功能
- 列出模块的主要特性
- 列出模块的输入和输出
输出: 模块功能描述模板
## 模块名称: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 定义模块间接口
做什么: 定义模块之间的通信接口。
怎么做:
- 确定模块间的数据流向
- 选择合适的接口协议
- 定义接口信号列表
- 定义接口时序
接口设计原则:
| 原则 | 说明 |
|---|
| 使用标准协议 | 优先使用 AXI/APB/AHB 等标准协议 |
| 握手机制 | 必须有 valid/ready 握手 |
| 错误处理 | 定义错误响应机制 |
| 文档化 | 每个接口都有详细文档 |
✅ 好的接口设计:ready/valid 双向握手
// 发送方接口
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 定义模块面积预算
做什么: 把总面积预算分配到每个模块。
怎么做:
- 根据功能复杂度估算每个模块面积
- 查找类似模块的历史数据作为参考
- 留出 10-15% 的余量
输出: 面积预算表
| 模块 | 面积预算 (mm²) | 估算依据 | 风险 |
|---|
| CPU 核心 | 0.8 | 参考设计 | 低 |
| DDR 控制器 | 0.5 | 类似项目 | 低 |
| PCIe 控制器 | 0.4 | 类似项目 | 低 |
| ... | ... | ... | ... |
| 总计 | 4.5 | | |
| 余量 | 0.5 | 10% | |
| 总计+余量 | 5.0 | | |
检查清单:
步骤 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 选型决策记录:
## 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 选型检查清单:
步骤 4:时钟域规划
模块划分完成后,进行时钟域规划。
4.1 确定时钟域数量
做什么: 确定需要多少个时钟域。
怎么做:
- 列出所有需要的时钟频率
- 相同频率的模块可以放在同一时钟域
- 不同来源的时钟必须放在不同时钟域
- 考虑时钟门控需求
时钟域划分原则:
| 原则 | 说明 |
|---|
| 频率不同 | 不同频率必须不同时钟域 |
| 来源不同 | 不同来源时钟必须不同时钟域 |
| 关断需求 | 需要独立关断的模块单独时钟域 |
| 数量适中 | 时钟域不要太多,增加复杂度 |
4.2 定义时钟域关系
做什么: 确定时钟域之间的同步/异步关系。
怎么做:
- 画出所有时钟域
- 标注每个时钟域的频率
- 标注时钟域之间的数据流向
- 确定是同步还是异步
输出: 时钟域关系图
时钟域规划:
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 定义时钟门控策略
做什么: 确定哪些模块需要时钟门控。
怎么做:
- 列出所有模块
- 标注哪些模块可以关闭时钟
- 确定时钟门控条件
- 估算功耗节省
输出: 时钟门控规划表
| 模块 | 是否门控 | 门控条件 | 预计功耗节省 |
|---|
| CPU | 否 | - | - |
| DDR 控制器 | 是 | 空闲 100ns | 20% |
| PCIe 控制器 | 是 | 无连接 | 30% |
| UART | 是 | 空闲 | 5% |
检查清单:
步骤 5:复位域规划
时钟域规划完成后,进行复位域规划。
5.1 选择复位策略
做什么: 确定整个项目使用同步复位还是异步复位。
同步复位 vs 异步复位:
| 特性 | 同步复位 | 异步复位 |
|---|
| 复位时机 | 需要时钟 | 不需要时钟 |
| STA 影响 | 友好 | 需要特殊处理 |
| 面积 | 略大 | 略小 |
| 毛刺 | 无 | 复位释放可能有毛刺 |
项目级规则:
⚠️ 整个项目保持一致!要么全同步复位,要么全异步复位,不要混合。
选择建议:
- 大多数模块有时钟 → 同步复位
- 有模块需要无时钟复位 → 异步复位 + 同步释放
5.2 划分复位域
做什么: 确定哪些模块需要独立复位。
怎么做:
- 列出所有复位源
- 确定哪些模块需要同时复位
- 确定哪些模块可以独立复位
- 安全相关模块通常有独立复位域
输出: 复位域规划图
复位域规划:
全局复位 (rst_n)
│
├── 复位域 0: 核心逻辑
│ ├── CPU
│ ├── 缓存
│ └── 总线互联
│
├── 复位域 1: 外设
│ ├── UART
│ ├── SPI
│ └── GPIO
│
└── 复位域 2: 高速接口(独立复位)
├── DDR 控制器
└── PCIe 控制器
安全复位 (wdt_rst)
│
└── 复位域 3: 安全模块
├── 看门狗
└── 错误监控
5.3 设计复位序列
做什么: 确定复位释放顺序。
怎么做:
- 确定哪个复位域先释放
- 确定各复位域之间的等待时间
- 确保时钟稳定后再释放复位
复位序列示例:
上电序列:
1. 上电复位 (por_n) 有效
2. 等待电源稳定
3. 等待时钟稳定
4. 释放核心复位域
5. 等待 100us
6. 释放外设备位域
7. 等待 100us
8. 释放高速接口复位域
9. 开始正常工作
5.4 异步复位同步释放
如果使用异步复位,必须同步释放:
// 异步复位,同步释放电路
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 计算存储器容量需求
做什么: 为每个模块估算存储器容量。
怎么做:
- 列出每个模块需要的存储器
- 计算数据宽度
- 计算深度
- 确定是否需要 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 规划存储器位置
做什么: 确定存储器在芯片中的物理位置。
怎么做:
- 存储器靠近使用它的模块
- 大容量存储器考虑 IO 位置
- 考虑布线拥塞
检查清单:
步骤 7:电源规划
7.1 划分电源域
做什么: 确定哪些模块可以独立关断电源。
怎么做:
- 列出所有模块
- 标注哪些模块可以关断
- 标注哪些模块必须始终上电
- 安全相关模块通常始终上电
电源域划分原则:
| 原则 | 说明 |
|---|
| 始终上电 | 安全模块、电源管理、唤醒逻辑 |
| 可关断 | 大功耗模块、不常用模块 |
| 独立电压 | 不同性能需求的模块 |
7.2 设计电源网络
做什么: 规划电源分布网络。
怎么做:
- 确定电源环宽度
- 确定电源 strap 间距
- 确保 IR 降满足要求
电源网络检查:
- IR 降 < 5% Vdd
- 电迁移满足要求
- 电源密度合理
7.3 插入电平转换器和隔离单元
做什么: 在不同电压域和可关断域之间插入特殊单元。
| 场景 | 需要的单元 |
|---|
| 高电压域 → 低电压域 | 电平转换器 |
| 低电压域 → 高电压域 | 电平转换器 |
| 可关断域 → 始终上电域 | 隔离单元 |
| 始终上电域 → 可关断域 | 保持寄存器 |
检查清单:
步骤 8:DFT 规划
8.1 扫描链规划
做什么: 确定扫描链数量和长度。
怎么做:
- 确定扫描链数量(通常 2-8 条)
- 确定每条扫描链长度(尽量平衡)
- 确定扫描输入/输出引脚
8.2 存储器 BIST 规划
做什么: 为每个存储器规划 BIST。
怎么做:
- 列出所有存储器
- 确定是否需要 BIST(所有可写存储器都需要)
- 确定 BIST 控制器数量
8.3 JTAG 规划
做什么: 规划 JTAG TAP 控制器。
怎么做:
- 确定 JTAG 引脚(TCK, TMS, TDI, TDO, TRST)
- 确定指令寄存器长度
- 确定支持的指令(EXTEST, SAMPLE, BYPASS 等)
检查清单:
步骤 9:架构评估和决策
9.1 制定候选方案
做什么: 提出多个架构候选方案。
怎么做:
- 根据需求提出 2-3 个候选方案
- 每个方案有不同权衡
- 记录每个方案的优缺点
9.2 评估候选方案
做什么: 对每个候选方案进行评估。
评估维度:
| 维度 | 评估方法 | 权重 |
|---|
| 可验证性 | 是否容易搭建验证环境 | 15% |
| 可实现性 | 是否满足 PPA 预算 | 25% |
| 可调试性 | 是否有足够观测点 | 10% |
| 可扩展性 | 是否方便未来扩展 | 10% |
| 功耗 | 是否满足功耗预算 | 15% |
| 面积 | 是否满足面积预算 | 15% |
| 时序 | 能否达到目标频率 | 10% |
9.3 选择最终方案
做什么: 根据评估结果选择最终方案。
怎么做:
- 对每个方案打分
- 加权计算总分
- 选择总分最高的方案
- 记录选择理由
输出: 架构决策记录
## 架构决策记录
### 决策 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 顶层框图
内容:
最终检查清单
架构设计交付前必须完成:
反模式(要避免)
❌ 过度设计:现在就添加十年后才需要的功能
❌ 设计不足:没有考虑未来扩展,一年后就要重构
❌ 模糊接口:接口定义不清晰,集成时才发现问题
❌ 忽略验证:架构不容易验证,后期验证找不到 bug
❌ 忽略后端:架构布局完全不考虑后端实现
❌ 不记录决策:做了决策但不记录理由,后面忘记为什么这么做
代理协作
- 架构定义完成后,使用
rtl-designer 代理实现 RTL
- 使用
verification-engineer 代理开发验证平台
- 如果有功能安全需求,使用
functional-safety-engineer 代理进行安全分析