vivado xdc约束基础知识13:Vivado使用误区与进阶——如何读懂用好 Timing Report?

来自:http://www.eetrend.com/node/100057258

 

《XDC约束技巧》系列中讨论了XDC约束的设置方法、约束思路和一些容易混淆的地方。我们提到过 约束是为了设计服务,写入Vivado中的XDC实际上就是用户设定的目标 ,Vivado对FPGA设计的实现过程必须以满足XDC中的约束为目标来进行。那么:

  • 如何验证实现后的设计有没有满足时序要求?
  • 如何在开始布局布线前判断某些约束有没有成功设置?
  • 如何验证约束的优先级?
  • 这些都需要用到Vivado中的静态时序分析工具。所以让我们来从如何读懂和用好Timing Report开始吧。 静态时序分析 静态时序分析( Static Timing Analysis)简称STA,采用穷尽的分析方法来提取出整个电路存在的所有时序路径,计算信号在这些路径上的传播延时,检查信号的建立和保持时间是否满足时序要求,通过对最大路径延时和最小路径延时的分析,找出违背时序约束的错误并报告。 STA不需要输入向量就能穷尽所有的路径,且运行速度很快、占用内存较少、覆盖率极高,不仅可以对芯片设计进行全面的时序功能检查,而且还可利用时序分析的结果来优化设计。所以STA不仅是数字集成电路设计Timing Sign-off的必备手段,也越来越多地被用到设计的验证调试工作中。 STA在FPGA设计中也一样重要,但不同于一般数字集成电路的设计,FPGA设计中的静态时序分析工具一般都整合在芯片厂商提供的实现工具中。在Vivado中甚至没有一个独立的界面,而是通过几个特定的时序报告命令来实现。 OCV与PVT 即便是同一种FF,在同一个芯片上不同操作条件下的延时都不尽相同,我们称这种现象为OCV(on-chip variation)。OCV表示的是芯片内部的时序偏差,虽然很细小,但是也必须严格考虑到时序分析中去。 产生OCV的原因主要有PVT(Process / Voltage / Temperature)三个方面,而STA要做的就是针对不同工艺角(Process Corner)下特定的时序模型来分析时序路径,从而保证设计在任何条件下都能满足时序要求,可以正常工作。 通常PVT对芯片性能的影响如下图所示,

    不同的PVT条件组成了不同的corner,另外在数字电路设计中还要考虑RC corner的影响,排列组合后就可能有超过十种的corner要分析。但是在FPGA设计中的静态时序分析一般仅考虑Best Case和Worst Case,也称作Fast Process Corner 和Slow Process Corner,分别对应极端的PVT条件。

    Multi-Corner Vivado中的STA支持多角时序分析(Multi-Corner Timing Analysis),会对以上两种corner下的时序同时进行分析,然后报告最差的情况。因为每个corner下的延时也会有一定的变化范围,所以时序分析还会考虑每种corner下的最大延时和最小延时。

    如果一个设计在Best Case和Worst Case下都能满足时序要求,则可以推算这个设计在其允许的任何操作条件下都能保持正常工作。 这里要提醒大家,不要被corner的名字误导,实际上,同样一条路径可能在Slow Corner中满足时序却在Fast Corner中有时序违例。但是你在Vivado中看到的时序报告只会显示其对两种corner并行分析后选出的最差情况。

    有特殊需要的情况下,可以在Vivado中通过config_timing_corners -corner -delay_type 来选择将某种corner应用于setup和/或hold的分析。在Report Timing Summary 和Report Timing的图形化界面也可以通过Timer Setting对corner做调整,具体界面详见稍后描述。 这样最大化考虑OCV的时序分析方法在处理同一条路径的共同时钟路径时也会应用不同的延时数据,从而会得出更为悲观的数据。为了真实反映路径延时情况,这部分延时必须被纠正,这就是CRPR(Clock Reconvergence Pessimism Removal)。 仔细观察时序报告便可以发现在报告路径的Slack之前有一行显示clock pessimism已经被考虑在内,在进行Setup Check时会加上一定的clock pessimism,而Hold Check时则会减去一定的clock pessimism。 下图显示了CRPR的来源以及在Vivado时序报告中的具体体现。

    时序命令与报告 Vivado中用于时序分析的命令主要有以下两条,且都有对应的图形化设置界面。
  • report_timing_summary 主要用于实现后的timing sigh-off
  • report_timing 主要用于交互式的约束验证以及更细致具体的时序报告与分析
  • report_timing_summary 我们先看看report_timing_summary ,实际上,不仅在布局布线后,在综合后甚至是更具体的实现过程中的每一小步之后都可以运行,从而得到一个全局的时序报告。 在Vivado IDE中点击Report Timing Summary后可以改变报告的内容,例如每个时钟域报告的路径条数,是否setup和hold全都报告等等。每改变一个选项都可以看到窗口下方的Command一栏显示出对应的Tcl命令。修改完设置后可以直接按OK键确认执行,也可以拷贝Command栏显示的命令到Tcl脚本中稍后执行。

    这里有个小窍门,通过-name 指定一个名字,就可以在Vivado IDE中新开一个窗口显示这条命令的执行结果,这个窗口还可以用来跟其他诸如Device View或是Schematic View等窗口之间cross probing。这一点也同样适用于包括report_timing 在内的绝大部分Vivado中的report命令。 在设置窗口中还有Timer Settings一栏(report_timing中也有),可以用来改变报告时采用的具体corner、速度等级以及计算布线延时的方式。很多时候我们可以借助Timer的设置来快速验证和调试设计需求。

    举例来说,在实现后的报告中显示时序违例比较严重,我们可以直接在Timer设置中改变速度等级后重新报告时序,来验证把当前这个已经布局布线完毕的设计切换到更快一档的芯片中是否可以满足时序要求。 另外,在布局布线后的设计上报告时序,往往不能更直观地发现那些扇出较大或是逻辑级数较高的路径。此时我们可以修改连线模型为estimated,报告出布局后布线前的时序而无需另外打开对应阶段的 DCP并重新运行时序报告命令来操作,这么做节约时间的同时,也更容易找到那些高扇出路径以及由于布局不佳而导致的时序违例。我们也可以修改连线模型为none,这样可以快速报告出那些逻辑延时较大以及逻辑级数较高的路径。以上这些改变Timer设置的方法可以帮助我们快速定位设计中可能存在的问题和缺陷。 report_timing_summary实际上隐含了report_timing、report_clocks 、check_timing 以及部分的report_clock_interaction命令,所以我们最终看到的报告中也包含了这几部分的内容。另外自Vivado 2014.3版起,打开实现后的结果时会直接打开一个预先产生好的报告。

    Timing Summary报告把路径按照时钟域分类,每个组别下缺省会报告Setup、Hold以及Pulse Width检查最差的各10条路径,还可以看到每条路径的具体延时报告,并支持与Device View、Schematic View等窗口之间的交互。 每条路径具体的报告会分为Summary、Source Clock Path、Data Path和Destination Clock Path几部分,详细报告每部分的逻辑延时与连线延时。用户首先要关注的就是Summary中的几部分内容,发现问题后再根据具体情况来检查详细的延时数据。其中,Slack显示路径是否有时序违例,Source和Destination显示源驱动时钟和目的驱动时钟及其时钟频率, Requirement显示这条路径的时序要求是多少,Data Path显示数据路径上的延时,Logic Level显示这条路径的逻辑级数,而Clock Path Skew和 Clock Uncertainty则显示时钟路径上的不确定性。

    以上图这条路径来举例,通过Summary我们可以得到这样的信息:这是一条clk时钟域内的路径,时钟周期为3.125ns,这条路径有0.268ns的时序违例。违例的主要原因是逻辑级数较高导致的数据链路延时较大,但连线延时的比例也较高,所以可以仔细看看这条路径的数据路径上有没有可能改进布局、降低扇出或者是减少逻辑级数的优化方向。 report_timing report_timing是更具体的时序报告命令,经常用来报告某一条或是某些共享特定节点的路径。用户可以在设计的任何阶段使用report_timing,甚至是一边设置XDC,一边用其来验证约束的可行性与优先级。在Vivado IDE中可以由Tools > Timing > Report Timing 调出其图形化设置窗口。 与report_timing_summary类似,调整选项后对应的Tcl命令也会在Command栏生成,在Targets一栏还可以设置需要报告路径的起始点/途经点/结束点,可以三个都设置或是仅设置其中任何一项,每一项都支持通配符匹配甚至是正则表达式查找。report_timing报告出的路径延时与report_timing_summary中具体到每根路径上的报告一致,可以以此为依据帮助我们定位时序失败的原因。

    用report_timing来报告时序其实还有一些更常见的应用场景,用来帮助我们设置和验证约束,尤其是那些时序例外约束。 举例来说,在设计过程中我们约束了一条或数条多周期约束,不同于UCF必须读入约束后重跑设计,我们可以直接在Tcl Console中输入这条XDC,无需重跑设计,直接用report_timing来验证。在随之显示的时序报告Summary部分可以看到Timing Exception后列出这条路径被设置了怎样的时序例外约束(注意,不加额外option时,以下两条命令都仅针对setup check )。

    单纯的一条多周期约束没有什么特别,但是如果使用了通配符后的时序例外有重叠的情况下,Vivado会根据优先级来决定对某条路径应用怎样的约束。当设计较大,XDC较多时,一边设置XDC一边用report_timing来验证就变得尤其重要。 另外,仅仅输入report_timing而不加任何option,Vivado便会报告出时序违例最严重的那条路径,方便我们快速了解当前设计的WNS,找到最差的那条路径。在验证I/O约束时也常常用到report_timing,只要指定-from 某个输入或是-to某个输出便可以快速验证当前设计在接口上的时序。 get_timing_paths 除了上述两个大家比较熟悉的时序报告命令,Vivado中还提供一个get_timing_paths的命令,可以根据指定的条件找到一些特定的路径。我们可以利用其返回值中的一些属性来快速定位设计中的问题。

    例如逻辑级数这个影响FPGA性能的一大因素,因为经常隐藏在时序报告后很难被发现。在Vivado中,除了借助综合后的报告来找到那些可能因为逻辑级数较高而导致的时序难满足的路径外,还有一个更直接的办法,可以一次性报告出设计中那些高逻辑级数的路径,方便我们有针对性的深入分析和优化。 下图这个例子报告了时序最差的10条路径的逻辑级数。需要注意的是,在综合后和在布局布线后用一样的脚本报告出的结果会稍有不同,对逻辑级数较为关注的情况,还是建议以综合后的结果为主要依据。

    小结 本文可以视为对《XDC约束技巧》系列文章的补充,希望可以帮助大家了解FPGA设计中的时序分析方法,学会使用Vivado中的静态时序分析工具来验证时序,定位问题,快速找到问题和解决方案。 Vivado使用误区与进阶系列文章
