本文介绍了一种基于握手协议的数据广播方式。事实上,该场景可以简化为模块的一对多握手,并且下游的各个模块可以独立的完成握手(与之相对的是下游模块一起完成握手,相比之下,下游各个模块可以独立完成握手显然更加普适、灵活)。
下图展示了模块一对多握手的示意图:
模块一对多握手的rtl实现比较简单,其核心思想是用一个向量记录下游各个模块握手完成的情况,当所有模块均握手完成(该向量的值为全1)时,就可以完成上游模块的握手。事实上,为了引入不必要的气泡,只要该向量和当前下游模块的ready信号相或得到的结果是全1的,就可以拉高上游模块的ready信号完成握手。需要注意的是,当上游模块完成握手后,要将该向量的值复位为全0。
下面是模块一对多握手的RTL代码:
module handshake_split
#(parameter DATA_WIDTH = 32,
parameter CHANNEL