时钟扩展对使用赛灵思Vivado设计套件的工程师来说是一个很大的挑战,但不是一个不可逾越的障碍。
 

随着越来越多的赛灵思用户开始使用Vivado设计套件,部分用户对未扩展时钟表示困惑。那么什么是未扩展时钟呢?他们是如何进行关联和计时的?应对未扩展时钟的标准方法又是什么呢?下面让我们来详细探讨一下这个问题,重点是探讨确保设计人员使用正确的同步技术安全地穿越未扩展时钟之间的跨时钟域(clock domain crossing)的方法。


随着Vivado工具的推出,赛灵思现在能够支持采用业界标准Synopsys设计约束(SDC)格式的时序约束。这是ISE设计套件工具处理时序方式上的重大转变。Vivado套件最根本的区别在于所有时钟在默认条件下都彼此关联。这样在ISE中处于无约束状态的时序路径在Vivado设计套件中则处于受约束状态。如果两个时钟之间不存在周期性关系,这种约束会造成非常严格的时序要求。


未扩展时钟是指在1,000个时钟周期内与另一个时钟之间不存在周期性关系的时钟。Vivado BFT内核范例设计即是体现未扩展时钟工作方式的良好途径。


发起和捕获


时序路径从发起事件开始,由捕获事件终止。发起事件发生在同步单元的时钟从非工作状态转入工作状态的时候。捕获事件发生在下游的或者负责捕获的同步单元的时钟从非工作状态转入工作状态的时候。从发起事件到捕获事件之间所需的时间被称为“路径要求”,它代表自事件发起后到捕获单元引脚处出现有效数据之间所需的时间。


如果发起时钟和捕获时钟同时位于同一物理时钟网中,路径要求仅指时钟周期。以250MHz时钟为例,如果发起单元和捕获单元的工作沿相同(上升沿对上升沿或下降沿对下降沿),那么发起事件和捕获事件之间的时间间隔则恰好为4纳秒。如果发起单元和捕获单元的工作沿不同,路径就必须按一半的时钟频率进行时间计算。这就是时钟的上升沿对下降沿或下降沿对上升沿转换的情况,对一个250MHz的时钟来说,对应的就是2纳秒的路径要求。


在时钟源(source clock)和时钟目标端(destination clock)非同一个时钟的情况下,时序问题就变得更加复杂。具有不同时钟源和时钟目标端的时序路径被称为跨时钟域(CDC)路径。

图1:扩展时钟的TCL脚本


如果发起时钟和捕获时钟之间的相位关系未知,就无法计算路径要求。由于不确定相位关系,则无法准确确定路径时序。不安全时钟在Vivado设计套件生成的时钟交互报告中会突出显示。在发起时钟和捕获时钟之间的相位关系已知的情况下,只要两个时钟之间存在周期性关系,就可以用数学方法推导出路径要求。用于判断给定发起时钟和捕获时钟之间最低路径要求的方法称为时钟扩展。不过确定两个时钟之间是否存在周期性关系需要用实际限制加以约束,因为一般情况下两个不同时钟之间不存在共同的周期性特征。Vivado设计套件使用的实际限制条件是1,000个时钟周期,以两个时钟中较小的时钟周期为测量标准。如果在扩展两个时钟到超过1,000个时钟周期后没出现周期性关系,那么这两个时钟就被称为“未扩展”时钟。Vivado设计套件对两个未扩展时钟之间的路径要求为发起时钟和捕获时钟相邻工作沿之间相隔的最少时间。但需要注意的是对超过1,000个时钟周期的情况有更加严格的路径要求,这就是Vivado设计套件将这种类型的两个时钟之间的关系称之为未扩展的原因。

图2:125MHz和156.25MHz时钟的时钟扩展

 

Vivado BFT内核可为测试不同时钟速率提供理想设置,从而判定两个时钟是否为扩展时钟


为更好地理解Vivado设计套件计算未扩展时钟的方法,先以图1中的TCL脚本来对扩展任意两个时钟速率之间的上升沿对上升沿路径要求的方法进行详细说明。图2是这个脚本的输出,即两个分别运行在125MHz和156.25MHz的时钟的扩展。


为确认上述TCL脚本得出的结果,我们来观察一下Vivado BFT内核范例设计。BFT内核可为测试不同时钟速率提供理想设置,从而判定两个时钟是否为扩展时钟。该内核有两个独立的时钟源,分别命名为wbClk和bftClk。时序约束可将wbClk和bftClk的频率分别设置为100MHz和200MHz。用户可可对任意两个时钟速率的此类约束进行修改,以便确定由Vivado时序引擎判别的扩展关系。图3是将bftClk设置为125MHz,将wbClk设置为156.25MHz时所显示的结果,并提供了相关的时序(report_timing –from [get_clocks bftClk] -to [get_clocks wbClk])。请注意,由发起沿、捕获沿和时序要求共同确认TCL脚本的预测结果。


表1是使用图4中的TCL脚本获得的几种时钟速率的发起沿、捕获沿和路径要求。


图3:125MHz发起时钟到156.25MHz捕获时钟的时钟扩展

 

表1:时钟扩展实例


 

图4:时钟扩展Tcl脚本


处理未扩展时钟


人们常常把未扩展时钟视为异步时钟,并通过FIFO、边沿检测器或同步器电路等适当的同步技巧来进行处理。如果用户使用此类技巧,应在约束中使用时序例外来处理未扩展时钟(一般使用set_false_path或set_max_delay例外)。


理解和说明未扩展时钟具有重要的意义,因为时钟之间的边沿关系将决定Vivado设计套件中时序引擎所使用的路径要求。赛灵思希望对设计中的所有未扩展时钟进行详查,以确保使用适当的同步技巧安全地穿越未扩展时钟之间的跨时钟域。