03 互连 QoS:从平均带宽到最坏服务期限¶
1. 为什么带宽够,FIFO 仍会断流?¶
48 kHz、双声道、每声道以 4 byte 存储时,PCM 平均流量仅为 384000 B/s。但 FIFO 不能借用未来的平均带宽:一段连续的仲裁等待、DDR 刷新或电源退出延迟,就可能耗尽当前水位。
必须同时检查两个条件:长期保证的服务速率高于消费速率,以及每次最长服务间隔小于剩余 FIFO 时间。提高平均吞吐并不等于满足第二个条件。
2. 水位决定服务预算¶
播放端以“尚可播放的 frame 数” W 计算;录音端应使用“尚可接收的空闲 frame 数”。这里一 frame 包含所有声道,不是一个单声道 sample。假设保留 50 µs 的设计余量:
允许的服务延迟 = W / fs - 50 µs
| 剩余/空闲 frame | 48 kHz 下原始裕量 | 扣除余量后的服务期限 |
|---|---|---|
| 16 | 333.33 µs | 283.33 µs |
| 32 | 666.67 µs | 616.67 µs |
| 64 | 1333.33 µs | 1283.33 µs |
| 128 | 2666.67 µs | 2616.67 µs |
以上是模型计算,不是实测或控制器配置建议。阈值寄存器可能使用 word、beat 或 byte;必须按 slot、声道和打包方式转换。FIFO 阈值也不能直接替换软件 ring buffer 的 period。
总服务延迟包括请求产生、跨时钟域、仲裁、内存访问和数据实际到达 FIFO 的时间。如果观测到最长间隔 700 µs,那么表中的 16/32 frame 不满足该假设下的期限;64 frame 有余量,但尚不能据此证明所有压力组合都安全。
3. QoS 能改变什么,不能保证什么?¶
AXI QoS 字段或 NoC 优先级的含义由互连和内存控制器实现决定。不能把某个数值、寄存器地址或“最高优先级”等同于固定纳秒响应。
- 优先级通常影响后续仲裁,不意味着可以抢占已经接受的任意 burst。
- outstanding 深度增大可能提高吞吐,也可能增加已排队请求造成的阻塞。
- burst 长度受 FIFO 空间、总线效率、控制器约束共同限制,没有通用的“最多 16 samples”规则。
- DDR 刷新、bank 冲突、读写切换、低功耗状态退出仍需计入边界。
- 长期严格优先级可能使其他主设备饥饿;应验证整机公平性与最小带宽,而不是只观察音频。
配置必须来自目标 SoC TRM、驱动和实际有效寄存器回读;本文不提供可直接写入硬件的虚构地址。
4. 对比实验怎么做?¶
| 实验 | 保持不变 | 改变项 | 关键观测 |
|---|---|---|---|
| 空闲基线 | 格式、FIFO、period、CPU 策略 | 无压力 | 请求到服务延迟分布 |
| 内存竞争 | 同上 | CPU/GPU/显示读写压力 | 最大间隔、低水位、XRUN |
| QoS 对照 | 同一压力输入 | 默认/候选 QoS | 尾延迟与其他业务退化 |
| 电源对照 | 同一音频流 | DDR/NoC 电源策略 | 退出延迟、功耗 |
| 长时稳定性 | 最差已知组合 | 温度、运行时长 | 事件计数与原始 trace |
记录 p50、p99.9、最大值及样本数;最大观测值不是数学最坏上界。用 FIFO 水位/underrun 计数与互连 trace 对齐,避免把用户态调度延迟错归因于 NoC。
5. 面试复盘¶
先回答“哪个 FIFO、计量单位是什么、何时产生请求”,再给出服务期限和测量证据。若只有平均带宽数据,结论应是“容量足够,实时性尚未证实”,而非“总线不是瓶颈”。