草庐IT

时钟抖动(jitter)和时钟偏移(skew)的理解和建立/保持时间slack的计算

被流转的数字设计打工人 2023-12-21 原文

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

在一次笔试题中遇到了带时钟抖动(jitter)的建立/保持时间计算的问题,当时对时钟抖动概念不是很清晰,然后没写出来,笔试结束后去网上搜索发现只有时钟抖动的概念,并无相关计算(也可能自己没有找到),然后咨询了一位做数字IC相关的老师,最后算是的到了比较清楚的答案了吧,写一下自己的理解。
可能有叙述错误,欢迎大家评论留言,我一定改!


一、什么时钟抖动和时钟偏移?

这个概念网上一搜一大堆,都解答的比较详细,我这里简要介绍一下吧。
时钟抖动:指的是某一时刻时钟周期会发生短暂性变化(向左或向右偏移),造成时钟周期在不同的周期上可能加长或缩短。它一般发生在时钟发生器内部,和晶振和PLL内部电路有关,与布线无关。是频率上的不确定。
它的计算:jitter=Tmax-Tmin,如下图所示:

时钟偏移:是指同一时钟由于布线长度不同导致时钟到达不同寄存器的时间不同,存在一定差值。时钟偏移是永远存在的,它的大小和电路布线有关。是相位上的不确定。
它的计算:Tskew=clk2-clk1,
注意这里结果可能是正,也可能是负。正常来说,时钟到达clk1的时间肯定比到达clk2的时间短,但是我们在进行时序分析的时候,看的是源端触发器到目的端触发器之间的时序路径,假如有一条时序路径是从FF2到达FF1(path2),
那么其Tskew=clk1-clk2;
![在这里插入图片描述](https://img-blog.csdnimg.cn/e51c6274532d48d98ebf979a601dfb41.png

二、包含时钟抖动和时钟偏移的建立/保持时间余量的计算

1.带时钟延迟的计算

这一点应该是很好理解的,我们从时序图出发,如下图所示:
这里将Reg1 到Reg2的逻辑延迟Tlogic和路径延迟Troutine统称为Tdata;

要求数据到达时间:Trequire=Tclk+Tclk2-Tsu;
实际数据到达时间: Tarrive=Tclk1+Tco+Tdata;
建立时间余量=Trequire-Tarrive=Tclk-Tco-Tdata+Tskew-Tsu;(Tskew=clk2-clk1)

实际数据结束时间:Tclk+Tclk1+Tco+Tdata;
要求数据结束时间 Tclk+tclk2+Th;
保持时间余量 =Tco+Tdata+Tclk1-Tclk2-Th=Tco+Tdata-Tskew+Th;(Tskew=clk2-clk1)


2.带时钟抖动的计算

因为时钟抖动的发生是不确定的,它是在某个时钟周期产生周期的增加或缩小,所以一般也可将时钟抖动称为时钟不确定(Uncertainty).
如本文第一张图片所示,我们可以理解时钟抖动是某一周期时钟上升沿向左或向右偏移,在进行建立/保持时间余量计算的时候,其建立时间/和保持时间的时钟不确定应该分开表示并进行计算。


数据到达时间=latch edge +Tclk2=Tclk+Tclk2;



对于建立时间而言:
数据要求到达时间=clock arrival time-Tsu-Set Uncertainty=Tclk+Tclk2-Tsu-Setup Uncertainty;
数据实际到达时间不变:arrive=Tclk1+Tco+Tdata(不变)

建立时间余量=Trequire-Tarrive=Tclk-Tco-Tdata+Tskew-Tsu-Setup Uncertainty;(Tskew=clk2-clk1)



同理,对于保持时间而言:
实际数据结束时间:Tclk+Tclk1+Tco+Tdata(不变)
要求数据结束时间 Tclk+tclk2+Th+Hold Uncertainty;

保持时间余量 =Tco+Tdata+Tclk1-Tclk2-Th=Tco+Tdata-Tskew+Th+Hold Uncertainty;(Tskew=clk2-clk1)

一般情况下,建立/保持时钟不确定性会直接给出的,如下所示:

注意:

有时候在计算时,题目只会给出一个jitter的值,如下图所示:

这种情况为了结果的准确性,我们在计算建立/保持时间余量的时候就要减去/加上 1/2的jitter
为什么取1/2呢
这是因为jitter在计算的时候取的时钟周期的最大值与最小值之间的差值,它有可能是正负偏差的合集,除以二就可以得到相对于中间的那个上升沿(latch edge)的偏差值,这样在进行建立/保持时间余量的计算时相对比较可靠。
但这种情况只能做一个理论的计算,因为在实际工程中正的偏差和负的偏差有可能不是一半,所以比较准确的描述还是应该像上面图片中(5)示例那样分开定义的。


总结

在进行时钟抖动相关计算时,若题目分别给出建立/保持时间的时钟不确定性,计算建立时间余量就是减去Setup Uncertainty,计算保持时间余量就是加上 Hold Uncertainty;若题目只给了一个jitter的值,那么就可以近似用1/2的jitter去代替Setup Uncertainty和Hold Uncertainty进行计算。

有关时钟抖动(jitter)和时钟偏移(skew)的理解和建立/保持时间slack的计算的更多相关文章

  1. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  2. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  3. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  4. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  5. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  6. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  7. ruby - 易于初学者理解的 Ruby 库 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭3年前。Improvethisquestion我正处于学习Ruby的阶段,我想查看一些小型库的源代码以了解它们是如何构建的。我不知道什么是小型图书馆,但希望SO能推荐一些易于理解的图书馆来学习。因此,如果有人知道一两个非常小的库,这是新手Rubyists学习的好例子,请推荐!我想使用Manveru'sInnatelib,因为它试图保持在2000LOC以下,但我还不熟悉其中经常使用的Ruby速记。也许大约100-5

  8. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

  9. ruby - 无法理解 `puts{}.class` 和 `puts({}.class)` 之间的区别 - 2

    由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A

  10. ruby - 以毫秒为单位获取当前系统时间 - 2

    在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题:

随机推荐