关于异步FIFO的格雷码跨时钟域的约束
这样的条件如何用约束实现呢?
有些公司在clockA和clockB之间的触发器之间设定了max_delay。
有些公司直接clockA clockB之间set_false_path,后仿的时候看看。据说这样一直没有遇到过问题。从版图上也能看到PR tool把根据面积最小原则,异步fifo的逻辑总是摆在了一起,这样跨时钟域的Q->D本身线不会长,而且没有额外组合逻辑,这样也可以想到实现的结果不会太离谱。
那么问题来了,如果直接false path,可能会真实出现格雷码bit0延时500ps,bit1绕了5ns才到达的情况吗?
如果使用set_max_delay的话,取值应该如何算(其实delay不关心的,关心的是skew。在某FPGA上有set_max_skew,但是design compiler里没这个),还是有更好的办法?
第一句确认需要么?
如果格雷码skew大会有什么后果?要记得格雷码只有一个bit跳变。用二进制码又会怎么样?
另外,不要做组合逻辑转换格雷码然后再跨域,格雷码这时就没什么意义了
如果bit 0到达capture ff的延时太大,追上了其他bit的跳变,那么就破坏了格雷码每次只有一位跳变的规则,如果超过了其他bit,那么会采样出奇怪的数字来
变成奇怪数据又怎么样?
另外,再看看我最后一句
你最后一句是没错的,而且必须要做到。
如果数据奇怪了,那么判断空满会有问题,有些设计里统计fifo里的数据量也会不准确。
比如bit 0上,ff_clka.Q到ff_clkb.D之间线超远,延时超大,效果类似于穿进去了上百个buf(当然实际没这么夸张),但是在其他bit上线很短。
空满错的方向是什么?用二进制也会如此,空满信号也许不准确,那它错的方向是什么?
另外,既然本域格雷码是时序电路产生,那不能保证另外一个域看到的只有一个bit变化么?哪来的奇怪数据呢
异步fifo有时候是需要做一个约束,但不在格雷码这,在另外一个地方,如果coding正确的话。
我关心的是 如果clkA和clkB之间直接false path掉,那么究竟会不会pr出上面描述的不靠谱的电路来?
我当然说的是这里
不用急着回复了,我吃饭了哈,哈哈
我也吃饭去。你看我5楼回的。。。
看了啊,哈哈。毫不担心
吃完吃饱再说
为啥不担心这个。。。弄不懂吃不安心啊
Reconvergence问题,
据说一般没事
怎么说呢,假设担心成立。按你说的a域格雷码时序逻辑输出后到用b域同步前某一bit由于特别慢,导致下个bit的下次跳变追上了它,那你会怎么约束,在哪个clock一个周期之内?
假设两个clock不同频率也无固定相位关系
你把我想问的说出来了。。。
你觉得你的约束能解决这个担心么?
所以,那就回到前面某楼我的问题
如果采错产生不准确的空满会怎么样?空满错误的方向一般是什么?
虽然我自己有答案,还是希望你帮我确认下啊,哈哈
答案是啥
我也等着呢
参与讨论一下~
假设B采样到了A reg out的gray code, 其中有一些bit因为慢,是上一拍的,其它是本拍的,
如果这次跳变的bit在慢的里面,则本次gray code和上拍一样,如果跳变bit在正常的里面,则采样正确。
所以漏掉一次状态。
是的,这个也要考虑的,特别是大的design,快的时钟,但考虑的是max delay,不是skew,也就是说数据的delay要小于格雷码传递和转换和生成读信号所耗的时间(一般2-3个clock cycle),这样才能保证读的时候采样到正确的数据,否则采样到的还是上次的数据,新的数据还在传输中
但一般design小的时候,不管绕线怎么走都不会发生这个事情,所有大家就没有查,但对于design 特别大,时钟特别快的(G以上)还是需要check的
数据没有这个问题——地址/数据都是各自时钟域给出的