跨时钟域问题
“这个翻转的bit可能会给synchronizer的第一级引入metastable,但是最后synchronizer的输出无非就是保持前值或者是更新后的值”
这个我想插一句题外话问个小问题。
比如我想把单比特的1'b1 跨时钟域传递,肯定是用两个或者三个寄存器打一下,但是比如第一级寄存器每次在亚稳态稳定以后不变成1,总是变成0。
这种情况有吗?感谢!
答:
有可能,但是没关系,分两种情况,adata 0->1的变化,之前第二级bdata就已经是0了,然后第一级产生metastable稳定在0,从第二级来看这个一个cycle根本没有发生变化,然后下一个cycle第一级就变成了1,因为这一个cycle不会产生metasable,那么再下一个cycle bdata变成了1,这就是你看到的2个周期的delay。另外一种情况,adata 1->0的变化,之前第二级bdata之前是1,然后第一级产生metasable, 稳定在0,那么下一个沿过来第二级就直接拿到0,再下一个cycle 第一级也没有metasable了继续稳定在0,第二级也继续稳定在0,这就是你看到的1个周期的delay。这其实是我第一篇里讲的2flop synchronizer的值变化可能会需要1个cycle,也可能需要2个cycle,有随机性在里面。
非常感谢老李这么详细的回答。...............我突然意识到一个特别严重的问题,就是我一直认为:如果a信号想跨A时域去另一个时域B,a从1->0 并持续为0,那么B时域打两拍,b1r和b2r。我一直以为如果b1r在第一个时钟周期是亚稳态,那么下一个时钟周期还是亚稳态...然后一直亚稳态(大误)。。。。我看了你的回复我才反应过来,第一个周期的setup/hold不满足,但是对于第二个上升沿就很有可能满足了,那么第二个周期就是对的电平。。。非常感谢您的回复!
利用double flop,bdata发生变化可能是在adata翻转之后1个周期,也可能是2个周期,这是由于第一级flop的metastable可能会resolve在不同的值。如果第一级flop 稳定在和adata相同的值,那么就只需要1个周期就能看到bdata翻转。而如果第一级flop 稳定在和adata相反的值,那么则需要再多一个周期。所以在设计和仿真验证中,不能假定bdata一定会在2个周期之后发生变化,而是将这个因素随机在仿真中,有的时候真的会暴露出设计中的问题。

浙公网安备 33010602011771号