FPGA时序约束(二)--做时序约束,本质上是在干嘛

发布于:2025-09-03 ⋅ 阅读:(17) ⋅ 点赞:(0)

前言

        上篇文章说到的,由于实际中的电路器件不是理想的,需要一定的建立时间,保持时间才能完成正确的数据传输。而做时序约束,就是告诉FPGA相关的信息,让它可以去布局布线,从而满足建立时间保持时间的要求。这篇文章,将首先从set input delay这个具体的约束来分析一下这个过程。

set input delay的意义

        set input delay 是给FPGA输入IO口的时序约束,它告诉FPGA这个信号相对于某个时钟的延时。一般来说我们会设置  set input delay max和set input delay min两个值,set input delay max是帮助FPGA分析建立时间的,set input delay min是帮助FPGA分析保持时间的。这样可以充分考虑外部的延时情况,但有时也可以直接设置这两个值一样,意味着外部的延时不会变,按同样的值去分析就行。
下面是一个FPGA接收外部数据的简化模型:


        时钟和数据都从外部传输到FPGA,为了方便理解,可以简单认为时钟到到输入端口时没有延时,数据到达端口时有一定的延时T_input_delay(延时是相对的,可以把时钟的延时都算在数据的延时里面,所以我们假设时钟没有延时)。从端口到寄存器的输入端延时为T_internal_path,以及建立时间T_su。
        那么为了满足建立时间的要求,则可以得到以下公式:
                        T_input_delay+ T_internal_path  <= T_clock_period - T_setup
        其中T_clock_period是时钟周期。
       这个公式的物理意义是:数据到达寄存器输入口的时间要小于时钟到达的时间减去建立时间。也就是在建立时间之前,数据就到了,这样时钟到采集的时候,这个数据就是稳定的。为什么时钟到的时间是T_clock_period呢?因为建立时间判断的时候,锁存沿比发起沿晚一个时钟周期。数据端的延时是相对于第一个周期来说的,那么锁存自然就是一个周期后,所以时钟到达的时间是T_clock_period。
        然后我们再来解析一下这个公式的各个部分:
        T_setup:由触发器的工艺库提供,工具知道。
        T_clock_period:我们告诉FPGA,通过create_clock的方式。
        T_input_delay:我们告诉FPGA,它取决于上游芯片的速度、PCB布线的长度等因素。工具在芯片内部,看不到这些。
        所以我们要做的:首先,告诉FPGA,系统使用的时钟频率是多少,用create_clock命令告诉它。然后,评估或查阅上游器件规格,确定T_input_delay的最大值(最大外部延迟),​用set_input_delay max命令告诉FPGA我们评估出的这个值,比如set_input_delay -max 3.5 -clock [get_clocks CLK] [get_ports DATA_IN]。这表示我们认为从外部发送寄存器发出数据到DATA_IN引脚,最大的延迟是3.5ns(相对于发起时钟CLK的边沿)​。
        当FPGA接收到我们提供的信息后:比如设置T_input_delay = 3.5ns。
        代入物理公式:
                                3.5 + T_internal_path <= T_clock_period - T_setup
        转换这个公式,计算出内部路径必须满足的目标:
                                T_internal_path <= (T_clock_period - T_setup - 3.5)
        FPGA在综合、布局布线过程中,努力优化内部逻辑和布线,​使实际的T_internal_path小于或等于计算出的右边(T_clock_period - T_setup - 3.5)。
FPGA会在时序报告中展示T_internal_path的实际值 (data arrival time) 和它必须满足的上限 (data required time),并报告是否满足(Slack >=0)或违例(Slack < 0)。
        set input delay本质上是给工具提供外部数据延时的信息,让工具知道它需要让内部路径满足T_internal_path <= (T_clock_period - T_setup - T_input_delay)这个目标。
        
当然这只是最简化的一个模型,实际上还有很多的误差要考虑进去,比如我们这里假设时钟的传输路径是没有延时的,假设了时钟是没有误差的,数据的延时也可以继续细分。
        说完了建立时间,我们再来看看保持时间

        这个模型相对于建立时间的模型有一些改变,我把延时放到了时钟路径上。那么为了让保持时间满足要求,则有如下的关系:
                                         T_input_delay+ T_internal_path  >= T_hold
        注意这个时候没有一个时钟周期了,因为对于保持时间来说,发起沿和锁存沿对应的是同一个时钟周期,关于这一点在下一篇还会详细讲。那么此时的内部延时必须满足
                                        T_internal_path>=T_hold- T_input_delay
        然后用set_input_delay min这个命令告诉工具,结合上面满足建立时间时T_internal_path需要满足的关系,它就会结合内部的布局布线资源去使得T_internal_path为一个合适的值,同时满足建立时间保持时间的要求。

