Sanjay Churiwala

赛灵思公司工具与方法学应用专家,1993年毕业于印度理工学院电子工程专业,一直从事 VLSI 和 EDA 相关领域的工作。2011年加入赛灵思公司,专攻库特性描述与建模,HDL,仿真与综合,静态时序分析以及跨时钟域(CDC)与同步相关内容。

STA和SDF之间的时序不匹配

有时候静态时序分析(STA)的结果会与时序反标文件(SDF)出现不匹配的地方,而它们同样都是Vivado生成的。

以下内容列出了为什么会存在这种差异,以及如何解释STA运行结果和SDF之间的差异。

1. 首先要确认的是这些时序结果是在相同的状态下比较的。

例如,STA是在综合后运行的,那我们与之比较的SDF结果也应该是综合后的,而不是布线后的。

大部分的vivado用户也都很清楚这一点,在做比较的时候一定要保持设计所处的状态是一致的。

这里提到这一点是为了文章内容的完整性。

2. 确认使用了相同的timing corner

SDF文件一般是在slow corner下生成的,而STA可能是在不同的 corner下生成的,(比如:fast corner)。vivado可以做不同corner的时序分析,然后呈现出相应条件下最糟糕的结果。

查看附件文件STA.txt和dummy_synth_time.sdf

定位到IBUF的时序路径,STA文件显示这个路径延迟为293ps,而SDF文件显示这个路径延迟信息为600.5:725.7: 725.7

在STA文件的头部,你可以看到路径类型,在Fast Process Corner…..

Vivado中无关的更改也会造成综合Out-of-Date

在项目流程中,Vivado会跟踪各个流程的依赖关系。当你执行某个操作时,Vivado会保证已经成功完成上一步的操作。例如,如果您想执行implementation,Vivado将会检查synthesis是否已经执行。同时,这种依赖关系管理也会检查目前已完成的各项操作是否是依赖最新的输入而完成的。这样可以确保上一步的输出都是有效地。例如,假设已经执行了综合,之后又修改了一个RTL文件,虽然综合已经完成,由于输入在综合之后被修改过,所以它已经过时了。在Vivado环境下,这种情况被称作“Out of Date”。

有的时候,即使所做的更改看起来似乎并不影响综合,但也会造成综合或其他步骤的Out of Date。例如,在综合完成后又添加一个“pblock”约束,这个操作是不会影响综合的,但是,综合还是会显示Out of Date,原因就在于Vivado跟踪依赖关系的间隔度过小。

综合依赖于输入的HDL,XDC和其他多种因素。当XDC出现变化,如添加了pblock,由于输入成分发生改变,所以综合会Out of Date。它并不跟踪XDC的单个命令来检查它们是否影响综合。

基于IP设计流程的专业术语

作者:Sanjay Churiwala,赛灵思公司工具与方法学应用专家

基于Xilinx IP设计过程中使用到的术语与典型的RTL设计方法有些不同

因此我们基于IP设计流程定义了一些专用的术语

本篇文章主要向大家介绍了一些和IP相关的术语

Xilinx Vivado工具带有IP Catalog(目录)功能,这个目录下面包含多个IP核资源,同时用户也可以将自己设计的IP核加入到这个目录里面

为了更好的阐明本篇文章的目的,我们假设该目录下面只包含Xilinx提供的IP核

这个目录下面的IP核一般都是通用版本——支持用户自定义

