基于Xlinx的时序分析与约束(8)----关于时序路径、时钟悲观度和建立时间/保持时间的一些问题

news2024/7/6 19:12:58

写在前面

        最近研究vivado里的时序分析路径时,发现了3个很有意思的问题。经过一番查找资料后,总算把问题搞明白了,在这里分享给大家。


1、为什么同一条时序路径在报表里的值不一样?

        在如下文件建立的工程中:

module test
(
    input               sys_clk	,
    input               rst  	,
    output reg [7:0]	cnt
);

always @(posedge sys_clk)begin
    if(rst)
        cnt <= 0;
    else
        cnt <= cnt + 1'b1;
end

endmodule

        时序约束只做了主时钟约束,约束时钟100M:

create_clock -period 10.000 -name sys_clk -waveform {0.000 5.000} [get_ports sys_clk]

        

        有一条建立时间的路径是这样的:

  • 左侧是源端时钟路径,右侧是目的端的时钟路径
  • ①是时钟从FPGA管脚进入后到IBUF,在IBUF内部的延迟,这段路径在源端和目的端就是同一条路径,但是两者的时间增量却不相同,源端是0.915ns,而目的端是0.784ns
  • ②是时钟IBUF出来后到BUFG的布线延迟,这段路径在源端和目的端同样是相同一条路径,但是两者的时间增量却不相同,源端是1.693ns,而目的端是1.604ns
  • ③是时钟在BUFG内部的延迟,这段路径在源端和目的端依然是同一条路径,但是两者的时间增量却不相同,源端是0.081ns,而目的端是0.077ns
  • ④是时钟从BUFG出来后分别到源端寄存器时钟端和目的端寄存器时钟端的布线延迟,二者不是同一条路径,但二者可能存在部分路径重合(需要具体分析),所以时间增量不同是正常的

       

        所以现在问题来了: ①②③明明就是同一条路径,但是为什么在源端报表和目的端报表的时间增量却不相同?

        上面是建立时间的路径分析,这一诡异的情况同样出现在保持时间的路径分析下:

        哪怕都是源端时钟路径或者目的端时钟路径,在建立时间的时序报表和保持时间的时序报表里也都不一样。比如,源端的BUFG在建立时间分析时延迟是0.081ns,但在保持时间分析时延迟却成了0.026ns。其他相同项也都有不同的时间延迟。

        所以问题到底出在哪里? 


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 并行分析后选出的最差情况。  


        所以现在问题大概就有答案了,由于不同的 PVT 条件可能会产生不同的路径延迟,所以vivado选择的办法就是找到最优、最差两种极端路径,在极端路径都满足时序要求的话就可以保证在所有情况都满足时序要求。

        建立时间分析的时候使用的是Slow Corner模型,保持时间分析的时候使用的是Fast Corner模型。所以才会出现同一条路径在做建立时间分析和保持时间分析时出现不同延迟值的情况。

        建立时间报表分析分析的是max at slow process corner。在slow process corner模型下所有节点的时延都是最大的。在这种情况下如果能满足setup时间的话,那么在其他模型就都可以满足;保持时间报表分析分析的是min at fast process corner。在fast process corner模型下所有节点的时延都是最小的。在这种情况下如果能满足hold时间的话,那么在其他模型就都可以满足。

        同样的,为了实现最极端情况的分析,所以在:

建立时间检查的最大延迟:

  • 针对源时钟路径和数据/复位路径累积延迟,使用给定角点 (corner) 的最差情况延迟(最慢延迟)
  • 针对目标时钟路径累积延迟同样使用该角点 (corner) 的最佳情况延迟(最快延迟)

保持时间检查的最小延迟:

  • 针对源时钟路径和数据/复位路径累积延迟,使用给定角点 (corner) 的最佳情况延迟(最快延迟)。
  • 针对目标时钟路径累积延迟同样使用该角点 (corner) 的最差情况延迟(最慢延迟)

        也就是说,源端路径的延迟和目的端路径的延迟是不一致的。

        至此,问题1解决。


