Intel® Quartus® Prime Pro Edition用户指南: Timing Analyzer

ID 683243
日期 4/13/2020
Public

本文档可提供新的版本。客户应 单击此处 前往查看最新版本。

文档目录

2.2.5.5.3. set_clock_groups约束技巧

使用derive_pll_clocks创建时钟时,确定要包含在set_clock_groups约束中的所有时钟名称可能非常耗时。然而,即便您不知道所有的时钟名称,也可以使用以下技巧在某种程度上自动创建时钟约束。

  1. 创建一个包含建议的初始SDC约束的基本.sdc文件,除非现在省略set_clock_groups约束。
  2. .sdc添加到工程中,点击Assignments > Settings > Timing Analyzer。在SDC files to include in the project下指定.sdc文件。
  3. 要运行Timing Analyzer,点击Tools > Timing Analyzer
  4. Task窗格中,双击Report Clocks。Timing Analyzer读取您的.sdc,应用约束(包含derive_pll_clocks)和报告所有时钟。
  5. 从Clocks Summary报告中,复制第一列中的所有时钟名称。此报告以正确的格式列出时钟名称 ,以便在Timing Analyzer中进行识别。
  6. 打开.sdc文件,将时钟名称粘贴到文件中,每行一个时钟名称。
  7. 通过将时钟名称剪切并粘贴到相应组中,将时钟名称列表格式化为set_clock_groups命令。接下来,将以下模板粘贴到.sdc文件中:
    set_clock_groups -asynchronous -group { \  
    } \
     -group { \ 
    } \  
    -group  { \
    } \ 
    -group { \
    } 
  8. 将时钟名称剪切并粘贴到组中以定义它们的关系,根据需要添加或删除组。对组进行格式化以使代码可读。
    注: 此命令在一行中很难读取。您可以使用Tcl行继续字符“\”来使其更具可读性。在最后一个字符后面放置一个空格,然后将“\”字符放在该行的末尾。此字符会转义,请注意不要在转义字符后包含任何空格,否则空格将成为转义字符,而不是行尾字符。
    set_clock_groups -asynchronous \  
        -group {adc_clk \ 
           the_adc_pll|altpll_component_autogenerated|pll|clk[0] \
           the_adc_pll|altpll_component_autogenerated|pll|clk[1] \
           the_adc_pll|altpll_component_autogenerated|pll|clk[2] \
        } \
        -group {sys_clk \ 
           the_system_pll|altpll_component_autogenerated|pll|clk[0] \
           the_system_pll|altpll_component_autogenerated|pll|clk[1] \
        } \  
        -group {the_system_pll|altpll_component_autogenerated|pll|clk[2] \
        }
注: 最后一组有一个PLL输出 system_pll|..|clk[2],而输入时钟和其他PLL输出位于不同的组中。如果使用PLL,并且输入时钟频率与PLL输出的频率无关,那么必须异步地处理PLL。通常情况下,PLL的大多数输出都相关,并在同一组中,但这不是必需的。

对于包含复杂时钟的设计,创建时钟组可能是一个迭代过程。例如,包含两个DDR3内核和高速收发器的设计可以有三十个或更多的时钟。在这种情况下,首先添加手动创建的时钟。由于Timing Analyzer假定命令中没有出现的时钟与每个时钟有关,因此保守地将已知时钟分组。如果设计中无关的时钟域之间仍有故障路径,那么可以根据需要开始添加新的时钟域。在这种情况下,set_clock_groups命令中没有大量的时钟,因为它们要么在.sdc文件中被剪切用于IP内核(例如DDR3内核生成的.sdc文件),要么只连接到相关时钟域。

对于许多设计来说,这就是限制内核所必需的。本节未详细描述的一些常见内核约束是:

  • 在寄存器之间添加多周期,以比默认分析更慢的速率进行分析,从而增加了读取数据的时间。例如,10 ns时钟周期具有10 ns的设置关系。如果数据以较慢的速率变化,或者由于时钟使能,寄存器以较慢的速率切换,那么可以应用一个多周期来放宽(relax)设置关系(打开窗口以便效数据可以通过)。这是时钟周期的倍数,使设置关系为20 ns,40 ns等,同时保持保持关系(hold relationship)为0 ns。通常将这些类型的多周期应用于路径。
  • 当想要推进读取数据的周期时,也可以使用多周期,转移时序窗口。这种情况通常出现在您的设计在一个时钟上执行较小的相移时。例如,如果您的设计有两个10 ns时钟退出PLL,但第二个时钟有一个0.5 ns相移,那么从主时钟到相移时钟的默认设置关系为0.5 ns,保持关系为- 9.5 ns。满足0.5 ns的设置关系几乎是不可能的,并且您很可能会在下一个窗口中传输数据。通过从主时钟向相移时钟添加一个多周期,设置关系变为10.5 ns,保持关系变为0.5 ns。通常在时钟之间应用这一多周期。
  • create_generated_clock添加到纹波时钟。当一个寄存器的输出驱动另一个寄存器的clk端口时,这就是纹波时钟。时钟不通过寄存器传播,因此必须将create_generated_clock约束应用于所有纹波时钟以进行正确分析。Report Unconstrained Paths报告中显示无约束纹波时钟,因此您可以轻松识别它们。通常情况下要避免使用纹波时钟,改用时钟使能。
  • create_generated_clock添加到时钟多路复用输出(clock mux outputs)。在没有这个时钟的情况下,所有时钟都通过多路复用器传播并且是相关的。Timing Analyzer分析多路复用器下游的路径,其中一个时钟输入驱动源寄存器,另一个时钟输入驱动目的寄存器,反之亦然。虽然此行为可能有效,但这通常不是您想要的行为。通过在多路复用器输出上应用create_generated_clock约束(将它们与进入多路复用器的时钟相关联),可以将这些时钟与其他时钟正确分组。