分析说明:D2:目的寄存器;D1:源寄存器; edge2:下一个时钟上升沿;edge1:当前时钟上升沿;edge0:当前时钟上升沿的前一个时钟沿;如下图:

建立时间:触发器D2(数据要到达目的的地方)在时钟上升沿edge1(以edge1是当前的时钟上升沿)输入端的数据data1(data1是 edge0时D1打给D1的数据,或者说是edge0时刻D1的输出。edge0是edge1的前一个上升沿)的前一段时间t_setup要求data1 数据稳定(为什么要这样要求呢?)。很明显建立时间是对D2的输入数据的时间要求,或者说data1要在edge1来之前的某段时间内到达D2。

1、为什么要求建立时间呢?

为了使数据正确的锁存就需要数据是稳定的,如果知道触发器的实现电路的话。如果在edge1-t_setup到edge1这段时间有可能变动的话,就会造成不知道锁存的是1还是0,这就是所说的亚稳态情况之一。这样是不能使数据可靠传输的。所以需要建立时间。

2、数据data1(来自触发器D1,即数据源)要传输到D2的输入端,这个数据data1到达D2时间t12如何计算呢?

在 edge0来的时候之后的某个很小的时间t1(可以认为是触发器的传播延时),开始由D1出发,经过组合逻辑延时t2,到达D2(数据的目的地)。答案已 经知道t12= t1 + t2。(一定要注意当前时刻是edge1,对于t12的分析是以edge0作为参考时钟。为什么要这样呢?看3小点。)此时时钟到达D2,D1的差没有考 虑,即时钟抖动。还有t2一般都是给最大延时,最小延时即t2max, t2min。具体用哪个看???等等说。。。。

 

3、在当前时刻edge1的D2 data1建立时间的时候,那data1的数据在什么时候由D1输出呢?

再次强调建立时间是分析D2输入端的数据时间要求。此时刻即edge1,D2输入端的数据在哪个时刻由D1发出呢(假设在同步系统中,为什么要做这个假设呢?)?

肯定是在某个edge,或者说是……edge2,edge1,还是edge0,edge(-1),………。如果说在edge1的时候才开始发出??

想 想。。。。这是不可能满足建立时间的!推推看:假设edge1能够满足建立时间。要求是什么呢?要求clk 的edge1到D2要远远慢于D1在这里是多少:t12 + t_setup。这样所有的edge到达目的寄存器要至少慢于t(t组合逻辑的延时)+t_setup。 这样的同步系统我不知道如何实现。如果是在edge2,edge3,……时刻才发出data1,要满足建立时间是不是更不可能实现? 如果在edge0就开始了数据的传输,会有什么样的结果呢?很明显此时的数据data1有一个clk的时间来传输,因为提前一个clk D1就将data1发出,只要data1能在edge1 - t_setup的时刻前到达D2的输入端就可以满足建立时间了。这样分析的优点在哪?我也不太专业,反正这样分析感觉很对。这也是目前时序分析工具的默认 data1数据由D1出发的时间点。这也是要求的数据传输时序,实际硬件电路可是不管这些的所以这些只是我们希望的要求时序它只管数据在要求稳定的时候是 否稳定。后面的多周期也是如此。如果在edge(-1)就开始输出呢,会有什么样的结果?因为D2要求data1稳定的时间还是不变的即:edge1- t_setup。这样data1就有2 * clk的时间来传输了。很明显这样就更能满足在edge1-t_setup前就稳定的要求了。这就是系统工具(如quartus 的timequest)中用到的指定多周期。如edge(-2),edge(-3),……都是多周期分析了。

4、data1数据是如何走的呢?

假 设不是多周期(因为多周期分析我还没用到过,不会分析)在各个时刻data1数据的传输还是很容易搞错的。因为在edge1时刻D2的输出不是 data1,那此时D2输出的数据什么呢?肯定是edge(-1)D1的输出。data1在什么时刻输出呢?在edge2+t1(t1可以认为是触发器的 传播延时) 才从D2输出。这样就能解释为什么数据经过一层的触发器,就要多延迟一个时钟。如何才能使data1正确的由D2输出呢?或者说在edge0 时,data1如何才能正确的由D1输出呢?这就是要求满足保持时间。也就是说只有满足保持时间data才能正确的由D发出。只是要在保持时间要讨论的。

5、如何才算data1满足D2保持时间?

数 据到达D2的时间比D2要求数据稳定的时间要早,就说data1满足D2保持时间。假设是提前一个clk,则 t_q(这个不好描述,,,,在一个时钟周期内除了传输时间还剩的时间) = clk - t12,此时可以确定t12中的t2是用最小还是用最大的呢?为了分析的保险t2 = t2max,这样data1的到达时间就会晚点,这样就更有可能不满足D2对data1的建立时间。 只要t_q = clk - t2max - t1>t_setup(t_setup也是一个时间段),就说data1由D1输出满足到D2输入的建立时间。t_q>t_setup是相对 时间段。不是时间轴上的时间。如果能在时间轴上标出那就好了。我就不标了。我就写写:|t_q|(data1由D1输出到D2的时间轴上的时间)= edge0-t2max - t1, |t_setup|(D2要求data1稳定的时间轴的时间)= edge1-t_setup。这个时候满足建立时间的标准是|t_q|在时间轴的左边,|t_setup|在时间轴的右边 即|t_q|<|t_setup|。这个时候(edge1)千万不要想到data1在D2的输出,因为这个时候data1只要等着,还不到输出的时 候。

