题目重点:按稳定电平、短事件和多位连续数据区分 CDC 方案,解释丢脉冲、吞吐与验证边界。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 讨论异步或相位未受约束的两个时钟域;CDC 的正确性取决于源信号停留时间、事件间隔、总线一致性与目的侧确认。
- 硬件具体库单元、时序约束和亚稳态 MTBF 目标需按目标工艺与工具核定;不能从面经单独给出安全频率。
解题路线
- 单 bit 稳定电平:目的侧两级或更多同步寄存器降低亚稳态传播风险;源电平必须维持足够久让目的侧采样。AMD 的单 bit CDC 文档明确要求目的时钟至少采样输入两次。
- 短脉冲/事件:源脉冲若完全落在两次目的采样边缘之间,普通 2FF 可能都没看到;在目的侧对已同步电平做 edge detect 不能恢复从未被采到的脉冲。可用脉冲跨域电路、toggle 或 request/ack handshake,并核对最小事件间隔。
- 多 bit 控制/数据:各位分别 2FF 可能来自不同源周期,不能保证字一致。数据低频变化可用握手并保持 bus 稳定直到确认;持续高吞吐流用 dual-clock async FIFO,读写时钟域各管其指针、跨域指针需专门同步与时序约束。
- 从需求反推方案:一次配置寄存器→握手;稀疏 event→pulse/toggle(若事件不密集);持续宽数据→async FIFO。将 reset 进入/退出、满/空边界、时钟停摆和突发事件间隔列入仿真/CDC 静态检查。
- 官方宏只是可验证的实现参考,项目若自写 RTL 还须走目标工艺库 CDC/lint/timing signoff;原面试未指定使用 AMD/Intel IP。
手动走一遍
源时钟 200MHz 的一个周期脉冲宽约 5ns,目的时钟 50MHz 周期 20ns;脉冲可能在两次目的采样之间出现并消失。将它送普通 2FF 仍会漏;request/ack 让源保持 request 直到目的确认,代价是往返延迟和较低最大事件速率。若每源周期都有多位数据,握手吞吐不足则应考虑 async FIFO。
规模与取舍
硬件成本随同步寄存器级数、握手状态及 FIFO 深度/位宽增长;握手端到端延迟含跨域同步往返,FIFO 提供存储弹性但增加 RAM、指针与 full/empty 逻辑。不是普通软件 O(n) 题,具体 MTBF、时序和面积需目标时钟/工艺数据。
易错点与追问
容易失分的边界
- 认为目的侧加 edge detect 就能恢复未被采样的源短脉冲。
- 把多 bit 总线每位单独过 2FF 后当成同一时刻快照。
- 用 async FIFO 却忽略读写指针跨域与 reset/full/empty 约束。
- 只测平均频率,不测最短事件间隔和时钟暂停。
- 拿候选人题目‘频率不同’一句话断言某个具体 synchronizer 的 MTBF。
继续深挖
- 若源比目的快但事件最短间隔很长,是否一定要 FIFO?
- toggle synchronizer 连续两次翻转过快会怎样?
- 握手 bus 在 source ack 前要保持哪些稳定条件?
- FIFO 指针为何常用 Gray 编码,时序约束仍需做什么?
技术参考
- AMD XPM_CDC_SINGLE 官方文档:说明单 bit 同步及目的时钟至少两次采样要求。
- AMD XPM_CDC_PULSE 官方文档:说明脉冲跨域与最小事件间隔。
- AMD XPM_CDC_HANDSHAKE 官方文档:说明跨域 bus 的请求/确认过程。
- Intel FIFO IP 官方文档:双时钟 FIFO 的功能参考。
