https://mp.weixin.qq.com/s/g7Q9ChxHbAQGkbMmOymh-g
ReadyValid通信接口。通信的双方为数据的生产者(Producer)和消费者(Consumer)。
通信协议:
1. Producer有数据要发送,则把Valid位置位为1;
2. Consumer准备好接收了,则把Ready为置位为1;
3. Producer发现Ready为1后,开始发送数据;
4. Producer发送完成后,把Valid置位为0;
5. 不排除Producer在等待一定时间后,未等到Ready置位,而把Valid清除;
6. Ready和Valid没有先后关系;
参考链接:
1. ReadyValidIO
这是一个用户自定义的数据类型,继承自Bundle。
其中:ready/valid分别代表ready和valid位;bits代表要传递的数据;
伴生对象object ReadyValidIO内部定义了一个隐式内部类,用于向ReadyValidIO类添加方法。
类的名字就叫做AddMethodsToReadyValid,已经表达了这个类的用意。与直接把这些方法定义到ReadyValidIO类中是等效的。这种定义隐式类的方法,是一种为现有类扩展方法的机制。
这四个方法代表了针对ReadyValidIO的四种操作,一种状态:
a. 有数据要发:enq()
b. 数据发完(无数据要发): noenq()
c. 有数据要收:deq()
d. 数据收完(无数据要收):nodeq()
e. 正在发送状态:fire()
2. Decoupled
3. Irrevocable
4. EnqIO/DeqIO
EnqIO创建Producer侧的接口;DeqIO创建Consumer一侧的接口。Flipped是把方向反转的意思。
EnqIO的方向如下:
这个方向是以Producer的角度来定义的。
DeqIO的方向为:
a. ready为Output;
b. valid为Input;
c. bits为Input;
这是以Consumer的角度来定义的。