其他约束的意义

     create_clock    

        ​create_clock​ 是所有时序约束的基石,其物理意义是为整个设计建立一个绝对的时间参考系。它定义了一个理想的同步信号周期,所有内部和外部接口的时序分析都将以此周期为基准进行衡量。当我们为FPGA的某个输入端口创建一个主时钟时,实质上是在告诉时序分析工具:“​​将一切时序行为映射到这个固定周期上​​”。这个周期定义了系统速度的理论上限,其边沿则成为所有数据发送和捕获的绝对时间原点。工具会基于此来计算内部寄存器的建立和保持时间,并解读其他所有约束(如输入/输出延迟)。我们刚刚讲解set input delay的时候,其实也用了一个时钟来分析。

  create_generated_clock

        在芯片内部为一个由逻辑电路(如PLL、分频器等)产生的新时钟信号正名,明确其与源时钟的派生关系(频率、相位)。只要在设计中使用内部电路产生了另一个时钟,就必须使用此约束来定义它,这样工具才能以此为基准,正确地分析所有以此新时钟为时序参考的路径。

  set_clock_groups

        声明两个或多个时钟域之间是异步的,它们之间的所有路径都不存在可靠的时序关系,因此无需进行分析。这是处理异步时钟域最彻底和高效的方法,例如当FPGA内部时钟与外部传感器提供的时钟或另一个芯片的时钟毫无关系时,通过此约束将这两个时钟组设置为异步,工具便会自动忽略它们之间的所有路径,从根本上避免了跨时钟域时序违例的报告。

  set_output_delay​​

        定义数据在输出端口必须稳定下来的时间要求,其本质是将外部下游器件的建立/保持时间要求“翻译”成FPGA内部路径必须满足的延迟预算。比如说使用FPGA控制一个DAC或另一个芯片时,我们就需要通过这个约束来告诉工具:“下游器件需要数据在时钟边沿前X纳秒就准备好”,从而驱动工具去优化FPGA内部的输出路径,确保信号能提前足够的时间稳定输出,以满足外部器件的采样需求。

  set_max_delay​ 和 ​​set_min_delay

        用于为特定路径直接规定信号传输的绝对时间边界,其物理意义是绕过传统的时钟周期分析,直接控制信号的速度。当需要确保一个异步信号或通过组合逻辑的特定控制信号既不会传播得太慢(影响功能)也不会太快(导致竞争)时,就会使用它们,例如对一个异步握手信号或门控信号路径施加严格的延迟限制。

  set_false_path

        命令时序分析工具完全忽略对指定路径的检查,因为你确信这些路径在物理上不会发生需要满足时序关系的同步数据传输。这最常用于明确跨越异步时钟域的路径,或者像异步复位这样的全局控制网络,我们告诉工具无需在这些路径上浪费优化资源,也避免产生大量无意义的违例报告。

  set_multicycle_path

        告知工具数据从发起端到捕获端的功能实现需要多个时钟周期,因此应当放宽建立时间检查的周期数。当设计像大型计数器、复杂算术单元或状态机输出这类逻辑时,其有效结果需要多个时钟周期才能计算完成,使用此约束可以避免工具徒劳地试图让数据在一个周期内到达,从而将优化资源分配到更关键的单周期路径上。

        总而言之,所有这些约束的本质都是我们作为设计者,向自动化工具清晰地描述设计意图和外部环境。工具依据这些“指令”构建出准确的时序分析模型,并据此驱动综合与布局布线过程,努力让设计满足所有现实中的时序要求,最终确保芯片在真实世界中稳定运行。​

写在最后

        希望这篇文章能帮大家建立起具体时序约束作用的概念,现在看可能还是会有点懵,特别是上面写的关于其他约束的意义,都是文字会比较抽象。但我从我学习时序方面的知识的过程体会来说,觉得还是有必要先把这段讲一下,之后学习每一个时序约束时也能知道怎么做和为什么做。
        


网站公告

今日签到

点亮在社区的每一天
去签到