草庐IT

一起学时序分析之建立/保持时间裕量

背影疾风 2023-04-04 原文

何为裕量?

        裕量,英文名称叫做“Slack”。我们在Vivado实现后的报告中常常能看到这样一栏:

因为都是缩写,所以我们来解释一下前四栏的含义:

  1. WNS,即Worst Negative Slack,最差负时序裕量。这个表征了我们设计的电路中,最差的那条路径的时序裕量,如果为正,则说明满足建立时间要求,如果为负,则说明建立时间时序出现问题。
  2. TNS,即Total Negative Slack,也就是所有负时序裕量路径之和,数字的含义和上面是一样的。
  3. WHS,即Worst Hold Slack,代表最差保持时序裕量 ,为正则说明满足保持时间要求,为负则说明保持时序出现问题。
  4. THS, 即Total Hold Slack,也就是总的负保持时序裕量路径之和。

        上面我们一直提到了一个词:裕量。究竟如何理解“裕量”这个词呢?所谓的裕量字面上理解就是多出来的量,之前的文章中我们讨论过建立时间和保持时间的概念。

        对于建立时间,我们要求信号在建立时间之前就要稳定下来,至于具体提前了多久,那就得用“建立裕量”WNS和TNS进行衡量。

        对于保持时间,我们要求信号要在保持时间之后才可以变换,至于延后了多久,那就得用“保持裕量” WHS,THS进行衡量。

多说一嘴,建立时间要满足时序路径中最慢的信号也要符合要求,因此称为最大分析。保持时间要保证时序路径中最快的信号也要满足要求(不能在保持时间之前变换),因此称为最小分析。

     在理解了裕量的概念之后,我们可以开始研究“裕量”究竟应该怎么进行计算了。

建立时间裕量

                 在图示的时序路径中,Clock是时钟源的时钟,由于布局布线等因素,该时钟上升沿到达reg1的时钟端口Clock1时会有一小段延时,Clock1的上升沿也被我们称为启动沿。

        从启动沿到寄存器Q输出数据还有一小段延时,即,并且数据经过寄存器间的数据通路时还会有一小段延时,即。因此我们可以得出:

数据到达时间 =时钟基准(0ns)+ (3.2ns)++(0.8ns) = 4ns

         同理,很容易计算数据被捕获的时间边界为:

数据锁存时间 = 时钟基准2(10ns)+(2ns) - 建立时间(1.4ns)= 10.6ns 

因此可以知道,

建立时间余量 =  数据锁存时间 - 数据到达时间 = 6.6ns(即图中蓝色部分)

        只要建立时间裕量是正值,则说明我们的设计是符合要求的,如果为负值则说明不满足建立时间的要求,容易产生亚稳态等问题。 

保持时间裕量

 

         保持裕量的计算和建立裕量差不多,其核心为:

保持时间裕量 = 数据保持时间 - 数据锁存时间 

对于数据保持时间:

数据保持时间 = 数据到达时间(4ns) + 数据周期时间(Sig In = 10ns) = 14ns

对于数据锁存时间:

数据锁存时间 =  时钟基准2(10ns)+(2ns) + 保持时间(1.4ns)= 13.4ns  

因此,数据的保持时间裕量:

保持时间裕量 = 数据保持时间 - 数据锁存时间 = 0.6ns 

        如果保持时间裕量为负,则说明数据在保持时间之前就发生了改变,因此将不满足保持时间的要求。

学习计算裕量的目的

        其实,在开发过程中并不需要我们去手工计算裕量,因为EDA软件将帮助我们计算。那为什么我们还要学习裕量的计算呢?其实这就是一种“从哪里来,到哪里去”的道理,我们心中要明白,这个时序裕量是怎么计算的,当我们遇到不满足裕量要求的情况时,我们能明确地知道问题的出处,以及解决问题的方法。

有关一起学时序分析之建立/保持时间裕量的更多相关文章

  1. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

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

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

  3. 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

  4. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  5. 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

  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

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

  8. ruby-on-rails - 如何让 datamapper 与 postgresql 数据库一起工作? - 2

    我已经找到了几个使用datamapper的示例,并且能够让它们正常工作。不过,所有这些示例都是针对sqlite数据库的。我正在尝试将数据映射器与postgresql一起使用。我将datamapper中的调用从sqlite3更改为postgres,并且我已经安装了dm-postgres-adapter。但它仍然不起作用。我还需要做什么? 最佳答案 与SQLite不同,PostgreSQL不将数据库存储在单个文件中。在你拥有createdyourdatabase之后,尝试这样的事情:DataMapper.setup:default,{:

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

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

  10. ruby - 了解在 Ruby 中与 lambda 一起使用的 inject 行为 - 2

    我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject

随机推荐