第2章 优化时钟网络
2.1 时钟资源
时钟资源主要包括全局时钟引脚、时钟缓冲器和时钟管理单元。本节重点介绍7系列FPGA、UltraScale/UltraScale+和Versal ACAP中的时钟资源。
2.1.1 7系列FPGA中的时钟资源
1.全局时钟引脚
7系列FPGA基于28nm工艺制程。在7系列FPGA中,每个输入/输出区域(I/O Bank)包含50个输入/输出引脚,其中有4对(8个)全局时钟引脚,称为CCIO(Clock-Capable IO)。每对CCIO包含一个P端和一个N端,用于构成差分I/O,从而使得输入时钟支持差分时钟。如果外部时钟是单端时钟,则需要连接到CCIO的P端。此时,相应的N端只能用作通用I/O,而不能再当作另一个全局单端时钟引脚。在这4对CCIO中,有2对MRCC(Multi-Region Clock-Capable),2对SRCC(Single-Region Clock-Capable)。当它们未被当作时钟引脚使用时,可用作通用I/O。
设计规则1:确保外部时钟是由全局时钟引脚进入FPGA内部。
2.时钟缓冲器
7系列FPGA中的时钟缓冲器分为全局时钟缓冲器(Global Clock Buffer)和区域时钟缓冲器(Regional Clock Buffer)。全局时钟缓冲器是指由BUFGCTRL配置成的BUFG、BUFGCE、BUFGMUX和BUFGMUX_CTRL。7系列FPGA有32个全局时钟缓冲器。这32个全局时钟缓冲器位于全局时钟列,不属于任何时钟区域(Clock Region)。其中有16个位于全局时钟列的上侧,另外16个位于全局时钟列的下侧,如图2-1所示。图中XmYn是时钟区域坐标,每个时钟区域的高度为50个CLB(Configurable Logic Block),宽度为整个芯片宽度的一半。同时,还可以看到全局时钟列位于芯片的中心位置,垂直时钟布线资源也位于此;水平时钟布线资源则位于每个时钟区域水平方向的中心位置。
之所以称为全局时钟缓冲器,是因为它们输出的时钟可经全局时钟树(Global Clock Tree)到达FPGA内部逻辑及输入/输出逻辑(指ILOGIC和OLOGIC,位于输入/输出区域)的时钟端口,而其输入时钟可来自与之同侧的MRCC、SRCC、CMT(Clock Management Tile:时钟管理带。一个CMT包含一个MMCM和一个PLL)、BUFG或高速收发器的输出时钟RXOUTCLK/TXOUTCLK,如图2-2所示。
图2-1
图2-2
区域缓冲器也称为局部缓冲器,包括BUFH、BUFIO、BUFR和BUFMR。之所以称为区域缓冲器,是因为它们输出的时钟经区域时钟树(Regional Clock Tree)之后可到达特定区域内的逻辑的时钟端口。区域缓冲器隶属于时钟区域。每个时钟区域包括12个BUFH、4个BUFIO、4个BUFR和2个BUFMR,如图2-3所示。
BUFH的输入时钟可来自于与之同一时钟区域或相邻水平时钟区域内的MRCC、SRCC、CMT、BUFG或高速收发器的输出时钟RXOUTCLK/TXOUTCLK。以图2-1为例,时钟区域X1Y0的BUFH可由本区域内的MRCC驱动,也可由X0Y0内的MRCC驱动,这就是相邻水平时钟区域的概念。BUFH的输出可连接到CMT的时钟端口或本时钟区域内BUFG可到达的时钟端口,如图2-4所示。相比于BUFG,BUFH具有更低的功耗,同时输出时钟抖动更小。此外,BUFH还可配置为带时钟使能的BUFHCE,从而实现门控时钟功能。
图2-3
图2-4
设计规则2:使用BUFH时,要确保BUFH所驱动的逻辑资源可以放置在一个时钟区域内。
BUFIO和BUFR的输入时钟均可来自于与之同一时钟区域内的MRCC、SRCC、MMCM的输出时钟CLKOUT0~CLKOUT3、MMCM的输出反馈时钟CLKFBOUT或BUFMR。BUFIO的输出时钟只能驱动ILOGIC和OLOGIC。BUFR的输出时钟可驱动CMT或与之同一时钟区域内的逻辑资源,包括ILOGIC和OLOGIC,如图2-5所示。此外,BUFR还具备分频功能,可支持的分频因子为1~8(包含1和8)的整数。
图2-5
应用案例1:数据端口和时钟端口可容纳于同一输入/输出区域内的源同步设计
通常,在源同步设计中会用到OSERDES或ISERDES,它们都有时钟端口CLK和CLKDIV,其中CLKDIV是CLK的分频时钟,此时可采用如图2-6所示的时钟方案。时钟由CCIO进入,连接到同一输入/输出区域内的BUFR和BUFIO,借助BUFR的分频功能产生CLKDIV,而BUFIO的输出直接连接到CLK端口。
图2-6
BUFMR的输入时钟可以是MRCC,也可以是高速收发器的输出时钟RXOUTCLK或TXOUTCLK,而其输出时钟可以是与之同一时钟区域内的BUFIO/BUFR,或与之相邻同列上方/下方的时钟区域内的BUFIO/BUFR,如图2-7所示。
图2-7
所谓“相邻同列上方/下方的时钟区域”,我们结合图2-8理解。图中BUFMR位于时钟区域X0Y1,与之相邻同列上方的时钟区域是X0Y2,与之相邻同列下方的时钟区域是X0Y0,故BUFMR可驱动这3个时钟区域内的BUFIO/BUFR。此外,BUFMR还可配置为BUFMRCE,以保证提供给BUFR和BUFIO的时钟是同步且同相位的。
图2-8
BUFMR的输入时钟可以来自MRCC,但不能是SRCC,这正是MRCC和SRCC的区别,如图2-9所示。两者的输入时钟均来自于FPGA外部,输出时钟的差异仅在于MRCC可驱动的对象多了一个与之同一时钟区域内的2个BUFMR。
图2-9
设计规则3:在使用BUFMR时,如果其输入时钟来自FPGA外部,要确保该时钟由MRCC进入。
应用案例2:使用BUFMR驱动多个BUFR和BUFIO
在使用多个ISERDES/OSERDES时,例如源同步设计,如果它们不在同一个输入/输出区域,但在相邻同列的输入/输出区域,此时可行的一种时钟方案就是使用BUFMR驱动多个BUFR和BUFIO,借助BUFR的分频功能产生CLKDIV,如图2-10所示。
图2-10
如果设计中BUFIO不够用,此时可将BUFIO替换为BUFR,如图2-11所示。需要注意的是,连接到CLK端口的BUFR其分频因子(属性BUFR_DIVIDE)要设置为1,而不能设置为BYPASS(BUFR_DIVIDE为1~8时,对应的延迟特性是一致的,但与BYPASS对应的延迟特性不同),以保证CLK和CLKDIV相位一致。
图2-11
7系列FPGA的每个输入/输出区域包含4个高性能时钟HPC(High Performance Clocks),它们具有最低的抖动和最小的占空比失真。这4个时钟只能由同一时钟区域内MMCM的CLKOUT0~CLKOUT3驱动,且它们与同一时钟区域内的BUFIO和BUFR之间有专用布线资源,因此,在使用MMCM生成时钟驱动BUFIO/BUFR时,要确保使用的是CLKOUT0~CLKOUT3端口输出的时钟。
3.时钟管理单元
7系列FPGA最多可包含24个时钟管理带(CMT),位于时钟管理单元列,紧邻输入/输出列。每个时钟管理带由一个MMCM(Mixed-Mode Clock Manager)和一个PLL(Phase-Locked Loop)构成,可实现大范围的频率合成、抖动过滤和改善时钟偏移的功能。两者的输入/输出端口如图2-12所示。可以看到,相比于PLL,MMCM多了PSCLK、PSEN、PSINCDEC和PSDONE 4个与动态相位调整相关的端口,这表明当使用动态相位调整功能时,只能用MMCM,而不能用PLL;同时,MMCM的输出时钟端口有CLKOUT0~CLKOUT6,且CLKOUT0~CLKOUT3还有对应的反相时钟CLKOUT0B~CLKOUT3B,PLL只有CLKOUT0~CLKOUT5这6个输出时钟端口。
就频率合成而言,两者的工作原理是一样的。其内部均包含一个压控振荡器VCO (Voltage Controlled Oscillator),用于产生高频时钟。每个输出时钟端口都有分频器,VCO的输出经分频产生各自端口需要的时钟。例如,输入时钟为100MHz,输出时钟为400MHz,采用MMCM时,其配置参数如图2-13所示。图中CLKIN1_PERIOD等于10.000,意味着输入时钟周期为10ns,对应频率为100MHz;CLKFBOUT_MULT_F等于10.000,DIVCLK_DIVIDE等于1,表明VCO的频率为100x10/1,也就是1000MHz;端口CLKOUT0分频器的分频因子为2.500,故CLKOUT0输出频率为1000/2.5即400MHz。
图2-12
图2-13
如果使用PLL,其配置如图2-14所示。图2-14与图2-13中的参数含义是一致的。因此,不难得出PLL中的VCO频率为100×12/1即1200MHz,CLKOUT0的输出频率为1200/3即400MHz。
既然在这种情况下,MMCM和PLL都可生成目标时钟,那么两者是否完全等效呢?这里我们从生成时钟的性能角度看,如图2-15所示。图中Divide Counter对应参数DIVCLK_DIVIDE,Mult Counter对应参数CLKFBOUT_MULT。不难看出,PLL输出时钟的峰峰抖动(Pk-to-Pk Jitter)和相位误差(Phase Error)更小。这是因为此时PLL的VCO为1200MHz,而MMCM的VCO为1000MHz。
图2-14
图2-15
设计规则 4:在使用MMCM或PLL时,尽可能使VCO频率更高一些,这样输出时钟的抖动会更低一些,相位误差会更小一些。
图2-13和图2-14所示界面中的参数Clocking Wizard IP会自动计算得出,但这些参数也是可以手动进行修改的,如图2-16所示,只需要勾选图中方框所示选项即可。但需要注意,VCO的频率是有限制要求的。例如,对于Virtex-7 FPGA,速度等级为-1的芯片,VCO频率介于600~1200MHz;速度等级为-2的芯片,VCO频率介于600~1440MHz;速度等级为-3的芯片,VCO频率介于600~1600MHz。
图2-16
设计规则5:在使用MMCM或PLL时,尽可能通过Clocking Wizard IP的方式实例化,避免使用原语(Primitive)。因为原语中有很多参数需要手工填写,极易导致出错。
应用案例3:使用MMCM生成多个时钟
外部时钟为33MHz,需要通过此时钟生成6个时钟,其频率分别为528MHz、264MHz、176MHz、132MHz、66MHz和33MHz。MMCM的参数配置如图2-17和图2-18所示。从图2-17中可以看到,CLKFBOUT_MULT_F为32.000,DIVCLK_DIVIDE为1,故VCO频率为33×32/1即1056MHz。图2-19显示了6个输出时钟的基本性能指标。
图2-17
图2-18
图2-19
MMCM的CLKOUT0和CLKFBOUT端口对应的分频器可实现小数分频,分频因子的分辨率为0.125,而相应的PLL是不具备此功能的。
应用案例4:借助MMCM小数分频功能输出目标时钟
已知输入时钟为100MHz,现在需要生成320MHz和400MHz两个时钟。使用Clocking Wizard IP调用MMCM。在Output Clocks页面下,clk_out1(对应MMCM的CLKOUT0端口)输出频率填写320,clk_out2(对应MMCM的CLKOUT1端口)输出频率填写400,最终在Actual列显示实际值分别为320.00000和400.00000,达到了预期效果,如图2-20所示。此时,MMCM的参数配置情况如图2-21所示,由此可推断出VCO频率为800MHz。同时还可以看到,CLKOUT0端口的分频器其分频因子为2.500,CLKOUT1端口的分频器其分频因子为2。
图2-20
图2-21
如果将320和400的位置互换一下,如图2-22所示,可以看到在Actual列显示的实际输出值将分别变成400.00000和316.66667,与实际值不符。
图2-22
如果使用PLL,如图2-23所示,也无法达到预期效果。
图2-23
使用Clocking Wizard IP时,若勾选图2-24中的Phase Alignment,那么CLKFBOUT端口会连接BUFG,BUFG的输出会连接到CLKFBIN端口,如图2-25所示,从而使得标记①、④、⑥处的时钟相位一致,标记②、③、⑤处的时钟相位一致,但两组之间的相位是不同的。如果没有勾选Phase Alignment,那么CLKFBOUT会直接连接到CLKFBIN,所有输出端口(CLKOUT0~CLKOUT6)若使用了同类型的时钟缓冲器,则输出时钟相位一致,但与标记①、②处的相位不再一致。由此可见,选项Phase Alignment的作用是保证MMCM输出时钟与输入时钟相位一致。如果不需要此功能,MMCM反馈支路就不会插入BUFG,这样也可以节省一个BUFG。
图2-24
图2-25
在芯片选型阶段,可在Vivado下借助Tcl脚本查看指定芯片中的时钟资源分布情况,如Tcl代码2-1所示。只需要打开Vivado,在Tcl Console中执行此脚本即可。
Tcl代码2-1
2.1.2 UlatraScale/UltraScale+中的时钟资源
UltraScale基于20nm工艺制程,而UltraScale+基于16nm工艺制程。尽管两者工艺制程不同,但内部结构是一致的。若无特殊声明,下文阐述的UltraScale架构也适用于UltraScale+。
1.全局时钟引脚
在UltraScale中,每个输入/输出区域(I/O Bank)都位于单一的时钟区域CR(Clock Region)内,且都包含52个输入/输出引脚。在这52个引脚中,有4对(8个)全局时钟引脚GC(Global Clock I/O)。其使用方法与7系列FPGA是一致的。不同之处在于,这4对GC地位是等同的,不再有MRCC和SRCC之分。UltraScale+新增了高密度输入/输出区域(High Density I/O Bank,HD I/O Bank),位于此区域内的全局时钟引脚HDGC只能通过BUFGCE连接至MMCM或PLL。
设计规则6:使用UltraScale+时,如果外部时钟需要借助MMCM生成新的时钟,应避免外部时钟由HDGC进入;如果只能由HDGC进入,则需要将属性CLOCK_DEDICATED_ROUTE的值设置为FALSE。
2.时钟缓冲器
7系列FPGA既包含全局时钟缓冲器,又包含区域时钟缓冲器。UltraScale简化了时钟缓冲器,即只有全局时钟缓冲器。包含输入/输出列的时钟区域内有24个BUFGCE、4个BUFGCE_DIV和8个BUFGCTRL,但同时只能使用其中的24个,如图2-26所示。
图2-26
这些全局时钟缓冲器位于时钟列,可驱动水平时钟布线/分发轨道和垂直时钟布线/分发轨道,其中分发轨道是7系列FPGA所没有的。这些轨道均位于时钟区域的中心位置,如图2-27所示(有的芯片只有一侧会有高速收发器)。不难看出,每个时钟区域的宽度相比于7系列FPGA有所缩减,不再是半个芯片的宽度,高度由7系列中的50个CLB变为60个CLB。时钟区域的粒度更加细化。无论是水平时钟布线/分发轨道还是垂直时钟布线/分发轨道,都是以时钟区域作为边界,这意味着如果某个时钟区域内的资源未使用时钟,工具就会关闭相应的轨道,从而节省功耗。布线轨道可驱动相邻时钟区域内的布线轨道和分发轨道,但分发轨道只能驱动相邻时钟区域内的水平分发轨道。布线轨道的作用是将时钟从全局时钟缓冲器布线到某个中心点。在这个中心点,时钟经分发轨道连接到其负载的时钟端口。分发轨道可进一步移动这个点以改善时钟的局部偏移。这个点称为时钟根节点(Clock Root)。
图2-27
每个时钟区域有24个水平时钟布线/分发轨道和24个垂直时钟布线/分发轨道。在水平时钟分发轨道上有32个BUFCE_LEAF,称为叶时钟缓冲器。时钟从水平时钟分发轨道上下来之后,经BUFCE_LEAF到达逻辑资源的时钟端口,如图2-28所示。BUFCE_LEAF只能由Vivado自动使用,而不能在代码中实例化。
图2-28
进一步理解水平时钟布线/分发轨道和垂直时钟布线/分发轨道,如图2-29所示。图中有两个时钟网络,左侧的时钟网络其根节点在时钟区域X0Y2,右侧的时钟网络其根节点在时钟区域X4Y1。换言之,时钟根节点其实就是时钟负载在芯片中布局的中心位置,其值为时钟区域。
图2-29
UltraScale有独立的BUFGCE,无须通过BUFGCTRL配置而成。但BUFGCTRL仍是可配置的,例如,BUFGCE_1、BUFGMUX和BUFGMUX_1都是通过BUFGCTRL配置生成的。BUFGCE_DIV取代了BUFR,但比BUFR具有更强大的驱动能力,因为它已成为全局时钟缓冲器。同时,BUFGCE_DIV还具有分频功能,分频因子可以是1~8(包含1和8)之间的整数。只是当分频因子为奇数时,输出时钟的占空比将不再是50%。UltraScale新增了BUFG_GT。BUFG_GT只可以由高速收发器或RFSoC中的ADC/DAC模块驱动。BUFG_GT_SYNC是BUFG_GT的同步器,当Vivado推断出BUFG_GT时会自动在设计中插入BUFG_GT_SYNC。和BUFGCE_DIV类似,BUFG_GT也具有分频功能,可用的分频因子为1~8(包含1和8)之间的整数。分频因子由DIV端口输入。DIV位宽为3,当其为3'b000时,对应分频因子为1。在包含高速收发器的时钟区域内有24个BUFG_GT。在Zynq UltraScale+MPSoC中新增了一种全局时钟缓冲器BUFG_PS(Zynq 7000系列FPGA中是没有的)。该缓冲器位于内部ARM处理器的旁边。PS侧的输出时钟需经此缓冲器访问PL(Programmatic Logic)侧的时钟布线资源,从而驱动PL侧的逻辑资源。BUFG_PS的个数因不同的芯片而异。例如,ZU4EG有96个BUFG_PS,而ZU2CG有72个BUFG_PS。可借助Tcl代码2-2查看芯片中BUFG_PS的个数和位置。
Tcl代码2-2
设计规则7:应由Vivado自动决定设计中全局时钟缓冲器的位置,尽量避免通过约束的方式进行干预。若需要指定设计中某些全局时钟缓冲器的位置,应使用属性CLOCK_REGION,而不要使用属性LOC。CLOCK_REGION的使用方法如Tcl代码2-3所示。
Tcl代码2-3
3.时钟管理单元
和7系列FPGA一样,时钟管理单元位于CMT内。不同的是UltraScale的每个CMT内包含1个MMCM和2个PLL。就MMCM而言,其功能和7系列FPGA中的MMCM保持一致,在此基础上新增了一个特性:动态调整CLKOUT0~CLKOUT6端口的分频因子时无须复位。就PLL而言,其功能和7系列FPGA中的PLL相比更加专一,即UltraScale中的PLL主要用于给外部存储器接口逻辑提供时钟;同时,与MMCM相比,不具备改善时钟偏移和动态相位调整的功能。图2-30显示了MMCM和PLL的输入/输出端口,不难看出,PLL的输出时钟个数与7系列FPGA相比明显减少。
图2-30
可借助Tcl代码2-4分析UltraScale/UltraScale+芯片中的时钟资源,打开Vivado,在Tcl Console中执行此脚本即可。
Tcl代码2-4
2.1.3 Versal ACAP中的时钟资源
1.全局时钟引脚
Versal基于7nm工艺制程,与UltraScale一样,其内部被分割为矩阵形式的时钟区域(Clock Region,CR)。不同的是,每个CR的高度由60个CLB变为96个CLB,同时,Versal中的CR还分为满CR(高度为96个CLB)和半CR(高度为48个CLB)。
Versal中的全局时钟布线轨道和分发轨道既有水平方向的也有垂直方向的,且都是以时钟区域为边界的。对于满CR,水平时钟布线和分发轨道位于CR水平方向的中心位置,对于半CR,则位于CR的底部。垂直时钟布线和分发轨道则位于两个背靠背CR的临界处,如图2-31所示。
图2-31
Versal有两种输入/输出区域,分别是高性能输入/输出区域(XPIO Bank)和高密度输入/输出区域(HDIO Bank)。XPIO主要用于实现高性能接口,支持的电平范围为1.0~1.5V,同时硬核存储单元控制器也在其中;HDIO可实现的接口速率较XPIO会低一些,可支持的电平范围为1.8~3.3V。XPIO和HDIO支持的电平标准是没有重叠的。每个XPIO有54个引脚,其中有4对(8个)全局时钟引脚GCIO;每个 HDIO有24个引脚,其中有2对(4个)全局时钟引脚HDGC。这些全局时钟引脚的用法与UltraScale中的保持一致。
2.时钟缓冲器
与UltraScale一样,Versal中的时钟缓冲器均为全局时钟缓冲器。在XPIO对应的CR中,每个CR有24个BUFGCE、8个BUFGCTRL和4个BUFGCE_DIV,但同时只能使用其中的24个;在HDIO对应的CR中,每个CR只有4个BUFGCE。紧邻高速收发器的CR会分布一些BUFG_GT,紧邻PS的CR会分布一些BUFG_PS。这些时钟缓冲器的功能和UltraScale中的保持一致。Versal中还新增了一种全局时钟缓冲器BUFG_FABRIC,紧邻垂直方向的NoC(Network on Chip)。时钟缓冲器在芯片中的分布情况如图2-32所示,同时还可借助Tcl代码2-5进行分析。
设计规则 8:尽管BUFG_FABRIC是全局时钟缓冲器,但仅用于驱动设计中的高扇出网线,而不能用于驱动时钟信号。
图2-32
Tcl代码2-5
在Versal中也有叶时钟缓冲器BUFDIV_LEAF,取代了UltraScale中的BUFCE_LEAF,其功能更加丰富,支持静态分频(分频因子由属性BUFLEAF_DIVIDE确定,一旦设定不可动态更改),可支持的分频因子为1、2、4和8。借助BUFDIV_LEAF,可形成5种MBUFG(Multi-Clock Buffer):
MBUFGCTRL(BUFGCTRL+BUFDIV_LEAF)
MBUFGCE(BUFGCE+BUFDIV_LEAF)
MBUFGCE_DIV(BUFGCE_DIV+BUFDIV_LEAF)
MBUFG_PS(BUFG_PS+BUFDIV_LEAF)
MBUFG_GT(BUFG_GT+BUFDIV_LEAF)
由此可见,MBUFG并非物理存在,而是逻辑存在。MBUFG有4个输出端口O1~O4,两种工作模式,由模式控制字MODE设定。MODE与输出时钟频率的关系如表2-1所示,其中FIN为MBUFG的输入时钟频率。
表2-1
3.时钟管理单元
Versal中的时钟管理单元带分三种:只有1个XPLL;有1个MMCM和1个DPLL;只有1个DPLL。MMCM的功能和UltraScale中的保持一致,即在模拟锁相环的基础上增加了通用时钟功能。XPLL是Versal中新增的时钟管理单元,其主要功能是给XPHY提供时钟,故其时钟输出个数会比MMCM少一些。DPLL是数字锁相环,可看作轻量版的MMCM。三者的端口如图2-33所示。
XPLL位于XPIO内。每个XPIO内有2个XPLL。MMCM和DPLL分布在紧邻XPIO的水平时钟布线和分发轨道上,与其在同一时钟区域内的全局时钟引脚可直接连接至这些位置上的MMCM和DPLL。同时,在紧邻高速收发器的时钟区域内还分布了一些DPLL,位于HDIO的全局时引管脚可与之直接连接,但如果需要连接XPIO的MMCM,就需要先将其连接到BUFGCE上,再由BUFGCE的输出连接至MMCM。XPLL、MMCM和DPLL的分布状况也可查看图2-32。借助 Tcl代码2-6可查看指定芯片中的时钟管理单元。
图2-33
Tcl代码2-6
从28nm工艺制程的7系列FPGA到20nm的UltraScale/16nm的UltraScale+,再到7nm工艺制程的Versal ACAP,芯片架构发生了很大的变化。表2-2从时钟资源的角度对三者进行了对比。可以看到,时钟区域的规模越来越大,时钟缓冲器趋向单一。
表2-2
续表