6.1 About CDC Constraints
跨时钟域(CDC)约束适用于具有不同发射和捕获时钟的时序路径。根据发射和捕获时钟的关系以及在CDC路径上设置的时序异常,有同步CDC和异步CDC。例如,同步时钟之间但被错误路径约束覆盖的CDC路径不定时,因此被视为异步CDC。
异步CDC路径可以是安全的,也可以是不安全的。异步CDC路径的安全和不安全术语与用于时钟间时序分析的术语不同(请参见report_clock_interaction)。当异步CDC路径使用同步电路来防止捕获时序单元的亚稳态时,它被认为是安全的。
有关更多信息,请参阅Vivado Design Suite User Guide: Design Analysis and Closure Techniques (UG906)。
CDC路径的时序分析可以通过使用set_false_path或set_clock_groups约束来完全忽略,或者通过使用set_max_delay-datapath_only来部分分析。
此外,可以使用set_bus_skew约束来约束多位CDC路径捕获时间扩展。
6.2 Constraining Bus Skew
6.2.1 About Bus Skew Constraints
总线偏斜约束用于设置几个异步CDC路径之间的最大偏斜要求。总线偏斜不是与时序路径相关联的传统时钟偏斜。相反,它对应于由相同的set_bus_skew约束覆盖的所有路径上的最大捕获时间差。总线偏斜要求适用于快速和慢速转换区域,但不在转换区域进行分析。
总线偏斜约束的目的是限制可以发射数据并由单个目的时钟边沿捕获的源时钟边沿的数量。容差取决于用于受约束路径的CDC同步方案。总线偏斜约束通常用于以下CDC拓扑:
•格雷码总线传输,例如在异步FIFO中
•使用CE、MUX或MUX Hold电路实现的多位CDC
•配置寄存器
尽管set_bus_skew命令不能阻止在安全定时同步CDC上设置总线偏斜约束,但不需要这样的约束。setup和hold检查已经确保了两个安全定时同步CDC路径之间的安全传输。总线偏斜约束的CDC场景为:
•由set_clock_groups覆盖的异步CDC
•异步CDC完全覆盖了set_false_path和/或set_max_delay - datapath_only
•由set_false_path和/或set_max_delay - datapath_only覆盖的同步CDC路径
总线偏斜约束不是时序例外;相反,这是一个时间断言。因此,它不会干扰时序异常(set_clock_group、set_false_path、set_max_delay、set_max_delay-datapath_only和set_multycle_path)及其优先级。
总线偏斜约束仅通过route_design命令进行优化。要报告set_bus_skew约束,请从命令行使用report_bus_skew命令,或从GUI界面使用Reports → Timing → Report Bus Skew 。时序摘要报告(report_Timing_Summary)中未报告总线偏斜约束。
6.2.2 Syntax of the set_bus_skew Command
带有基本选项的set_bus_skew命令的语法为:
set_bus_skew [-from <args>] [-to <args>] [-through <args>] <value>
-from选项的对象列表应该是有效起点的列表。set_bus_skew的有效起始点是时钟,或者是诸如寄存器或RAM之类的时序元件的时钟引脚。set_bus_skew不支持输入(或输入输出)端口。
-to选项的节点列表应该是有效端点的列表。set_bus_skew的有效端点是时钟或顺序单元的数据引脚。set_bus_skew不支持输出(或inout)端口。
through选项的节点列表应该是有效引脚或网络的列表。尽管-from和-to命令行选项可以引用时钟,但Xilinx建议您更加具体,并为每个约束指定一个有限的起点和终点列表。这将确保每个约束不会覆盖太多路径,并且可以合理地满足每个约束。
注意:在指定总线偏斜约束时,必须同时指定-from和-to选项。
注意:Xilinx建议在没有扇出的路径上设置总线偏斜约束。
此外,每个总线偏斜约束必须覆盖至少两个起点和两个端点。总线偏斜值必须现实合理。Xilinx建议使用一个大于源和目标时钟最小周期一半的值。总线偏斜的推荐值也取决于CDC拓扑结构,如以下示例所示。
6.2.2.1 set_bus_skew Example One
在本例中,CDC是握手机制的一部分。当数据可用于采样时,源时钟域生成发送信号。目标时钟域对发送信号使用4级同步器。在4级同步器之后,该信号驱动CDC目标寄存器的时钟使能引脚。在这种时钟使能控制CDC结构中,总线偏斜必须调整到CE路径上的级数,因为它表示数据有效的目的地时钟周期的数量。
如果源时钟周期为5ns,目标时钟周期为2.5ns,则CDC路径上的总线偏斜应设置为10ns(4×2.5ns)。
set_bus_skew -from [get_cells src_hsdata_ff_reg*] -to [get_cells
dest_hsdata_ff_reg*] 10.000
注意:为了完整性,CDC需要额外的set_max_delay约束,以确保源寄存器和目标寄存器不会放置得太远:
set_max_delay -datapath_only -from [get_cells src_hsdata_ff_reg*] -to
[get_cells dest_hsdata_ff_reg*] 10.000
6.2.2.2 set_bus_skew Example Two
在这个例子中,CDC是格雷编码总线。系统必须确保目标时钟域同时只捕获格雷码总线的一个转换。如果源时钟周期为5ns,而目的时钟周期为2.5ns,则CDC路径上的总线偏斜应设置为2.5ns(目的时钟周期)。
set_bus_skew -from [get_cells src_gray_ff_reg*] -to [get_cells
{dest_graysync_ff_reg[0]*}] 2.500
set_max_delay -datapath_only -from [get_cells src_gray_ff_reg*] -to
[get_cells
{dest_graysync_ff_reg[0]*}] 5.000
注意:为了完整性,CDC需要额外的set_max_delay约束,以确保源寄存器和目标寄存器不会放置得太远。这种情况下,最大延迟被设置为源时钟周期,因为CDC在较慢的时钟和较快的时钟之间,并且目标时钟域应该只捕获总线的一个转换:
set_max_delay -datapath_only -from [get_cells src_gray_ff_reg*] -to
[get_cells
{dest_graysync_ff_reg[0]*}] 5.000
6.2.3Set Bus Skew Dialog Box
在Vivado®IDE中,可以通过多种方式设置总线偏斜约束:
(1)通过 Timing Constraints Editor。选择Window → Timing Constraint → Assertion →
Set Bus Skew.
从“ Timing Constraints Editor”中,可以添加、删除或修改总线扭曲偏斜。注意:无法编辑锁定的IP总线偏斜约束。
(2)通过Through the Report CDC GUI.选择 Reports → Timing → Report CDC.
在“CDC Details”表中,必须选择一行或多行,以至少包括两个或多个起点和两个或更多个端点。右键单击并选择“Set Bus Skew”时,有两个选项:
•起点到终点:在所选行中包括的起点和终点之间设置总线偏斜约束。
•源时钟到目标时钟:在起点和终点的时钟域之间设置总线偏斜约束。
注意:通常不建议在时钟域之间设置总线偏斜约束,因为它将应用于比需要更多的路径。这将导致更长的实现运行时间和不可能的时序收敛。
注意:Vivado不会验证在选定对象上设置总线偏斜约束的有效性。必须确保总线扭曲约束对选定对象有意义。在“ Set Bus Skew ”对话框中,可以设置总线偏斜值、起点和终点,如下图所示。