前端设计中的一个设计小细节
先来看一个简单的场景
如上图所示,Master和Slave之间进行数据传递,有一个简单的握手。Master的输出口有一级缓存用来缓存数据。m_s_vld和s_m_rdy同时有效时,Master的DATA BUF数据被读走,同时VLD BUF更新为无效。我们重点关注缓存BUF的更新条件。
当VLD BUF为无效的时候更新,此时DATA BUF为空。DATA BUF和VLD BUF的更新逻辑分别如下:
如上图所示,在握手完成的时候清空缓存BUF,当缓存有空间并且m_vld有效的时候可以写入。这样的做法从功能上来讲没有问题,但是在某些场景下性能并不是最优。假设master足够快,m_vld连续多拍有效,并且Slave的接受能力强,可以连续接受多个数据,时序图如下:
可以看到在上图中,第3拍的时候m_s_vld出现了数据断流,但是此时m_vld还是有效的,即有效的master端数据无法及时传递出去。如果slave端也可以连续接收多个数据,握手次数多,则会出现多个bubble(第5拍,第7拍,第9拍