Xilinx 7系列FPGA时钟网络详解:CMT、BUFG、BUFH、BUFIO、BUFR、BUFMR一文搞懂(附Vivado实测)
一句话总结:LUT 决定你能做多少逻辑,时钟网络决定这些逻辑能不能跑起来。
本文基于 UG472 v1.14 、UG475 v1.9 和 Vivado 2018.3 器件模型实测,把 7 系列的 CMT、Clock Region、Clock Backbone 和五类时钟缓冲器串起来讲清楚。
开篇:为什么说"时钟网络"是 FPGA 设计的必修课?
很多初学者学 FPGA,把大部分时间花在 Verilog 语法、状态机、IP 核上,却忽略了时钟网络。结果一到上板就遇到:
- 综合/实现报告里 Clock Routing 爆红,时序怎么都收敛不了;
- 明明逻辑不多,Fmax 却上不去;
- 想用 BUFG 做时钟切换,结果输出毛刺,系统偶发死机;
- 跨 SLR 的时钟 skew 太大,建立/保持时间违例;
- 时钟资源不够用,只能改架构重新布局。
时钟网络是 FPGA 的"神经系统":它不参与运算,却决定了所有寄存器的节拍。同样的逻辑,时钟方案不同,面积、功耗、Fmax 可能差出一大截。
更现实的是:时钟资源是硬资源。单片 BUFG 只有 32 个,每个 Clock Region 最多 12 个全局时钟,CMT 只能驱动同半区的 BUFG......这些约束不会因为你写的是"高级代码"而消失。
所以,理解时钟网络不仅是"面试八股",更是决定项目能不能按时收敛、能不能稳定运行的基本功。
本文你能学到:
- 7 系列 Clock Region 的网格规律(为什么永远是 2 列?)
- Clock Backbone 到底是什么,SSI 器件里为什么"每个 SLR 一条"
- CMT 里 MMCM 和 PLL 到底差在哪
- BUFG / BUFH / BUFIO / BUFR / BUFMR 五类缓冲器怎么选
- A7-35T 的实测数据与常见误区
- 一组可以直接在 Vivado 里跑的查询命令
适合人群:FPGA 初学者、正在使用 7 系列做项目的工程师、准备 FPGA 面试的同学。
建议先收藏,做时钟方案和时序约束时翻出来对照。
先给结论:7 系列时钟资源一张表
| 资源 | 数量 | 位置 | 作用域 |
|---|---|---|---|
| CMT(1 MMCM + 1 PLL) | 最多 24 个/器件 | CMT 列(紧邻 I/O 列) | 就近驱动 BUFG / BUFH / BUFR |
| BUFGCTRL / BUFG 系 | 32 个/器件(SSI:32 个/SLR) | Clock Backbone 沿线,上 16 + 下 16 | 全局(所有 Clock Region) |
| BUFH / BUFHCE | 12 个/Clock Region | 每个 Region 的 HROW | 单个 Clock Region |
| BUFIO | 4 个/I/O Bank | I/O Bank 内 | 本 Bank 的 I/O 逻辑 |
| BUFR | 4 个/I/O Bank | I/O Bank 内 | 本 Clock Region(I/O + 逻辑) |
| BUFMR / BUFMRCE | 2 个/I/O Bank(仅 MRCC) | I/O Bank 内 | 本 + 上下相邻共 3 个 Region/Bank |
记忆口诀:BUFG 管全局,BUFH 管一层,BUFIO 管 I/O,BUFR 管一层带分频,BUFMR 管三层。
一、从 die 看起:时钟资源到底在哪?
先看一张 UG475 里的 XC7A100T Bank 图:

