前言
最近也是沉迷于握手协议的研究,主要是用的太多了要是不自己写写用起来就很没底。
握手FIFO
在 【芯片前端】保持代码手感——握手型同步FIFO设计 里,在设计时候有一个feature就是“对外输出逻辑时序较优”,因此对外的输出(除了data)都是寄存器输出,这客观上就是断开了输入和输出握手。
在之前的博客里讨论过这个问题,valid和ready同时握手的场景一定是有的,对于上游valid时序较查同时下游ready时序较差的场景,或者说harden层边界握手协议需要长途跋涉的场景,都是需要把valid和ready都打拍的。而握手型的fifo对上游输出的ready是寄存器输出,对下游valid输出为寄存器输出,因此是满足这一需求的。但是美中不足,FIFO的data输出为MUX逻辑,因此data时序是比较差的,如果对于data时序不是很敏感,那么可以直接使用握手型fifo来进行握手打拍。
FIFO作PIPE
FIFO作为PIPE从代码上分析必然是可行的,那么我最开始的思路自然是例化一个深度为1的FIFO来隔离前后级的打拍。感觉自己是个天才,之前无论是单独隔前级的valid时序,还是隔后级的ready时序,都需要一个深度为1的寄存器组,现在也只需要一个就同时隔开前后两级,简直赚翻了!然后一仿真就发现了问题:
这东西,他断流啊!
然后分析下代码,就会发现问题在于FIFO里是没有bypass机制的,也就是cyc0有数据写入,那么cyc1时fifo就会反压前级,即使cyc1数据会在当拍被读取 。因此梦想破灭了,深度为1的FIFO肯定是用不了。那怎么办呢,把深度调到2呗:
嗯,这问题不就解决了吗!