SoC 互连实例:master/slave 地址映射、地址窗与 outstanding/QoS 端到端实战
更新时间:2026-09-28。本文是「芯片验证 · 进阶层」接口主题簇的枢纽文。前置阅读 AXI4 完整协议 建立通道概念,AXI4 事务生命周期 讲单笔事务怎么推进,AXI4 outstanding 与 ID 保序、AXI4 QoS 服务质量 讲在途与优先级,AXI Crossbar 与 Interconnect 讲互连结构本身。前面这些篇都在讲「一个协议点怎么工作」,本篇换视角:把这些点拼起来,走完一次真实 SoC 互连从规划到验收的全过程。
本文要回答的问题
- 一颗 SoC 上 master/slave 清单怎么列?地址映射表(memory map)的每一列在工程上意味着什么?
- 地址窗(address window)怎么切?重叠、空洞、别名怎么处理,默认从机是干什么的?
- 每个主机的 outstanding 深度和 ID 宽度怎么定?互连内部的表项总量够不够?
- QoS 信号从主机到从机端到端怎么流动?仲裁权重和 QoS 是什么关系?
- 互连设计完成后,用什么清单验收:带宽预算、延迟预算、死锁检查分别怎么做?
一、案例设定:一颗典型 MCU 级 SoC
为了把抽象规则落到具体数字上,本篇用一颗虚构但足够典型的 MCU 级 SoC 作为贯穿案例:一个 32 位 RISC 内核(取指与数据各一条 AXI4 主机口)、一个 DMA 控制器(一条 AXI4 主机口)、一个 LCD 显示控制器(一条 AXI4 主机口,周期性扫帧)、外加一个调试口(JTAG-DTM 桥出的一条 AXI4-Lite 主机口)。从机侧有:Boot ROM、紧耦合 SRAM、外部 DDR 控制器、Flash 控制器、APB 外设桥(下挂 UART/SPI/GPIO/定时器等低速外设)。
先列清单,这是所有后续设计的输入:
| 主机 | 接口 | 访问特征 | 峰值带宽需求 |
|---|---|---|---|
| CPU I-Fetch | AXI4 | 只读 burst,ID 用 1-2 个,长延迟可容忍(有 cache) | 0.4 GB/s |
| CPU LSU | AXI4 | 读写混合,outstanding 4-8 | 0.8 GB/s |
| DMA | AXI4 | 大块搬运,outstanding 深,QoS 敏感于带宽而非延迟 | 1.6 GB/s |
| LCDC | AXI4 | 只读固定周期扫帧,延迟硬约束(欠载就花屏) | 0.5 GB/s |
| Debug | AXI4-Lite | 单笔、低频、无任何性能要求 | 可忽略 |
| 从机 | 接口 | 容量 | 典型延迟 | 可用带宽 |
|---|---|---|---|---|
| Boot ROM | AXI4 | 64 KB | 4 拍 | 很低 |
| SRAM | AXI4 | 256 KB | 2 拍 | 3.2 GB/s |
| DDR 控制器 | AXI4 | 512 MB | 40-120 拍 | 2.0 GB/s |
| Flash 控制器 | AXI4 | 16 MB | 20 拍 | 0.4 GB/s |
| APB 桥 | AXI4→APB | 4 KB 窗 | 10-30 拍 | 很低 |
注意这张表的两个关键输入:每个主机「要多少带宽、怕不怕延迟」,每个从机「给多少带宽、延迟多大」。互连设计本质上就是在这两组数字之间做匹配,后面的 outstanding 与 QoS 都是匹配工具。
二、地址映射:memory map 是一张合同
地址映射表是硬件和软件之间最硬的一张合同——一旦流片,软件按这个表写驱动,错了就只能改版。设计时的动作只有三步:给每个从机一段对齐的地址窗、决定空洞的行为、处理重映射。
对照上面的映射图,几条工程纪律值得写进 checklist:
- 窗口按 2 的幂对齐,容量也取 2 的幂。 译码逻辑就是高位比较:窗口是 2 的幂时,译码只需比较 log2(窗数) 个高位比特,组合逻辑最短。把 SRAM 放在非对齐地址(比如 0x1000_5000)会让译码器多一级逻辑,还给软件埋坑。
- 空洞必须有确定行为。 0x0001_0000 到 0x0FFF_FFFF 之间没有任何从机,CPU 一次野指针读落进空洞,谁来响应?答案是默认从机(default slave):互连内部一个兜底的译码目标,对任何不命中窗口的地址返回 DECERR(写事务则吞掉数据后回 DECERR)。没有默认从机,野访问会在互连里永远等不到响应,直接把发起方的 outstanding 槽位全部吃掉,整机挂死。
- 别名(alias)要显式声明。 有些设计把同一块 SRAM 映在两个地址(比如 0 地址附近给启动代码用、高地址给正常跑用)。别名本身合法,但要在映射表里写清楚,并让验证环境知道两段地址是同一物理存储,否则 scoreboard 会报数据不一致。
- 重映射(remap)要有控制寄存器。 上电时 0 地址是 Boot ROM,启动完成后软件常把 0 地址重映到 SRAM 以获得可写的异常向量表。这个 remap 位本身挂在 APB 桥上,就是一个典型的「地址映射受寄存器控制」结构,验证时必须覆盖 remap 翻转前后在途事务的行为(协议不禁止 remap 时在途事务走旧映射,但要定义清楚并在文档里写明)。
地址映射表确定后,互连的译码器就是逐主机一份比较器阵列。每个主机口看到的映射可以不同——比如 Debug 口通常只被允许访问 APB 外设和 SRAM,看不到 DDR 的后半段——这就是按主机过滤的地址窗,也是安全隔离的第一道关卡。
三、从清单到拓扑:谁先挂进 crossbar
有了主机、从机、映射三样输入,下一步是定拓扑:全连接 crossbar、部分连接、还是分层。规则很朴素:只为真实存在的访问路径付费。crossbar 的成本大致随主机数×从机数增长,每一条不用的通路都是白花的面积和时序压力。
上图有两个刻意裁剪:I-Fetch 不连 APB 桥(取指永远不会落在寄存器空间,这条通路剪掉),Debug 口只连 SRAM 和 APB(调试器不应直接摸 DDR 全域)。裁剪带来的好处不只是省面积:译码空间变小后每个主机口的比较器更少,关键路径更短;出错面也变小——CPU 就算跑飞,I-Fetch 口也物理上够不到外设寄存器。
拓扑里还有一层判断:DDR 是不是该走独立端口。本例中 DDR 带宽占全系统一半以上,且 LCDC 对 DDR 的延迟有硬约束,常见做法是让 LCDC 直连 DDR 控制器的第二个端口(很多 DDR 控制器原生支持多端口),绕开 crossbar。这就引出下一节的核心问题:每条通路上的在途能力(outstanding)要配多深,才能让各主机把从机带宽真正吃满。
四、outstanding 与 ID:把延迟变成流水
一笔事务从 AR 握手到 RLAST 回来,中间的拍数是纯等待。单个主机只有填足够多的在途事务,才能把这段延迟「流水化」成带宽。这就是 outstanding 配置的全部意义,计算用利特尔法则(Little's Law):
所需 outstanding ≥ 目标带宽 × 往返延迟用具体数字走一遍。假设总线 100 MHz、数据宽 128 bit,单拍带宽 1.6 GB/s。LCDC 要 0.5 GB/s 读 DDR,DDR 往返延迟按最坏 120 拍算:
outstanding ≥ (0.5 GB/s) × (120 拍 / 100 MHz) = 0.6 GB... 换到事务粒度:
每拍需求 = 0.5 / 1.6 ≈ 0.31 beat/拍
在途 beat 数 ≥ 0.31 × 120 ≈ 38 beat
一笔 16-beat 的 burst 提供 16 个在途 beat,故需 ≥ 3 笔 outstanding 读再乘 1.5-2 倍的安全裕量(DDR 刷新、bank 冲突会拉长尾部延迟),LCDC 读通道 outstanding 配 6 笔才稳。同理 DMA 要 1.6 GB/s 就是满载全带宽,在途 beat 需求约 120 个,即 8 笔 16-beat burst 起步。这类计算做完后汇总成一张配置表,它既是 RTL 参数表,也是验证的覆盖率目标表:
| 主机 | 读 outstanding | 写 outstanding | ID 宽度 | 依据 |
|---|---|---|---|---|
| CPU I-Fetch | 4 | 0 | 2 bit | cache line refill,2 个 ID 区分可预取/不可预取 |
| CPU LSU | 8 | 8 | 4 bit | 编译器生成的乱序访存 |
| DMA | 8 | 8 | 2 bit | 大块搬运,按通道分 ID |
| LCDC | 6 | 0 | 1 bit | 延迟硬约束,算出来再加裕量 |
| Debug | 1 | 1 | 1 bit | AXI4-Lite 单笔 |
ID 宽度的选择逻辑也在这张表里:ID 的数量决定了能并行管理多少个独立的保序域。多 ID 允许从机乱序返回(详见 AXI4 outstanding 与 ID 保序),但互连内部为每个(主机口 × ID)组合维护重排缓冲,ID 越宽面积越大。LCDC 是连续扫帧,完全不需要乱序返回,1 bit ID 甚至 0 bit 都够,省下来的重排资源让给 CPU。
互连侧还有一笔总账:crossbar 内部的事务表项总量必须 ≥ 各主机 outstanding 之和沿各通路的分布,否则会出现「主机还有授信,互连先满了」的人为瓶颈。同时,每条从机口的在途上限由从机自己的接收能力决定——SRAM 控制器只收 4 笔在途,那么即使 5 个主机合起来想往 SRAM 压 20 笔,互连也必须在 SRAM 口反压住,多出的部分占用互连表项等待。这笔账要在设计文档里算清楚,验证时用定向用例把每条通路的表项同时打满,确认反压行为符合预期且不丢不错。
五、QoS 与仲裁:让 LCDC 永不欠载
带宽是平均概念,LCDC 的痛点却在瞬时:帧缓冲读延迟一旦超过行缓冲的消耗速度,屏幕就撕裂。这类「延迟敏感、带宽中等」的主机正是 QoS 机制的标靶。AXI4 的 AWQOS/ARQOS 是 4 比特提示信号,数值越大越优先,但它只是提示——真正起作用的是互连仲裁器和 DDR 控制器调度器如何消费它,端到端语义见 AXI4 QoS 服务质量。
如上图,本案例的 QoS 分配是 LCDC=12 > CPU LSU=8 > DMA=4。这套配置要回答两个追问:
为什么不给 LCDC 直接拉满 15? 因为 QoS 是相对排序,不是绝对带宽。拉到 15 意味着 LCDC 任何一笔读都无条件插到 DDR 队首,DMA 的大块搬运会被频繁打断——DDR 的行命中被打散后总带宽反而下降,LCDC 自己也受害。12 留出了「上面还有更高优先级」的余地,比如可以把 CPU 的个别关键路径(异常向量取指)临时提到 15。
DMA 给 4 会不会饿死? 单靠 QoS 会。所以仲裁器里还要两级兜底:同 QoS 值内部走 round-robin(公平性机制见 Round-Robin 仲裁器),跨 QoS 用老化(aging)——一笔请求等待超过阈值(比如 256 拍)就自动临时提级。这样 DMA 在 LCDC 刷屏间隙总能挤进去,平均带宽由 outstanding 深度保证,最坏延迟由老化阈值封顶。
QoS 是端到端信号:主机发出 → crossbar 透传并用于本级仲裁 → DDR 控制器再次消费。验证时要分段打点:crossbar 入口采 ARQOS,仲裁结果记录服务顺序,DDR 侧再核对调度桶,三段对得上才算 QoS 链路真的通了——只验证「信号透传不丢」是最常见的漏测,那只能证明线连对了,证明不了优先级生效了。
六、时序收敛与死锁验收:互连的收尾两关
功能对了还不算完,互连要过最后两关:时序与死锁。
时序关:5×5 crossbar 的地址译码 + 仲裁 + 多路选择器是全组合路径,100 MHz 下经常收不住。标准疗法是在主机入口和从机出口各打一拍寄存器切片(register slice),把「译码→仲裁→选择」三段长路径切成短段,代价是每条通路加 1-2 拍延迟——这正是第四节算 outstanding 时要预留延迟裕量的原因之一,切片加拍后 outstanding 需求同步上调。寄存器切片的三种形态(full/half/full-registered)与适用位置见 AXI 寄存器切片。
死锁关:互连把多个主机、多个从机的反压网连成一张大图,单点合法的反压策略在环路上可能拼出死锁。验收用一张检查表走查:
这六条里最容易翻车的是检查 4。真实案例:CPU 的存储器系统设计成「收到前一笔读的 R 数据后才发下一笔 AR」,而 R 数据要经过 crossbar 回传,crossbar 的 R 通路表项又被 DMA 的长 burst 占着,DMA 的写完成又在等 CPU 发出的一笔配置写——三方各等一段,全合法,合起来死锁。解法是检查 1+3 的组合:接收侧 FIFO 深度覆盖授信、发起授信小于通路总容量,永远留一条「能排空」的路。这套机理的完整推导见 AXI4 事务生命周期 的死锁一节。
验证手段上,互连级死锁靠定向用例抓不全,必须上形式化或长随机回归:随机 stall 所有 READY、随机打满各条通路、随机插 DECERR 访问,回归末尾留排空阶段并断言全部计数器归零、全部表项释放。互连 IP 商(ARM NIC、Synopsys NoC 等)通常自带这类断言包,自研互连则必须自己补齐。
最后补一张端到端数据流的全景图,把前五节串起来:
一笔事务穿过互连的旅程就是:主机带着 ID 和 QoS 出发,入口切片打一拍,译码器查映射表决定去向(落空就去默认从机吃 DECERR),仲裁器按 QoS 争得从机口并占用一条互连表项,出口切片再打一拍,最后按从机节奏被接收。回程的响应沿同路返回、按 ID 对号。把这条流水线的每一段参数(延迟拍数、表项深度、QoS 权重)都写进设计文档,就是互连交付物的完整形态。
这一篇在知识体系里的位置
单笔事务怎么推进见 AXI4 事务生命周期,多笔在途与乱序语义见 AXI4 outstanding 与 ID 保序,优先级机制见 AXI4 QoS 服务质量,互连结构选型见 AXI Crossbar 与 Interconnect,时序打拍见 AXI 寄存器切片,仲裁公平性见 Round-Robin 仲裁器,低速外设侧见 AHB5 协议传输 与 AHB/APB 桥接相关篇章。
总结
一个 SoC 互连实例的设计就是把五张表做闭环:master/slave 清单定输入,地址映射表(含默认从机与 remap)定去向,outstanding 表用「带宽×延迟」的利特尔法则定深度,QoS 表给延迟敏感主机定优先级并配老化兜底,最后用时序打拍与六条死锁检查(响应可排空、AW/W 独立、授信留余量、无环路依赖、默认从机在位、老化兜底)验收——五表闭环,互连才算交付。