分析说明: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的周期是没有关系的。
总结:数据的传递要搞清。这样就能明白要哪样的时序。
有了一天的时间将其写好。看来,事情认真了还是可以做好!!这个过程,结果。。。。2015.4.24 cornhill