举个例子,如果你选择一个计数器(Counter),这个计数器可以根据如下需求进行自定义:

  • 数据带宽
  • 是否可加载
  • 向上计数还是向下计数(UP/DOWN)
  • 其它一些选项
  • 该目录下的“IP”是一个通用模板,也就是说不能够直接应用到系统设计中

    我们需要根据上述要求配置计数器(Counter)IP(例如8位带宽向上计数,支持并行加载)

    这些自定义配置存储在.xci文件中,.xci文件包含我们选择的具体配置信息,进过自定义后就成为一个可用的IP了,满足我们的功能要求

    输出延迟是怎么回事?

    作者:Sanjay Churiwala,赛灵思公司工具与方法学应用专家

    本篇文章我们将与大家共同讨论时序约束方面的一个概念:output_delay

    Output_delay可选参数-max相对比较容易理解。为了全面性本文下面也进行了介绍

    Output_delay的另一个可选参数-min则比较难理解,这也是本文的主要目的

    我们以下面这个情况为例:

    B表示整个设计中的一个模块,也是我们要进行约束的部分

    P表示模块B的一个输出端口,output_delay设置的一个节点

    F1表示模块B内部的一个触发器,同时也是P的驱动源

    F2表示模块外部的一个触发器,用于采样P输出的数据

    为了简单起见,我们假设F1和F2采用同一驱动时钟,而且也不存在时钟偏移。P端口的output_delay设置也参照同一时钟源

    P端口的output_delay设置也参照同一时钟源

    为了更容易理解,我们使用一些具体的参数值

    关于高阻态和OOC(out of context)综合方式

    作者:Sanjay Churiwala,赛灵思公司工具与方法学应用专家

    Xilinx Vivado工具支持仅将系统设计的一部分进行综合,即OOC(out of context)综合方式。OOC综合方式的流程就是将设计的某个模块单独完成综合操作,这会带来如下可能性:

  • 通过综合实现这个模块的快速迭代,不用综合系统的其余部分整个设计的迭代也更快了
  • 利于系统其余部分的快速迭代,如果某部分确定稳定不变了,可以对这个模块进行OOC综合操作,保留这个综合版本,这样就可以方便迭代其余部分
  • 某个模块的改变只需要再对此模块进行综合即可,节省的时间用于模块功能设计

    OOC综合方式非常适合IP核的设计,我们可以将自己的IP核采用OOC方式进行综合然后使用综合后的输出结果

    这意味着当我们使用IP核时我们不需要在进行IP核的综合操作,就可以完善系统设计

    然而如果设计中存在三态(高阻态),OOC综合操作就会受到影响

    FPGA仅支持I/O输出端口的高阻态,在器件内部是不允许的

    如果你使用OOC综合方式,Vivado工具并不知道某个具体的信号是连接I/O输出还是在器件内部进行连接

    最后,综合工具会将这个高阻信号转换为某个逻辑值,而不是最为高阻态进行综合

    确保数据总线的信号偏移控制

    作者:Sanjay Churiwala,赛灵思公司工具与方法学应用专家

    有时候我们想让多个信号或多或少的出现在同一时刻(也就是说这些信号之间的时间差应该在某个界限之内)。

    一个经典的情况就是多位的数据总线,总线上的信号应该(几乎)同时到达。

    如果其它信号均由其中一个信号生成,那么要满足上面的要求,我们可以通过设置set_min_delay约束来实现。

    但是如果这些信号都是互相独立生成的呢?

    或者说,大多数情况下,这些信号可能都是由同一个信号源生成的(例如同一个时钟源)?

    确保小的信号传输偏移的一个方式就是相对共同的源约束每个信号。

    举个例子,一个32位的数据信号,相对同一个时钟源(用于生成这些信号)我们可以对每个信号进行约束。

    但是使用这种方法来控制数据总线上信号之间的偏移需要非常严格的时序约束。

    例如我们需要确保不同信号之间的偏移差在0.5ns范围内。

    因此我们需要设计延迟规范,比如定义最小和最大延迟,确保所有信号能在0.5ns偏差范围内全部到达节点。

    这个要求不是对于某个具体的0.5ns节点来说的,而是需要满足任意一个节点——在0.5ns的延迟范围内所有信号都能到达。

    XDC可以通过set_data_check命令来规定这样的偏差控制要求。

    关于锁存器的time borrowing概念

    作者:Sanjay Churiwala,赛灵思公司工具与方法学应用专家

    静态时序分析经常会遇到基于锁存器(latch)的设计从而引入了一个概念称为“Time Borrowing”。这篇文章向大家解释了什么是time borrowing,以及锁存器(latch)设计和时序报告中关于time borrowing的处理方式。

    下面的时钟信号周期为10,占空比为50%:

    同时我们引入一个简单的电路,如下所示:

    为了更容易理解,我们假设每个触发器的建立时间和保持时间均为“0”。

    同样假设时钟偏移和时钟延迟也为“0”。

    F1在时刻0得到数据,F2在时刻10对数据进行了采样。

    关于异步时钟的约束

    作者:Sanjay 赛灵思公司工具与方法学应用专家

    对于异步时钟有四种方法进行约束。

    本文介绍了每种方法的优缺点:

    1. set_false_path:
    这是最原始的方法,在时序分析设计早期比较流行。
    这种方法有两个缺点:
    a. 两个方向都需要约束:clock1->clock2以及clock2->clock1
    b. 该路径没有时序要求,因此理论上路径延迟完全依赖于所使用的工具。而且这两种路径可能导向不同的节点,因为我们没有办法规范它们来满足任何具体的要求。

    2. set_clock_groups
    该方法已被引入SDC中
    与方法a相比有以下三个主要优点:
    a. 只需要指定源时钟与目的时钟,尽量减少XDC/SDC文件的长度
    b. 与set_false_path方法相同,这里的路径也没有时序要求。但是它考虑到了信号完整性方面的问题,而set_false_path方法并没有
    c. 在基于FPGA设计领域,可以说这是不重要的,因为在设计FPGA器件时信号完整性方面已经被考虑到了
    d. 这种方法带点哲学思辩的方法论

    在仿真中防止脉冲滤波

    作者:Sanjay,赛灵思公司工具与方法学应用专家

    通常如果你的设计在较低时钟频率时通过了仿真,但是在较高时钟频率时却失败了,你的第一个问题应该是你的设计在某个较高时钟频率时是否达到了时序约束的要求。

    然而这里我们将举这样一个例子,就是对于某个较高时钟频率你已经检查了静态时序分析(STA),而且时序约束也是正确的。

    这种情况是什么引起的较高时钟频率仿真失败呢?

    可能的原因就是仿真方式、设计本身或者testbench设置方式有问题。

    然而在较低时钟频率通过了仿真这个事实就排除了设计/testbench/仿真在设置上的问题。

    排除了上面两项,下一个可能就是脉冲拒绝(reject)或者脉冲错误。

    “脉冲拒绝(reject)”和“脉冲错误”是Verilog仿真中的概念。

    这些概念说的是脉冲的持续时间小于某个值(pulse_r)就不会通过某个电路元件。

    当然脉冲持续时间大于pulse_r,但是如果小于另一个值pulse_e尽管会通过,但是在仿真中显示的是“x”。

    这个持续时间是以通过某元器件延迟的百分比来表示的。

    比如通过某元件的延迟是1ns。

    0.5ns的脉冲表示为50%的持续时间。

    现在假设设计采用的频率是200MHz。

    对应的周期就是5ns。

    为什么CPR操作得出的效果却是相反的?

    作者:Sanjay,赛灵思公司工具与方法学应用专家

    在进行时序分析时片上工艺差别通常会导致严重的“时钟悲观效应”。这种问题可以通过CPR(Clock Pessimism Reduction)操作来恢复.然而经常有用户咨询我们说在他们的设计中CPR操作并没有降低“时钟悲观效应”,效果却是相反的,在时序上并没有增加反而离时序要求差的更多了。

    在setup分析时,CPR通常会被添加到目标(目的)时钟路径,因此增加了要求时间。然而因为在用户的设计中CPR已经从目标时钟路径中移除,要求时间变得更早,而不是延后。结果就是用户认为他们损失了时间,而不是获得补偿时间。其实实际情况是用户没有任何损失。

    进行OCV分析时,源路径和目标路径被认为具有不同的延迟时间。然而对于两者“共用”的路径,其延迟时间是保持不变的。CPR补偿了延迟差异,因此直到公用节点延迟数值变得一样了。

    为了能够更好的理解发生了什么,请查看附件的时序分析报告。
    (感谢Xilinx Tokyo的Matsuyama-san分享了他的一个示例设计的时序分析报告)
    为了简单易懂,这个报告作了一些修改。

    同步内容