6、建立时间的余量t_setup_slack?

到这里就很 清楚了,就是data1到达了D2的一个clk内还剩的时间 减 D2要求的建立时间段就是建立时间的余量:t_setup_slack = t_q(在一个时钟周期内除了传输时间还剩的时间) - t_setup。即建立时间余量大于0,就可以满足data1由D1传输到D2,一个时钟周期内满足建立时间。

7、在Verilog中是如何体现这种建立关系的?

在Verilog中要产生触发器必须要这句 always @(posedge clk or negedge rst_n),有这句不一定产生触发器。看看下面的代码:

always @(posedge clk_200M or negedge rst_n)

begin if(!rst_n)

tx_start_flag <= 0;

else if(byte_flag == 1)

tx_start_flag <= 1; else

tx_start_flag <= 0;

end

byte_flag
也是 clk_200M同步产生的,并且最多只有一个时钟的高。 在这段代码中能检测到byte_flag ==
1吗?这里的tx_start_flag是一个触发器。byte_flag是一个触发器(数据源)的输出。 在clk_200M
edge0时刻,byte_flag输出数据1,此时会经过上面的判断执行tx_start_flag <=(非阻塞) 1;
此时分析的是建立时间,而且此时的tx_start_flag输出还是0。
这个时候的输出为什么还是0?不是已经运行了tx_start_flag <=(非阻塞) 1;
了吗?我的理解是tx_start_flag在edge0时刻的输出,是edge(-1)满足建立时间的值。还是这句话,建立时间分析的是输入,执行的这
句tx_start_flag <=(非阻塞) 1;
也只是给到tx_start_flag触发器的输入端在edge0,执行的tx_start_flag <=(非阻塞) 1;
还不会影响tx_start_flag(触发器)在edge0时刻的输出。在edge1时刻,byte_flag输出数据0,同过选择器会执行
tx_start_flag <=(非阻塞) 0;
此时tx_start_flag输出是1,是edge0满足的建立时间的等待要输出的(当然要满足保持时间)。总结这个always @(posedge
clk or negedge rst_n)的行为
1)给满足保持时间的输出,也即是上一个edge的满足建立时间的输入端,先更新输出。2)经过判断执行语句,触发器输入端满足建立时间。(输入,输出是
并发的没有先后,这里的1)是先执行完)。 到这里很明显只要byte_flag有一个高脉冲都会使tx_start_flag产生一个高脉冲。

==========================================

保持时间:在clk edge1(当前时刻)到达D2(目的寄存器)后的一段时间(t_hold),输入端的数据要稳定。只要满足在t_hold这段时间输入端的数据稳定,输入端的数据就能稳定的输出。

1、输出的时间是多少?


edge1到达D2后(没有考虑时钟到达D1,D2的差,或者是时钟偏移),假设此时输入端的数据稳定(因为只想知道输出要的时间,即假设满足建立时
间),数据输出需要的时间可以称为触发器的传输延时t1即要求的保持时间。如果真的要追究t1由哪些部分组成:这就要看触发器构成门电路,更细点的话要看
构成门电路的cmos的制作工艺(不知道理解对么,反正时间很短0.几个ns)。t_hold > t1。 可以估计保持时间应该很短。

 

2、什么会导致这一段的时间的输入端数据不稳定?


时序能控制的就是在edge1(为什么是edge1,而不是……edge(2),edge(0),edge(-1),……)时刻来自D1的输出
data1,经过一段时间t12(数据由D1出发到达D2的时间)到达D2,如果到达的时间破坏了edge1要输出数据date0(edge0时刻到达
D2的数据)。如果满足这种情况要求是 t12 < t_hold。
如果edge2时刻D1输出的数据data2要破坏edge1时刻D2数据data1的输出,有什么要求?D1,在edge2时刻输出的数据比edge1
时刻输出的数据跑的快。这是不现实的,因为data1,data2走的是同一条电路。而edge0就是要edge1输出的数据。总结:唯一破坏稳定性的理
由是t12 < t_hold。

 

3、保持余量?

首先要满足保持时间是稳定的即:t12 > t_hold, 才有保持余量。保持余量是:t12 - t_hold。但是其中还有个问题就是t2取
max还是min,为了是数据以最快的速度到达,即t2 = t2max。即t12 = t2min + t1 - t_hold。

 

4、data1破坏data0?