2、时钟悲观度(Clock Pessimism Removal(CPR))是啥?

        在建立时间分析时,我发现下面两条路径都存在一个clock path skew的值,且两者还不一致。

        clock path skew的概念我懂,就是时钟到达源端和目的端两个寄存器的时间存在偏差嘛,就像这样:

        时钟网络延时 Tskew 就是 Tc2d 与 Tc2s 之差,即 Tskew=Tc2d - Tc2s。如下图: 

        所以两条路径的Tskew不同也很正常,毕竟走线不一样。

        在分析下面的问题前,我还是把这张经典的时序图请出来:

  • Data Arrival Time = launch edge + Tclk1 + Tco +Tdata 
  • Data Required Time = latch edge + Tclk2 - Tsu
  • Setup Slack = Data Required Time – Data Arrival Time

        然后,我分别点开了 Tskew的值,就出现了这样两张图:

        可以看到,vivado计算Tskew,不光使用目的端的时钟延迟 减掉 源端的时钟延迟,它还加上了一个Clock Pessimism Removal,CPR,那么这个CPR是啥?

        在问题1的时候我们了解到,为了分析最极端情况的路径延迟,对于源端时钟的路径延迟和目的端时钟的路径延迟采用了不同的建模方式(Corners)。但是会有意外,两条路径之间偶尔会有相同的路径嘛,就像这样:

        相同的路径结果最后计算出来的路径延迟是不一样的,这明显不合理不是?所以xilinx就采用了 时钟悲观度(Clock Pessimism Removal(CPR))这个概念用来补偿两条路径之间的相同部分。顺便多说一句,CPR的xilinx的官方翻译是时钟消极因素移除(出自xilinx文件c_ug906),但是网上多用时钟悲观度这个翻译。

        对于第一条路径path119:

        源端延迟是3.794ns,目的端延迟是4.128ns,4.128ns - 3.794ns = 0.334ns,这和vivado补偿的CPR的值0.334ns是一致的,这说明到源端寄存器和到目的端寄存器都是100%的共同路径。

        最后时钟悲观度是作为一个增量加入到了目的端时钟路径上,作为共同路径采用不同模型导致延迟差异的补偿。

        再来看看第二条路径path 114:

        同样的,源端延迟是3.794ns,目的端延迟是4.128ns,4.128ns - 3.794ns = 0.334ns,这和vivado补偿的CPR的值0.306ns不一致的,二者之间差了0.306ns - 0.334ns = -0.028ns,这个值也就是Tskew, 这说明到源端寄存器和到目的端寄存器的路径除了有共同部分外,还有不相同的部分。

        从FPGA管脚到 IBUF到net再到BUFG这条路径不管是源端还是目的端都是相同的,源端延迟是0.915+1.693+0.081 =  2.689ns;目的端延迟是0.784+1.604+0.077 = 2.465ns,所以照理来说,补偿值CPR应该是 2.689 - 2.465 =  0.224ns,但是实际却补偿了0.306ns,那么多出来的0.306 - 0.224 = 0.082ns是来自哪里?

        从BUFG到源端和目的端的时钟管脚之间各自都还有一段走线,在源端这个值是1.440ns,在目的端这个值是1.330ns,如果这段走线都是共同路径的话,那么在这一部分要补偿的CRP的值应该是 1.440-1.330 =  0.11ns,但是我们前面算了,这段实际补偿的CPR值是 0.082ns,这说明这段路径仅有一部分是二者的共同路径,共同路径的比例应该是 0.082/0.11 ≈  74.5%。这说明剩下的25.5%就是源端时钟与目的端时钟的Skew值,即0.11*25.4%≈ 0.028ns,这与vivado计算的clock path skew值是一致的。

        至此,第二个问题也解决。


3、建立时间Tsu为啥是负的?

        建立时间Tsu的概念我们很熟悉了,也很重要,毕竟是整个时序分析的基础,在这里再回顾一下:

为了使寄存器稳定地采样到当前D端的数据,D端数据必须满足建立时间和保持时间的要求:

  • 建立时间:Setup Time,缩写是 Tsu,即在时钟上升沿之前数据必须稳定的最短时间
  • 保持时间:Hold Time,缩写是 Th,即在时钟上升沿之后数据必须稳定的最短时间

         通俗来讲:建立时间和保持时间就是在寄存器采样窗口中输入数据必须保持不变,以免寄存器无法稳定采样。也就是说,在我寄存器的采样窗口之前你输入数据就必须要保持稳定,即输入数据不能来的太晚(建立时间);同样的,你寄存器的输入数据也必须在我寄存器的采样窗口结束后才变化,在此之前必须保持问题,即输入数据不能走的太早(保持时间)。

        建立时间和保持时间的示意图如下:

        建立时间和保持时间是寄存器的固定属性,不同的FPGA器件都应该是一个不同的值,且理论上这两个值都应该是正数。

        现在依然来看path 119的时序报告:

        上图是计算 数据要求到达时间 的公式,建立时间是0.059,且是作为一个增量给加到 数据要求到达时间 里去的,但是从更上面的公式我们又知道 数据要求到达时间 应该是这样计算的:Data Required Time = latch edge + Tclk2 - Tsu,也就是说理论上建立时间是应该作为一个负的增量加到 数据要求到达时间 的计算中,即减去 Tsu 。

        但报表中的Tsu显然是加上去了,这说明在这个报表中 Tsu 实际上是个负数值。这就很奇怪了,why?

        这种情况在芯片设计中很常见,比如使用standard cell,分析的是CELL外部的时序,不过如果CELL内部clock的延迟大于data的延迟。假设这个延迟是delay,CELL内部寄存器固有的setup时间为tsu,则CELL的setup_time=tsu - delay,当clock延迟足够大,那么从CELL看建立时间就是负值。

        尽管这种情况的建立时间从整体看起来是个负值,但这个建立时间已经不是传统意义上的概念了,而应该是一个对于系统的相对值。还要注意的是,setup和hold不能同时为负值,而且二者之和必须为正。 

        在xilinx的官方论坛也有人发了这个问题:

        这是官方的回答:

        大概意思和上面说的差不多:在时钟路径比数据路径慢很多的情况下,是有可能出现建立时间为负数这个情况的,这个时候报表展示的也是个相对概念的建立时间。

        至此,第三个问题也解决了。


