分析走线延迟之前咱们先把握手型接口的异步fifo顶层封装顺带提一嘴。
因为前文中提到的使能型接口的异步fifo中,我们的存储单元是用寄存器搭建的,所以在读取信号有效时数据当拍就会输出。也就是说数据和读取行为是同拍的,那么我们就可以直接在其上层封装一层接口,调整为握手型接口的异步fifo。
如果读取有效和数据不同拍的话怎么办呢,在前文已经提过了两种方式:ram封装wrapper和读取ram时进行预读。当然了也有第三种方式,就是把读取信号作为ar通道,数据输出作为r通道,借助axi-sram的思路来完成对外的valid输出。
既然我们已经使用了寄存器作为存储单元,自然也就没有这个烦恼了,所以我们直接在使能型异步fifo的上层进行握手协议封装。封装的过程也很简单:
wire wfull;
wire rempty;
wire winc = (data_in_valid && data_in_ready);
wire rinc = (data_out_valid && data_out_ready);
assign data_in_ready = !wfull;
assign data_out_valid = !rempty;
只需要把wfull转换为data_in_ready ,把rempty转换为data_out_valid就可以啦。验证环境的搭建和同步握手fifo没有什么太大区别,看下波形就可以了:
zv1vsuuxk4464024566008.jpg
异步fifo内的走线问题分析,我们先把异步fifo内的结构图放出来:
ueuel2pp1oj64024566108.jpg
该结构有以下几个要点:
1.数据单元置于写侧,读取时不进行跨异步直接进行数据选取;
2.写指针打三拍向读时钟域同步,在读时钟域进行“空”状态判定;
3.读指针打三拍向写时钟域同步,在写时钟域进行“满”状态判定;
结构里同步时钟域下的走线我不需要关心,按照同步逻辑进行时序检查即可。那么这里面有几条异步路径呢?
xppjzj0ldsi64024566208.jpg
三条:分别是数据走线、写指针走线和读指针走线,那么分几种情况进行一下讨论。
写指针走线太慢
写指针走线时间太慢,是相对谁慢了呢?肯定是相对于data或者说相对于数据走线延迟。假设fifo为空且写入了第一个数据,写指针走线太慢,那么数据已经稳定在缓存中了但是读侧在很长时间后才察觉到“非空”开始给后级信号,那么会导致后级模块读取数据的不及时。
比较典型的一个场景是,慢时钟同步到快时钟,因为后级时钟更快,在后级没有反压的场景下一般我们预期异步fifo也不会对前级反压。但是如果写指针走线时间太长(比如走了100clk_wr才走到clk_rd域的寄存器D端),如果fifo深度不够,很可能会反压写侧的前级模块。那这个时候怎么补救呢?只能加深fifo的深度了。
因此,写指针走线太慢不会有功能问题,但是会引发性能问题。如果对性能没有要求,那这条线的max_delay是可以适量放宽松的。在不放宽的情况下,写指针的走线延时一般约束为小于快时钟周期的70%(这个地方是快时钟还是慢时钟我有些忘了,倾向于快时钟周期的70%)。
写指针走线太快
写指针走线时间太快,实际就是数据的走线太慢了。数据的走线可以慢一些么?可以,因为数据是不需要跨异步的,但是数据走线延时不能太大。内在的关联是,写指针在本时钟域打1拍,再经过3拍跨异步后,同raddr进行逻辑运算判断可读对外输出非空状态时,数据必须已经抵达并稳定再读时钟域的数据出口,那么此时读时钟采样才能采到正确的数据。
如果数据走线延时过大,写指针指针已经完成同步并且下游判断可读,那么读取到的就是旧数据或亚稳态信号,会发生功能错误。
因此,如果写指针是3拍跨异步,那么数据的异步走线延时一般最大为Twr+2Trd(如果是ram,本身从winc有效到可输出就需要2Twr时,此处数据的走线延时一般最大为2Trd;如果在fifo中读侧数据有打拍输出,那么数据的走线延时最大也是2Trd),毕竟还要满足读侧时钟采样setup_time和hold_time嘛;如果写指针是两拍跨异步,那么数据的异步走线延时一般最大为Twr+1.5Trd。这个是比较硬性的约束,如果不满足则后端要重新摆放cell,避免功能问题。
读指针走线太慢
读指针走线时间太慢的影响,实际就是写侧更新读指针不及时,会影响“满状态”的判定。假设fifo为满且读侧已经读取了一个数据,此时都指针走线太慢,虽然数据已经被读走但是写侧在很长时间后才察觉到“非满”,进而才撤销给前级的反压。那么这样会导致前级写入数据不及时,造成不合理的断流。
因此,读地址走线太慢不会有功能问题,但是会引发性能问题。如果对性能没有要求,那这条线的max_delay是可以适量放宽松的。在不放宽的情况下,读指针的走线延时一般要求小于快时钟的70%。
读指针走线太快
以我目前的经验来看,没有影响,如有错误请大家指正。 |