Verilog双向握手的例子

zKa*_*arp 6 verilog processor computer-architecture

我正在完成一个项目,并且要求是我们处理器内部功能单元之间的双向握手.我知道它是什么,但它有什么"标准"或简单的例子吗?

我只能想到两个单元之间,当它们之间有数据线时,当X发送到Y时,会给出一个单独的"发送"信号.当Y接收到"接收"信号时,会在另一条线路上发送给X. 一旦X读取接收到的信号,它就会停止在数据线上发送数据并将发送的线路设置为0或Z.Y然后将接收信号设置为0或Z.

这都是同步的(在同一个时钟上).

这是一个有效的方法吗?我认为它可以在大规模上变得非常混乱,但我只是在一个简单的基于累加器的处理器上工作.

Tim*_*Tim 7

单个时钟域最常见的简单握手是有效/准备握手.

如果'X'发送到'Y',则X的输出为datavalid,Y的输出为ready.

当X有数据要发送时,它断言有效,并查看准备就绪.如果posedge时钟有效并且准备就绪,则X将考虑要发送的数据,Y将考虑要接收的数据.

这种方案的优点是您可以在每个时钟周期发送一个数据,而无需任何停机时间.如果有效仍然很高,则在有效/就绪后的下一个周期为高,则将其视为第二个数据包.

此外,没有要求Y在断言准备就绪之前等待看到有效,Y可以在任何时候接收数据时断言就绪.

您描述的方案是我称之为'req/ack 4阶段握手',因为它需要4个时钟周期来发送一个数据

1. req=1 ack=0
2. req=1 ack=1
3. req=0 ack=1
4. req=0 ack=0
Run Code Online (Sandbox Code Playgroud)

当跨越时钟边界执行异步请求时,这种接口会更好,因为它消除了两次解释数据包的任何可能性.但是,对于完全同步的接口,您不需要这样做.