图:UG475 Figure 1-1,XC7A100T 的 I/O Bank、CMT 列与 Clock Backbone 分布
图中几个关键信息:
- 最外侧左右两列是 I/O Bank:左侧 Bank 16/15/14/13(HR),右侧 Bank 35/34(HR)。
- I/O 列内侧是 CMT 列:左侧 PLL03~PLL00,右侧 PLL11/PLL10。
- 中间是 Clock Backbone:纵向贯穿,把 die 分成左半区(X0)和右半区(X1)。
- 水平中心线把 BUFG 分成上 16 个、下 16 个。
- 每个 Clock Region 中心是 HROW,BUFG/BUFH 通过它驱动本区域。
- GT Quad 也占列:A7-100T 的 GTP Quad 216/213 在右侧,占据右侧上下两行,所以右侧只有中间两行放 I/O Bank。
划重点 :7 系列是"列式"架构,I/O、CMT、GT、CLB、BRAM、DSP 都是纵向列;die 的上下边缘没有用户 I/O Bank。
I/O Bank 与 Clock Region 是对齐的
一个 I/O Bank = 50 个 I/O ,高度正好等于一个 Clock Region 的 50 个 CLB。
Vivado 实测的 Bank↔Y 坐标(A7-100T):
- Bank 14:Y50~99
- Bank 15:Y100~149
- Bank 34:Y50~99
- Bank 35:Y100~149
也就是说:每个 Clock Region 在左、右两侧各对应一个 I/O Bank(如果该 Bank 存在且被封装 bond 出来)。
注意区分"die 上有"和"封装可用":A7-100T 的 CSG324 封装中 Bank 13 未 bonded out;V7-585T 的 FFG1157 中 Bank 1113、3133 未 bonded out。
二、Clock Region:50 CLB 的"网格"
2.1 定义
UG472 原文:
"A clock region includes all synchronous elements ... in an area spanning 50 CLBs and one I/O bank (50 I/Os) , with a horizontal clock row (HROW) in its center."
"Each clock region spans 25 CLBs up and 25 CLBs down from the HROW, and horizontally across each side of the device."
翻译一下:
- 高度固定:50 个 CLB(HROW 上 25 + 下 25)。
- 宽度:占 die 的左半边或右半边。
- 一个 Region 内最多 12 个全局时钟域。
- 每个 Region 固定有 12 个 BUFH。
2.2 数量规律:永远 2 列,行数随 die 高度变化
- 左右方向:Clock Backbone 把 die 分成 X0 / X1 两列 ,所以列数恒为 2。
- 上下方向:每行 50 CLB,行数由 die 高度决定。
- 所以:Clock Region 数 = 2 × 行数,一定是偶数。
UG472 给的总体范围是 1~24 个 ;Vivado 2018.3 实测 7 系列最小是 2 个 (S6/S15,1 行),最大是 24 个(V7-2000T,12 行)。
2.3 各器件实测对比
| 器件 | 封装(实测) | Y 行数 | Clock Region 数 | CMT 数 | 备注 |
|---|---|---|---|---|---|
| XC7S6 | CSGA225 | 1 | 2 | 2 | 最小 7 系列 |
| XC7S15 | CSGA225 | 1 | 2 | 2 | |
| XC7A12T | CSG325 | 2 | 4 | 3 | |
| XC7A35T | CSG324 | 3 | 6 | 5 | X1Y2 无 CMT |
| XC7A50T | CSG324 | 3 | 6 | 5 | |
| XC7K70T | FBG484 | 4 | 8 | 6 | |
| XC7A100T | CSG324 | 4 | 8 | 6 | |
| XC7V585T | FFG1157 | 9 | 18 | 18 | |
| XC7V2000T | FLG1925 | 12(4 SLR × 3) | 24 | 24 | SSI |
CMT 数 ≠ Clock Region 数!
以 A7-35T 为例:6 个 Region,但只有 5 个 CMT。MMCM/PLL 位于 X0Y0、X0Y1、X0Y2、X1Y0、X1Y1,右上角 X1Y2 没有 CMT。
原因:Clock Region 是按 50 CLB 网格切出来的;CMT 是 CMT 列里实际摆放的硬核。UG472 的措辞是"contains, if applicable, one CMT"。
2.4 方向别搞反
- 左右(X 方向)恒为 2 列:X0 = 左半区,X1 = 右半区。
- 上下(Y 方向)行数变化:1 行(S6/S15)~ 12 行(V7-2000T)。
- 器件"变宽"不会增加 Region 数,只有"变高"才会。
三、Clock Backbone:不是"正中心的一根柱子"
很多资料把 Clock Backbone 画在芯片正中间,容易让人误解。准确地说:
- 它是专用的纵向时钟布线干线,不是逻辑单元。
- 携带 32 条全局时钟线。
- 把 die 分成左、右两半(X0 / X1)。
- 不在 die 的几何正中心------它偏向一侧,所以左右两列的宽度不一定相等。
- BUFG 就分布在这条主干沿线:上 16 个 + 下 16 个。
SSI 器件:每个 SLR 都有自己的 Backbone
以 V7-2000T 为例:
- 每个 SLR 有自己独立的 Clock Backbone,32 个 BUFG / 32 条全局时钟线。
- 相邻 SLR 的 Backbone 通过 interposer 中的 32 条双向、三态、专用垂直布线连接。
- 这是唯一跨 SLR 的专用时钟资源。
- 每个 SLR 高 3 个 Clock Region(V7-2000T:4 SLR × 3 行 × 2 列 = 24 个 Region)。
- BUFG 的输入只能来自本 SLR 内的源 ;但 BUFG 的输出可以驱动其他 SLR 的全局时钟线。
- 跨 SLR 的时钟 skew 更大,相关时钟网络尽量放在同一个 SLR 内。
所以不要理解成"整个芯片只有一条中央 Backbone":每个 SLR 各有一条,再通过 interposer 连起来。
CMT Backbone 又是什么?
- 与 Clock Backbone 不同:CMT Backbone 是 CMT 之间的专用级联通道(CLKFBOUT/CLKOUT 送到相邻 CMT)。
- 级联资源有限,不是所有 CMT 都能任意互连。
四、CMT:MMCM + PLL
4.1 基本结构
- 每个 CMT = 1 个 MMCM + 1 个 PLL。
- 7 系列最多 24 个 CMT。
- CMT 位于 CMT 列,紧邻 I/O 列,对 I/O 有专用访问路径。
- 主要功能:频率合成、抖动过滤、时钟 deskew。
4.2 MMCM 内部结构
CLKIN ──÷D──→ PFD ──→ Charge Pump ──→ Loop Filter ──→ VCO ──→ ÷O0..÷O6 ──→ CLKOUT0..6
↑ │
└──────── ÷M(反馈,可小数) ←── CLKFBOUT ─┘
- PFD:鉴相器,比较参考时钟与反馈时钟。
- Charge Pump + Loop Filter:控制 VCO 频率。
- VCO:工作范围见 UG472 电气规格(示例为 600~1600 MHz,随速度等级/器件而定)。
- D / M / O 分频器:输入分频、反馈分频、输出分频。
- 小数分频 :
CLKOUT0_DIVIDE_F,分辨率 1/8;CLKFBOUT_MULT_F支持小数倍频。 - 相移:粗相移、精细相移、动态相移。
4.3 MMCM 和 PLL 到底差在哪?
| 功能 | MMCM | PLL |
|---|---|---|
| 输出计数器 | CLKOUT0~CLKOUT6(7 个) | CLKOUT0~CLKOUT5(6 个) |
| 反相输出 | CLKOUT0B~CLKOUT3B | 无 |
| 小数分频 | 支持(CLKOUT0,1/8 步进) | 无 |
| 小数倍频 | CLKFBOUT_MULT_F |
无 |
| 精细相移 | 支持(无限、双向) | 无(仅粗相移) |
| 动态相移 | 支持(PSINCDEC/PSEN) | 无 |
| CLKOUT6 → CLKOUT4 级联 | 支持 | 无 |
| 直连 BUFIO/BUFR(HPC) | 支持(CLKOUT0:3) | 不支持 |
| CLKOUT0 作为反馈 | 支持 | 不支持 |
结论:
- MMCM 是超集,高速 I/O、需要小数分频/精细相移时优先用 MMCM。
- PLL 是子集,适合简单倍频/分频、低功耗场景。
- 7 系列中 PLL 不再推荐用于高速源同步 I/O 时钟(没有到 BUFIO/BUFR 的直连)。
4.4 一个容易忽略的"半区"约束
- 输入可来自:时钟能力引脚(SRCC / MRCC)、IBUFG / IBUFGDS、BUFG / BUFH / BUFR、GT 收发器。
- 上半区的 CMT 只能驱动上半区的 BUFG;下半区的 CMT 只能驱动下半区的 BUFG。
- 同理,只有同一半区的 BUFG 才能作为该半区 CMT 的反馈。
- GT 直连 CMT 只在 Virtex-7T / XT 的完整 GT+I/O 列中成立;S7/A7/K7/Zynq 的 GT 到 CMT 一般要经过 BUFH(推荐)或 BUFG。
这个约束在布局时非常关键:CMT 和 BUFG 放错半区,工具会直接报错或绕远路。
五、时钟缓冲器全家桶:五类资源怎么选?
5.1 全局时钟缓冲:BUFGCTRL 家族
- 数量:32 个/器件(SSI 每个 SLR 32 个)。
- 位置:Clock Backbone 沿线,上 16 + 下 16。
- 驱动范围:全局,可驱动所有 Clock Region。
- 每个 Region 最多同时使用 12 个全局时钟。
- 同一半区的 16 个 BUFG 可以级联,形成"16 个 BUFGMUX 的环"。
| 原语 | 输入 | 控制 | 说明 |
|---|---|---|---|
| BUFGCTRL | I0, I1 | CE0, CE1, IGNORE0, IGNORE1, S0, S1 | 底层 2:1 无毛刺 MUX |
| BUFG | I | --- | 最简单全局缓冲(BUFGCTRL 预设) |
| BUFGCE | I | CE | 带时钟使能 |
| BUFGCE_1 | I | CE | 与 BUFGCE 类似,禁用时输出保持 High |
| BUFGMUX | I0, I1 | S | 无毛刺时钟切换,下降沿敏感、切换前保持 Low |
| BUFGMUX_1 | I0, I1 | S | 上升沿敏感、切换前保持 High |
| BUFGMUX_CTRL | I0, I1 | S | 用 S 引脚随时切换,无毛刺(替代 BUFGMUX_VIRTEX4) |
关键属性:
INIT_OUT:上电/失电时的输出电平。PRESELECT_I0/PRESELECT_I1:初始选择哪一路输入(不能同时为 TRUE)。- 切换是 glitch-free 的:在时钟低/高电平期间完成。
用途:高扇出全局时钟、跨 Region 时钟、时钟切换、时钟使能。
5.2 水平/区域时钟缓冲:BUFH / BUFHCE
- 数量:12 个/Clock Region。
- 位置:每个 Region 的 HROW。
- 驱动范围:只在当前 Clock Region 内,不能跨到上下相邻 Region。
- 与 BUFG 共享 HROW 的 12 条布线轨道。
- 不能分频。
- 可以作为 MMCM/PLL 的反馈,支持 clock insertion delay 补偿。
BUFHCE带时钟使能,可按周期门控,降低动态功耗。
用途:逻辑集中在一个 Region 时,用 BUFH 替代 BUFG,省全局资源、降低功耗和 skew。
5.3 I/O 时钟缓冲:BUFIO
- 数量:4 个/I/O Bank。
- 位置:I/O Bank 内。
- 驱动范围:同一个 I/O Bank 的 I/O 时钟树,只驱动 I/O 逻辑(ILOGIC/OLOGIC/ISERDES/OSERDES)。
- 不能分频,不能驱动 fabric 逻辑。
- 常用于源同步接口(DDR/SDR、SelectIO)。
5.4 区域时钟缓冲:BUFR
- 数量:4 个/I/O Bank。
- 位置:I/O Bank 内。
- 驱动范围:同一个 Clock Region 的 regional clock tree,可驱动 I/O 和 fabric 逻辑。
- 支持 1~8 分频。
- 可与 BUFIO 配合,实现源同步系统的跨时钟域。
一个 Region / I/O Bank 最多支持 4 个独立 I/O 时钟 + 4 个独立 regional 时钟。
5.5 多区域时钟缓冲:BUFMR / BUFMRCE
- 数量:2 个/I/O Bank ,且只接 MRCC 引脚。
- 驱动范围:本 Region + 上下相邻 Region,共 3 个。
- 用来驱动多个 BUFIO / BUFR,让 I/O 时钟或 regional 时钟跨 3 个垂直相邻 Bank/Region。
BUFMRCE支持同步或异步切换。
典型用法:一个 MRCC 时钟源,需要驱动连续 3 个 Bank 的源同步接口时,用 BUFMR 分发。
5.6 选型速查表
| 需求 | 推荐缓冲器 |
|---|---|
| 全局高扇出、跨 Region | BUFG / BUFGCE |
| 逻辑集中在一个 Region,想省全局资源 | BUFH / BUFHCE |
| 源同步 I/O 时钟(只驱动 I/O) | BUFIO |
| 源同步 I/O 时钟(还要驱动 fabric,或需要分频) | BUFR |
| 一个时钟要覆盖上下 3 个 Bank/Region | BUFMR + BUFR/BUFIO |
| 两个时钟源无毛刺切换 | BUFGMUX / BUFGCTRL |
| 需要时钟门控 | BUFGCE / BUFHCE |
六、Vivado 实测:A7-35T 到底有多少时钟资源?
6.1 Clock Region 与 CMT
- Clock Region:6 个
- X0Y0、X0Y1、X0Y2
- X1Y0、X1Y1、X1Y2
- CMT:5 个
- X0Y0、X0Y1、X0Y2、X1Y0、X1Y1
- X1Y2 没有 CMT
6.2 时钟资源数量
| 资源 | 实测数量 | 交叉验证 |
|---|---|---|
| MMCM | 5 | 每个 CMT 1 个 |
| PLL | 5 | 每个 CMT 1 个 |
| BUFGCTRL | 32 | 全局缓冲总数 |
| BUFHCE | 72 | 12 × 6 个 Region |
| BUFIO | 20 | 4 × 5 个 bonded Bank |
| BUFR | 20 | 4 × 5 个 bonded Bank |
| BUFMRCE | 10 | 2 × 5 个 bonded Bank |
这组数字非常好地验证了 UG472 的规则:每 Region 12 个 BUFH,每 Bank 4 个 BUFIO + 4 个 BUFR + 2 个 BUFMR。
6.3 自己动手查
在 Vivado 里用一个空设计就能查(不需要综合):
tcl
create_project -in_memory -part xc7a35tcsg324-1
read_verilog empty.v
set_property top top [get_filesets sources_1]
link_design -top top
get_clock_regions
get_sites -filter {SITE_TYPE == "MMCME2_ADV"}
get_sites -filter {SITE_TYPE == "PLLE2_ADV"}
get_sites -filter {SITE_TYPE == "BUFGCTRL"}
get_sites -filter {SITE_TYPE == "BUFHCE"}
get_sites -filter {SITE_TYPE == "BUFIO"}
get_sites -filter {SITE_TYPE == "BUFR"}
get_sites -filter {SITE_TYPE == "BUFMRCE"}
get_iobanks
实现完成后,还可以跑:
tcl
report_clock_utilization -file clock_util.rpt
报告会按 X0/X1 × Y0...Yn 列出每个 Clock Region 的 BUFG/BUFH/CMT 占用情况。
七、六个常见误区,看看你中过几个?
误区 1:CMT 数量 = Clock Region 数量
错。 A7-35T 有 6 个 Clock Region,但只有 5 个 CMT。Clock Region 是网格,CMT 是硬核,不是每个 Region 都有。
误区 2:Clock Backbone 在芯片正中心
错。 UG472 明确写了它不在 die 的几何中心。它把 die 分成左右两半,但两半宽度不一定相等。
误区 3:所有引脚都在芯片四周,上下也有 I/O
不准确。 7 系列的用户 I/O Bank 只在左右两列,上下边缘没有用户 I/O Bank。上下可能有配置引脚、电源地 pad;封装又是 BGA,焊球在封装底部。
误区 4:BUFG 有 32 个,随便用
错。 除了总数限制,还有两个坑:
- 每个 Clock Region 最多 12 个全局时钟;
- 上半区的 CMT 只能驱动上半区的 BUFG,下半区同理。
误区 5:PLL 和 MMCM 差不多,用哪个都行
错。 PLL 是 MMCM 的子集:没有小数分频、没有精细/动态相移、没有 CLKOUT6、没有反相输出,也没有到 BUFIO/BUFR 的直连。高速源同步接口优先 MMCM。
误区 6:BUFH 可以当全局时钟用
错。 BUFH 是严格的区域资源,只能驱动本 Clock Region,不能跨到上下相邻 Region,也不能分频。
八、面试常问的 6 个问题
Q1:一个 Clock Region 有多高?
A:50 个 CLB,HROW 上下各 25 个。
Q2:一个 Clock Region 最多几个全局时钟?
A:12 个。
Q3:7 系列有多少个 BUFG?怎么分布?
A:32 个/器件(SSI 每个 SLR 32 个),上 16 + 下 16。
Q4:CMT 和 Clock Region 数量一样吗?
A:不一定。A7-35T 是 5 个 CMT、6 个 Region。
Q5:BUFIO 和 BUFR 有什么区别?
A:BUFIO 只驱动 I/O 时钟树,不能驱动 fabric,不能分频;BUFR 可驱动 I/O + fabric,支持 1~8 分频。
Q6:BUFMR 是干什么的?
A:让 BUFIO/BUFR 覆盖本 Region 加上下相邻共 3 个 Region/Bank,常用于跨 3 个 Bank 的源同步接口。
九、设计检查清单
时钟输入
- 时钟是否接在 SRCC / MRCC 时钟能力引脚上?
- 差分时钟是否使用 P 侧(单端输入也必须用 P 侧)?
- 时钟输入是否靠近目标 CMT?
- 输入时钟电平标准、VCCO 是否正确?
CMT
- 高速 I/O、需要小数分频/精细相移时是否用 MMCM?
- 是否注意 CMT 只能驱动同半区 BUFG?
- 反馈 BUFG 是否与 CMT 在同一半区?
- GT → CMT 是否走了正确的 BUFH/BUFG 路径(非 V7T/XT)?
时钟缓冲
- 全局时钟用 BUFG ;单 Region 低功耗用 BUFH。
- 源同步接口用 BUFIO + BUFR。
- 需要跨 3 个上下相邻 Bank/Region 时用 BUFMR。
- 每个 Region 的全局时钟是否超过 12 个?
- 是否需要时钟切换/门控(BUFGMUX/BUFGCE)?
布局与 SSI
- 相关时钟网络是否尽量放在同一个 SLR?
- 跨 SLR 时钟是否接受额外的 skew?
- 目标 Bank 是否在该封装中 bonded out?
- 是否用
report_clock_utilization检查了时钟区域占用?
十、写在最后
时钟网络是 FPGA 里最容易"看起来懂、用起来错"的部分。把下面这句话记住,能少踩很多坑:
7 系列的时钟体系是"2 列 × N 行"的 Clock Region 网格:每个 Region 50 CLB 高、12 个 BUFH、最多 12 个全局时钟;CMT(MMCM+PLL)放在 CMT 列里,靠 BUFG/BUFH/BUFIO/BUFR/BUFMR 把时钟分发到全局、单区域、I/O Bank 或 3 个相邻区域。SSI 器件每个 SLR 各有 32 个 BUFG 和一条 Clock Backbone,通过 interposer 的 32 条三态线互联。
如果你正在做 7 系列的项目,建议把这几件事养成习惯:
- 先画 Clock Region 网格,再决定 CMT/BUFG 放哪;
- 高速接口优先 MMCM,别用 PLL 硬扛;
- 能用 BUFH 就不用 BUFG,省资源也省功耗;
- 跨 SLR 的时钟尽量少,必须跨时接受 skew;
- 实现后一定看
report_clock_utilization。
如果这篇文章帮你理清了一个概念,欢迎点赞、收藏、关注三连支持一下。
也欢迎在评论区聊聊:你在项目里被哪个时钟问题坑过? 是 BUFG 不够用、MMCM 失锁,还是跨 SLR 的 skew?你的经历可能正好帮到别人。
关注我,后续继续更新 7 系列 Floorplan、时序约束、SelectIO 等 FPGA 学习笔记。