Re: 请教 multi cycle 的 hold check
在0就对了
即使tool在3 check
你也要通过命令让它选择0来check
对,我知道这样-hold 3 是让PT 在0 check hold, 这个是“知其然”,我想从比较原始Logic的角度“知其所以然”!
以一个internal Path为例(不考虑CLK skew):
begin point: DFF1/CLK,(Tclk-q)
DFF1/Q 经组合逻辑 C 到DFF2/D,(Tc)
endpoint DFF2/D. (Tsu,Th)
1.对于single cylce的 hold check,是0到0的check,假设在clk edge 0前, DFF1/D 0->1, 那么DFF1/Q 在clk edge 0后0->1,如果组合逻辑C的delay太快(Tclk-q + Tc < Th),那么DFF1/Q在 0 edge 得到的值很快就传到DFF2/D,使得DFF2/Q在0 edge 后就可能0->1(或者是meta-stable),而正常来说,DFF2/Q的变化应该发生在clk edge 1, 所以对于single cycle的hold time 来说,各个delay的关系应该要满足 (Tclk-q + Tc >= Th)。
不知道我这个对于signle clycle hold time的理解是否正确。
如果不正确,请您指出。
如果是正确的,我想用同样的思想来推到multi cycle = 4 时的hold time check 为什么要在 clk edge 0 而不是clk edge 3?
实在愚笨,请大侠用我这种比较原始的思维方式解释一下。
多谢了!
单周期路径的时序分析,你的理解是正确的
对于多周期,如果单从纯逻辑上来讲,你有这种困惑是正常的,因为你只是片面的去理解了multicycle path,你只关注了他的check机制而没有关注设计机制
讲的简单点,例如时钟跳转时刻为0 4 8 12 ……
4周期路径
dff1在 0 4 8 …… 时刻发出预期数据
dff2在 4 8 12 …… 时刻接收预期数据
从设计层面,会有一定的机制保证dff1在1 2 3 5 6 7 …… 时刻不会接收上一级的数据或者dff2在5 6 7 9 10 …… 时刻接收的数据作废,一般情况下会有一个phase信号完成相关任务。
多谢回答,这个设计机制我可以理解,但是我还是不知道从这个设计机制如何去理解Hold的check?
就我的理解,当然可以将hold check point设置在3的位置,条件是在明确知道的信号从
DFF1/Q发出经过组合逻辑delay之后信号的变化沿会在时钟3和4之间某个时刻。
但是在一般情况下,设置multicycle时信号的变化沿会在0到4之间,这样需要把hold c
heck设置为0,不然hold slack 很有可能为负值。
举个反例吧,如果将hold check point设置3,但是上一级信号在0~3之间已经变化了,
setup slack将会很充裕。但是hold slack将会是一个负值,具体公式Tco+Tdelay-3xTc
ycle。
不知道有没有助你理解,欢迎讨论。
不知道这样理解对不对:
如kangtauu所说,设计本身要保证DFF1/D 的变化率是CLK的1/4,随之而来的也就是DFF1/Q,DFF2/D,DFF2/Q的变化率都是CLK的1/4,
所以hold violation的情况只会发生在:假设DFF1/D以1/4 CLK 频率toggle,在clk edg 0,发生0->1 跳变,当组合逻辑C的延时太快, Tclk-q + Tc < Th,那么DFF2/D 在edge 0 就用到了DFF1/Q端的新值1,导致DFF2/Q端在clk edge 0 就发生0->1(或者metastable)。如果不违反Hold,正常来说,在clk edge 0, DFF2/Q 的值应该为0,0->1的跳变应该发生在clk edge 4。
因为DFF2/D 只会关心 clk edge 0,4,8...的值,所以DFF2/D并不会关心clk edge 1,2,3,5,6,7...的值,也就是说DFF2/Q不会在clk edge 1,2,3,5,6,7...去采DFF2/D端的值,就算DFF2/D的值在clk edge 3 发生了跳变,也不会反映到DFF2/Q端去。这就是kangtauu最后提到的那个phase信号的作用吧。
简单的说就是不需要使用大量的时间去等待一个不需要等待的东西