edge1时刻要满足保持时间的是data0(D2 edge1输出的数据),data1
是D1在edge1时刻的输出到D2为了满足edge2
D2的输出的建立时间。如果data1到达D2太快,有可能破坏D2在edge1输出输出的data0的数据。这种可能性小,但还是存在的。如D1_t1
= 0.06ns, t2 = 0.06ns(没有组合逻辑),D2_t_hold = 0.2ns,不考虑时钟偏移。t12 = 0.06 + 0.06 = 0.12ns < D2_t_hold = 0.2ns。这样的话和clk的周期是没有关系的。

总结:数据的传递要搞清。这样就能明白要哪样的时序。

setup/hold 分析的更多相关文章

  1. 分析setup/hold电气特性从D触发器内部结构角度

    上图是用与非门实现的D触发器的逻辑结构图,CP是时钟信号输入端,S和R分别是置位和清零信号,低有效; D是信号输入端,Q信号输出端; 这里先说一下D触发器实现的原理:(假设S和R信号均为高,不进行置位 ...

  2. setup&hold

    setup time:建立时间,也就是在时钟上升沿到来前,数据需要稳定的时间.hold time:保持时间,指的是在时钟上升沿到来后,数据还需要保持的时间.实际上设置setup time和hold t ...

  3. dvwa 源码分析(一) --- setup.php分析

    我们分析的第一个文件是setup.php,也是程序的安装文件. <?php define( 'DVWA_WEB_PAGE_TO_ROOT', '' ); require_once DVWA_WE ...

  4. Innovus教程 - Flow系列 - MMMC分析环境的配置概述(理论+实践+命令)

    本文转自:自己的微信公众号<集成电路设计及EDA教程> <Innovus教程 - Flow系列 - MMMC分析环境的配置概述(理论+实践+命令)>   轻轻走过,悄悄看过,无 ...

  5. 数字IC前后端设计中的时序收敛(二)--Setup违反的修复方法

    本文转自:自己的微信公众号<数字集成电路设计及EDA教程> 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教程. 考虑到微信公众 ...

  6. 论STA | 工艺、工具、分析的本与末

    人类从漫长的蒙昧中觉醒之后,不再依靠着奇装异服的巫师通灵来指导生活,巫师进化成了科学家,他们试图对周遭的一切进行概括.分类.抽象,于是有了化学.物理.数学等基科.比如一粒沙,它的化学组成是什么,物理特 ...

  7. TimeQuest 静态时序分析 基本概论

    静态时序分析 基本概念  [转载] 1.   背景 静态时序分析的前提就是设计者先提出要求,然后时序分析工具才会根据特定的时序模型进行分析,给出正确是时序报告. 进行静态时序分析,主要目的就是为了提高 ...

  8. Allegro16.3约束设置 (转载)

    原文地址:http://blog.chinaunix.net/uid-21198646-id-3212383.html 差分对的约束设置 第一步,差分对的设置 差分对的设置有很多方法,下面介绍两种最常 ...

  9. clock

    Prime Time中的clock分析包括: 1)Multiple clocks,clock from port/pin,virtual clock. 2)Clock network delay an ...

随机推荐

  1. easyui---panel(面板)

    panel笔记: EASYUI panel: class:easyui-panel,带有title 打开:onclick="javascript:$('#c').panel('open')& ...

  2. Python入门_汇总_未完待续

    if/elseif/else for while break continue 多重循环 list [] duple() dict {} set {[]} 函数 help(abs) 查看abs函数的帮 ...

  3. 如何减小SQL 的物理读,。

    1.dev time:1226 1个跑批 db_file_multiblock_read_count =128 60.05 (mins) 26-Dec-17 16:00:20 ~ 26-Dec-17 ...

  4. ssas 为绑定指定的大小太小,导致一个或多个列值被截断

    错误信息:ssas 为绑定指定的大小太小,导致一个或多个列值被截断 如果更改了某个维度或是事实表的字段长度,在处理CUBE时提示此错误,我们要做以下更新: 1.刷新数据源视图. 2.打开多维数据集,查 ...

  5. mysql 5.1 在Windows下重置root 用户密码

    在windows下:打开命令行窗口,停止mysql服务(这里不用进入mysql目录): net stop mysql 进入mysql安装目录的bin文件夹下 执行: mysqld --skip-gra ...

  6. 右侧导航栏(动态添加数据到list)

    页面样式 <style> .scroll { position: fixed; right: 5%; top: 5em; background: #ccc; display: none; ...

  7. php设计模式-单例

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例. <设计模式>对此的定义:保证一个类仅有一个实例,并提供一个访 ...

  8. <Android HAL 之路> HAL 简介

    HAL层概述 名称: HAL, Hardware Abstracting Layer,中文名字:硬件抽象层. 作用:对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节.向上衔接Andro ...

  9. Android--View事件传递

    Android--View事件传递 View事件传递首先要明白以下要素: 事件就是MotionEvent.该对象包含了传递的事件中的所有信息 事件的来源是Window(即PhoneWindow),包含 ...

  10. MySQL查询示例

    use test; create table t1(tid smallint(5) unsigned auto_increment,tname varchar(50),tkecheng varchar ...