4、参考

        ug903,Vivado Design Suite User Guide--Using Constraints

        ug949,适用于 FPGA 和 SoC 的 UltraFast 设计方法指南

        ug906,Vivado Design Suite 用户指南--设计分析与收敛技巧


  • 📣博客主页:wuzhikai.blog.csdn.net
  • 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵
  • 📣您有任何问题,都可以在评论区和我交流📞!
  • 📣创作不易,您的支持是我持续更新的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Window10下配置Maxim SDK

参考网址&#xff1a; 微信&#xff08;中文&#xff09;&#xff1a;【嵌入式AI开发&Maxim篇一】美信Maxim78000Evaluation Kit AI部署流程初探 GitHub&#xff1a;MaximAI_Documentation/MAX78000_Feather at master MaximIntegratedAI/MaximAI_Documentation 下载地址…

【回答问题】ChatGPT上线了!如何安装python-ipopt?python-ipopt有哪些用法?

如何安装python-ipopt&#xff1f; 要安装 python-ipopt&#xff0c;你需要先安装 Ipopt 库。这个库是用 C 编写的&#xff0c;所以你还需要安装一些 C 编译器。 在 Linux 系统上&#xff0c;你可以使用下面的命令来安装 Ipopt 和相关的依赖项&#xff1a; 复制 sudo apt-g…

excel成本统计:如何进行区域筛选,多条件求和?

最近有位小伙伴被一个计算产品成本的问题难住了&#xff0c;要求是根据配件成本核算出成品的成本。这个问题看上去似乎有点复杂&#xff0c;感觉一下子想不出好的解决办法&#xff0c;实际上&#xff0c;却非常简单&#xff0c;而且仅用常见的求和函数&#xff0c;就能轻松解决…

Mybatis源码分析(四)Mapper文件的解析

目录一 Mapper的使用二 MapperElement的解析三 解析cache-ref节点四 解析Cache节点五 解析ParameterMap节点六 解析ResultMap节点七 解析Sql节点八 处理各个数据库操作语句官网&#xff1a;mybatis – MyBatis 3 | 简介 参考书籍&#xff1a;《通用源码阅读指导书&#xff1a;M…

【每日一题】【LeetCode】【第一天】三数之和

三数之和的解决之路 题干表述 测试案列&#xff08;部分&#xff09; 第一次思路 这种其实是最暴力的&#xff0c;也是我脑海里第一个想到的最简单的方法了。 思路就是三个循环&#xff0c;一个循环去一个数&#xff0c;然后当三个下标不同&#xff0c;且对应的三个数相加为…

FPGA设计CPU书籍

一直以来CPU内部是绝大多数IT工程师难以触及的领域。纵使学习过计算机架构相关课程&#xff0c;自己动手实现CPU也始终遥不可及&#xff0c;因为这涉及计算机系统的最底层——芯片设计。 而近年来FPGA芯片产品的发展与普及打破了这一阻碍&#xff0c;利用内部电路可重编程的FPG…

【C++进阶】IO流

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

Docker进阶(中)

docker 进阶&#xff08;中&#xff09;docker提交镜像等命令docker 镜像原理docker 私有库&推送到私有库容器数据卷docker 安装常规软件docker提交镜像等命令 再这个谈这个docker 提交这个镜像之前我们先补充一下上一篇博客没有谈到的命令。再这里说一下。我们之前谈到的…

代码随想录算法训练营第六天 java :242.有效的字母异位词 349. 两个数组的交集 ,1. 两数之和

