数字芯片设计中常见的三个握手协议

本篇文章转载自一道Nvidia的面试题

Valid-Ready Handshake

Valid-Ready是非常常见的握手协议,我们熟悉的AXI总线的核心就是Valid-Ready协议。Valid-Ready协议的时序图如下图

在这里插入图片描述

Sender 来驱动valid信号和payload也就是data信号,Receiver接受valid和data,返回给Sender ready信号。当Sender有数据要传输的时候,Sender就把valid拉高,并且保持住valid为高期间要传输的data必须保持稳定,等到Receiver拉高了ready,保持至少一个周期,那么我们就说握手完成,数据从Sender传输到了Receiver。 简单来说,只有当valid和ready同时为高的时候,数据在这个周期传过去。

Valid-Ready是适合高性能传输的协议,只要Receiver可以持续接收数据,那么可以一直将ready拉高,而如果Sender也持续有数据发送,那么可以在看到ready为高之后的周期继续驱动valid为高来传输下一个数据,这样相当于每一个周期都可以有数据从Sender传至Receiver,中间可以没有bubble。这也就是为什么AXI总线选择了Valid-Ready握手协议。

Valid-Ready在设计中有一点要注意:
对于Sender来说,不能依据ready来决定要不要拉高valid;
对于Receiver来说,不能依据valid来决定要不要拉高ready;

也就是说,对于Sender来说,只要你有数据要传输,你就应该拉高valid,而不要管ready是不是1。同理,对于Receiver来说,只要你可以接收数据,你就应该拉高ready,而不要管valid是不是1。如果不满足上面的要求,你很可能遇见Sender和Reciever互相等待彼此而数据无法传输的死锁现象。老李当年就犯过这个错误,很不幸,和老李设计模块通信的另一个模块也犯了这个错误,发生了如下的对话:
老李:你ready为0,说明你没准备好接受啊,那我就不给你valid信号;
老陈:我ready为0又不是说我真没有准备好,你只要有data给我,我只要看到你valid为高我的ready自然就立刻为高了。
老李:。。。

4-phase Handshake

4-phase handshake其实源自asynchronous design这个大的领域,简单说就是没有时钟驱动,数据的传输都是基于握手。但是老李在实际工作中发现,4-phase handshake其实在有时钟的IP设计中也经常用到,是一个常见且很robust的握手协议。
这个握手协议的时序图如下,方便描述,我这里还是画出了时钟clock
在这里插入图片描述

其中Sender来驱动req和data,Reciever来驱动ack。之所以叫4-phase,是指以下4个phase:
phase1: sender和receiver都是idle状态,req和ack都为0;如上图的cycle 0, 1
phase2: sender拉高req,等待receiver的ack为高,同时驱动要传输的数据,并保持住; 如上图的cycle 2, 3
phase3: receiver拉高ack,此时req和ack同时为高;表示receiver已经接受到了数据;如上图的cycle 4
phase4: sender看到了ack,知道数据传输完成,于是拉低req。如上图cycle 5
最后receiver看到req被拉低,从而也拉低ack,回到phase1,即上图的cycle 6, 7。
也就是每一次传输数据,都需要经过a->b, b->c, c->d的顺序变化。和valid-ready协议有相似点,但是也有不同点。

相似点:req(valid)变高的时候,sender就需要drive valid data

不同点valid-ready的valid在传输完一个数据之后可以不拉低,在下一个周期紧接着传输下一个数据,但是4-phase handshake必须要走完4个phase,即看到ack为1了之后必须要将req拉低,否则receiver的ack也不会拉低,receiver也不会认为一个新的传输开始。
由于4-phase handshake必须要走完4个phase,每次完整的握手只能传输一次数据,所以这种握手协议并不适用需要高速高吞吐率的数据传输。适用的场合更多的是对于数据传输延时要求不高,但是对于稳定性要求高的场合,即不能错过data。其实有的时候其实也不需要传输真正的data, req/ack本身可以自带一个握手的意义,表示完成一次握手,req/ack可以用来直接控制sender和receiver的状态机。

2-phase Handshake

理解了4-phase handshake, 2-phase handshake就很直观,直接上图
在这里插入图片描述
区别在于,2-phase handshake没有了phase3, phase4。当ack为1时,就认为第一次传输结束了。这个时候sender不需要drop req。只有当sender要继续发下一个数据的时候,才需要drop req,而receiver同样以toggle ack来表示数据接收成功。

这样我们看到,其实每一次req的翻转表示一次传输,不论是从0变到1,还是从1变到0。和4-phase handshake相比,在一个完整的4个phase里可以传输2次数据。

由于4-phase 要求req/ack握手结束后都要回到0,所以也称作RTZ(Return- to-Zero)协议。而2-phase的一次握手结束req/ack并不会回到0,所以也称作NRZ(Non-Return-to-Zero)。

2-phase尽管传输速度快,但是设计起来稍微复杂一点,因为要进行edge detection,同时由于每次req 翻转都代表了一个新的传输,所以sender和receiver的初始复位关系要很仔细地设计,否则容易产生一个不期望的garbage传输。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值