什么是 retiming?和手工插流水线有何区别?
更新时间:2026-09-21。问题驱动短答页。流水线见 什么是流水线,时序收敛见 时序违例怎么修、关键路径,FPGA 高级收敛见 高级时序收敛。
一句话回答
retiming(重定时)是综合或布局布线工具在“不改变电路对外功能”的前提下,自动把触发器沿组合逻辑前后移动,让各级组合延迟更均衡,从而提高可达到的最高时钟频率。例如一段逻辑是“3ns + 7ns”被 7ns 卡住,工具可把中间的寄存器移动使两段都接近 5ns。它和手工流水线的区别是:手工插级是架构师显式新增寄存器、自己承担延迟增加、需要冲刷/气泡和协议配合;retiming 不增加流水级数(寄存器总数大致守恒、只是移位),不动你的接口时序语义,但受边界约束——触发器不能被移过主输出(会改变输出延迟)、主输入、异步复位、某些多周期/假路路径,且通常要显式打开综合选项并约束允许。
直观例子
bash
原: FF --[ 3ns ]-- FF --[ 7ns ]-- FF (周期受 7ns 限制)
重定时后: FF --[ 5ns ]-- FF --[ 5ns ]-- FF (周期降到约 5ns)- 中间那个寄存器在数据通路里“挪动了位置”,每拍对应的逻辑边界变了,但整段加起来的功能、总延迟拍数对外一致。
- 工具还能在等量寄存器间前推(forward)/后移(backward)以平衡扇入扇出。
与手工流水线对比
| 维度 | 手工插流水线 | retiming |
|---|---|---|
| 谁决定 | 设计者在 RTL 显式加 FF | 工具自动移动既有 FF |
| 流水级数 | 增加(延迟/吞吐变化) | 基本守恒,只重排 |
| 接口/协议 | 需自己处理多拍延迟、气泡 | 对外时序语义不变 |
| 适用 | 架构级大幅提频 | 均衡已有流水、收敛余量 |
| 限制 | 自由 | 不能越过 IO/复位/特定路径 |
使用要点与限制
- 需要工具选项(如 Design Compiler
set_optimize_registers、FPGA 综合的 retiming/pipelining),并保证寄存器没有会阻止移动的属性。 - 不能重定时过边界:移动主输入/输出处 FF 会改变 IO 时序;带使能/同步复位的 FF 移动时使能逻辑要一并搬移。
- 对控制逻辑、含握手反压的数据通路,retiming 受限于不能改变可观察行为,见 valid/ready 反压。
- 可能改变内部节点名和波形可见性,给调试带来一定影响。
- 真正的大幅提频仍应靠架构流水线;retiming 是收敛阶段“最后一公里”的平衡手段。
常见坑
- 没开选项或 FF 被 dont_touch/复位结构锁住,retiming 不生效却以为已优化。
- 期望 retiming 增加吞吐——它不增加流水级,只平衡现有级。
- 移动后和门级仿真/形式验证的复位行为不一致,需过 LEC,见 逻辑等价性检查。
- 把跨时钟域同步寄存器也重定时,破坏同步器结构。
总结
retiming 是工具在保持功能不变下自动前后移动寄存器、把不均衡的组合延迟重新切成等量级以提频,寄存器数量和流水拍数大致守恒、不动接口语义,适合收敛阶段平衡现有流水线;手工插级则是设计者在架构上增加流水寄存器、换取吞吐但要自己处理多拍延迟和控制。它受 IO 边界、复位/使能和特殊路径限制、需要显式开启,做完要过等价性检查,且不能替代架构层面的流水线设计。