大家好,欢迎来到IT知识分享网。
项目场景:
时钟分频器支持一分频,此一分频使用CKMUX产生,当divider配置为1时,分频器产生的时钟为输入时钟,否则为寄存器产生的时钟。
问题描述:
时钟分频器的divider默认为1分频,功能验证通过,当divider配置为2分频或者其它分频时,分频器的时钟会产生glitch。初始认为,glitch造成时钟驱动的寄存器的时序错误,即setuphold violation,导致寄存器的Q端输出为“x”态,导致仿真无法进行。后续debug发现,glitch时钟驱动的寄存器D端无数据变化,即一起保持不变,因此不存在采样数据错误的问题,什么导致不定态出现?
原因分析:
在后仿中,最常见的不定态,通常出现在几种情况:一种是,异步时钟之间的数据交互,主要体现在同步处理的datapath上,比如两拍延迟之中的第一拍,或者异步fifo的格雷码转换第一拍,这种通常的处理方法是异步处理的第一拍做notiming处理。另外一种是,同步电路中,出现的setuphold violation,引起寄存器采样错误,导致不定态出现。但是现在寄存器的D端并没有变化,因此没有setuphold问题。仔细看log,应该有类似“width”的violation log,此glitch驱动的寄存器才会出现不定态,寻找lib的相关地方,发现有PWM检查。因此正是glitch加在了寄存器的CK端,导致MPW的violation,因此寄存器输出为不定态。
解决方案:
首先,时钟上glitch是一种危险的行为,它可能导致后续所有fanout的寄存器处于一种不确定状态。使寄存器处于确定状态,最佳办法就是使寄存器处于(异步)复位状态,因此即使CK端出现glitch,复位仍然有效,寄存器状态仍然可控;或者在glitch发生之后,有足够时间复位此时钟fanout的所有寄存器。
其次,在glitch出现之前,在时钟之后的CG使能,即保证时钟不传递到寄存器,也可以解决。前提是CG在clk switch之后。
结论:
glitch除了引起频率变化导致setuphold violation之外,还有可能由于MPW的造成寄存器的不稳定。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/157380.html