<think>好的,我现在需要处理用户关于Vivado工程中存在时序违例的问题。用户希望了解如何进行时序分析并处理。首先,我得回忆一下自己之前学过的FPGA时序分析相关知识,以及Vivado工具的使用经验。 首先,用户的问题属于数字设计中的时序收敛问题。在FPGA设计中,时序违例意味着设计不能满足FPGA器件的要求,可能导致功能错误或不稳定。处理这类问题通常需要理解时序报告,分析关键路径,然后采取优化措施。 接下来,我需要整理步骤。根据经验,处理时序违例的一般流程包括:生成时序报告,识别关键路径,分析原因,然后进行优化。可能的优化方法包括逻辑优化、流水线插入、约束调整等。 然后,需要考虑用户可能的背景。用户可能是FPGA设计工程师,对Vivado有一定基础,但可能对时序分析的具体步骤不太熟悉。因此,回答需要结构清晰,步骤详细,同时避免过于专业的术语,或至少解释清楚术语。 需要确保覆盖以下几个方面: 1. 如何生成和查看时序报告。 2. 如何解读时序报告中的关键信息,如时序路径、建立时间/保持时间违例、时钟域交叉等。 3. 常见的时序违例原因,如组合逻辑延迟过长、时钟约束不当、高扇出网络等。 4. 具体的优化策略,比如重新设计逻辑结构、插入寄存器、调整约束使用流水线等。 5. 可能需要的高级技巧,如使用BUFG、优化布局布线等。 另外,需要提醒用户注意约束文件的正确性,因为不正确的约束会导致工具无法正确优化。比如,时钟定义是否正确,是否有缺失的约束等。 可能还需要区分建立时间和保持时间违例的处理方法。通常,建立时间违例更常见,处理方法包括减少组合逻辑延迟、提高时钟频率的约束等。而保持时间违例可能在高速设计中更常见,可能需要增加延迟或调整布局。 在思考过程中,要确保步骤的逻辑顺序,从分析到处理,逐步深入。同时,要给出实际的例子,比如如何通过添加寄存器来分割长组合路径,或者如何调整综合策略。 还要注意Vivado工具中的特定功能,比如使用Report Timing Summary,Report Clock Networks,以及使用Phys Opt工具进行物理优化等。 可能的误区:用户可能只关注于修改约束,而忽略了设计本身的优化。因此,需要强调设计结构优化的重要性,比如合理划分流水线阶段,避免过于复杂的组合逻辑。 最后,总结处理时序违例的一般步骤,并建议迭代优化,因为可能需要多次调整才能收敛。</think>在Vivado工程中处理时序违例问题需要系统性分析,以下是分步骤解决方案: $$T_{slack} = T_{周期} - (T_{组合逻辑延迟} + T_{时钟偏斜} + T_{建立时间})$$ 一、生成时序报告 1. 运行`综合``实现`后,在`Flow Navigator`中打开`Report Timing Summary` 2. 重点查看: - 最差负余量(WNS) - 保持时间违例(Whs) - 违例路径数量(TNS) 二、关键路径分析 1. 双击违例路径查看详细信息: - 源寄存器(Startpoint)目标寄存器(Endpoint) - 组合逻辑层级(Logic Levels) - 线延迟(Wire Delay)占比 2. 典型问题标识: - 高扇出网络(>1000) - 跨时钟域路径 - 组合逻辑延迟>60%时钟周期 三、优化策略 1. 逻辑结构优化: ```verilog // 优化前 always @(posedge clk) out <= (a + b) * c - d; // 优化后:插入流水线 reg [31:0] stage1; always @(posedge clk) begin stage1 <= a + b; out <= stage1 * c - d; end ``` 2. 约束调整: ```tcl # 添加多周期路径约束 set_multicycle_path 2 -setup -from [get_clocks clk1] -to [get_clocks clk2] # 设置最大延迟约束 set_max_delay 5.0 -from [get_pins instA/CLK] -to [get_pins instB/D] ``` 3. 物理优化: - 在`Implementation Settings`中启用: - `Phys Opt Design` - `Perform Advanced Logic Optimization` - 对高扇出网络插入BUFG: ```verilog (* use_clock_network = "yes" *) reg high_fanout_reg; ``` 四、进阶技巧 1. 使用`Report Clock Interaction`检查时钟间关系 2. 对于LUT级联路径,尝试: - 减少逻辑级数到4级以内 - 使用寄存器打拍 3. 布局约束优化: ```tcl # 将关键模块设为Pblock create_pblock pblock_critical add_cells_to_pblock pblock_critical [get_cells inst_critical] resize_pblock pblock_critical -add {SLICE_X12Y50:SLICE_X15Y75} ``` 五、验证流程 1. 每次优化后重新运行`Implementation` 2. 对比时序报告中的WNS改善情况 3. 使用`Report Methodology`检查设计规范 注:当时序余量小于0.5ns时,建议优先考虑架构优化而非单纯约束调整。典型优化效果对比: | 优化方法 | 延迟改善幅度 | 资源开销 | |-------------------|--------------|----------| | 流水线插入 | 30%-50% | +5-10% | | 逻辑重构 | 10%-20% | ±0% | | 布局约束 | 5%-15% | ±0% | | 时钟门控优化 | 3%-8% | -2-5% | 建议采用迭代优化策略,优先处理WNS最差的10条路径。若持续无法收敛,需重新评估时钟频率目标或进行架构级优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值