文章目录哈希表理论基础哈希碰撞&#xff1a; 拉链法和线性探测法线性探测法Leetcode242.有效的字母异位词题目链接思路AC代码Leetcode349. 两个数组的交集题目链接思路AC代码Leetcode 1. 两数之和题目链接思路与难点AC代码收获今日收获哈希表理论基础 哈希函数如下图所示&…

【C++】string (上)(string类的常用接口 string类对象的容量操作 string类对象的访问及遍历操作 string类对象的修改操作)

文章目录string标准库中的string类string类的常用接口string类对象的容量操作string类对象的访问及遍历操作string类对象的修改操作string string是一个专门管理字符数组的类。 标准库中的string类 string是表示字符串的字符串类该类的接口与常规容器的接口基本相同&#xff0…

计算机二级python考前复习笔记

Python是一种解释型、面向对象、动态数据类型的高级程序设计语言程序设计风格&#xff1a;清晰第一&#xff0c;效率第二。结构化程序设计原则&#xff1a;自顶向下&#xff0c;逐步求精&#xff0c;模块化&#xff0c;限制使用goto语句&#xff08;Python无 goto 语句&#xf…

【回答问题】ChatGPT上线了!SLAM有哪些模型实现代码/案例/github源码?推荐10个以上比较好的SLAM深度学习模型?

目录SLAM有哪些模型实现代码&#xff1f;SLAM有哪些模型实现案例&#xff1f;SLAM有哪些模型的github源码&#xff1f;推荐10个以上比较好的SLAM深度学习模型&#xff1f;推荐10个以上比较好的SLAM深度学习模型github源码&#xff1f;SLAM有哪些模型实现代码&#xff1f; SLAM…

阿里云云数据库RDS的基本使用(二十三)

文章目录1.查看RDS数据库的基本信息2.查看RDS数据库的连接地址3.创建数据库账号并配置白名单3.1.创建数据库连接账号3.2.将ECS服务器添加到RDS白名单3.3.在ECS中登陆RDS数据库4.查看RDS数据库的监控5.查看RDS服务可用性6.查看RDS数据库的日志在RDS实例列表中点击管理即可跳转到…

ubuntu20驱动双屏问题总结

一、环境 设备&#xff1a;拯救者R7000P 显卡&#xff1a;NVIDA GeForce RTX 2060 系统&#xff1a;windows10ubuntu20的双系统下 显示器&#xff1a;笔记本显示器arzopa便携式显示器&#xff08;使用的type-c接口&#xff09; 驱动&#xff1a;nvidia-driver-520 二、问题…

【GO】K8s 管理系统项目[API部分--Service]

K8s 管理系统项目[API部分–Service] 1. 接口实现 service/dataselector.go // service type serviceCell corev1.Servicefunc(s serviceCell) GetCreation() time.Time {return s.CreationTimestamp.Time }func(s serviceCell) GetName() string {return s.Name }2. servic…

【C++】-- 海量数据处理

目录 位图 位图概念的引入 位图的实现 实现功能 开辟bit空间 数据输入set 数据删除reset 数据确认test 代码汇总 容器位图的衍生使用 布隆过滤器 布隆过滤器提出 布隆过滤器概念 ​布隆过滤器的实现 布隆过滤器的删除 布隆过滤器的特点 ​布隆过滤器的误判率 …

【电动车】基于削峰填谷的电动汽车多目标优化调度策略研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

计算机组成原理复习:计算机系统概述

1. 计算机系统概述 1.1 计算机系统的层次结构 &#xff08;1&#xff09; 硬件上&#xff0c;计算机系统可以分为五大功能部件&#xff1a; 运算器、控制器、存储器、输入设备、输出设备 将围绕其工作原理、逻辑实现、设计方法以及相互连接构成整机的方法展开 在典型的冯诺…

Android metaRTC6.0 编译指南

概述 metaRTC新版本优化了安卓系统支持&#xff0c;demo将C和C生成lib库&#xff0c;在lib库上提供了纯Java的webRTC推拉流demo。 demo支持软硬编解码&#xff0c;软编码为openh264&#xff0c;软解码为yangh264decoder&#xff0c;gpu编解码为mediacodec。 metaRTC android…

全长扩增子医学版新增内容来啦(一)

随着全长扩增子报告内容的扩充&#xff0c;医学版报告单的呼声越来越高&#xff0c;今天就给大家介绍一下凌恩生物针对医学客户&#xff0c;变更/新增了哪些报告内容~ 首先我们来看一下变更的内容吧&#xff01; CCA/RDA分析、PICRUSt2功能预测、随机森林-biomarker鉴定、随机…