当前位置:网站首页>吃透Chisel语言.31.Chisel进阶之通信状态机(三)——Ready-Valid接口:定义、时序和Chisel中的实现
吃透Chisel语言.31.Chisel进阶之通信状态机(三)——Ready-Valid接口:定义、时序和Chisel中的实现
2022-08-02 06:45:00 【github-3rr0r】
Chisel进阶之通信状态机(三)——Ready-Valid接口:定义、时序和Chisel中的实现
上一篇文章以Popcount为例,介绍了带数据通路的有限状态机FSMD的写法与实现,对于后面写复杂的系统有很关键的指导意义。我们可以注意到,在FSMD的实现中,状态机之间的通信我们使用了Ready-Valid握手协议,这是一种常见的通信接口协议,但每次都这么写显然有点复杂。而Chisel中自带了Ready-Valid相关的函数DecoupledIO,用于对数据信号进行Ready-Valid协议的封装,这一篇文章我们就来学习这个重要又方便的函数。
Ready-Valid接口
子系统之间的通信可以泛化为数据的移动和用于流控制的握手。在上一篇文章的Popcount例子中,我们已经看到了一个用于输入输出数据的握手接口,这个接口就使用了Ready-Valid信号。
Ready-Valid接口是一种简单的控制流接口,包含:
data:发送端向接收端发送的数据;valid:发送端到接收端的信号,用于指示发送的数据是否有效;ready:接收端到发送端的信号,用于指示是否可以接收数据;
下面是Ready-Valid流控制的示意图:

发送端在data准备好之后就会设置valid信号,接收端在准备好接收一个字的数据的时候就会设置ready信号。数据的传输会在两个信号,valid信号和ready信号,都被设置时才会进行。如果两个信号有任何一个没被设置,那就不会进行数据传输。
Ready-Valid接口数据传输的时序
下图是当接收端在发送端准备好数据之前,就将ready置有效时(从第一个时钟周期开始)的时序图:

上图中,数据在第三个时钟周期准备好,同时valid置有效,此时ready信号和valid信号都被设置,数据传输进行。而在第四个时钟周期,发送端没有要发送的数据,接收端也没有准备好接受数据。如果接收端每个时钟周期都可以接受数据,那就叫作always ready接口,ready信号此时可以硬编码为true。
下图是当发送端在接收端准备好接收数据之前,就将valid信号设置时(从第一个时钟周期开始)的时序图:

数据传输发生在第三个时钟周期,同样从第四个时钟周期开始,发送端没有要发送的数据,接收端也没有准备好接受数据。类比always ready接口,我们可以想到是不是有一个always valid接口。确实,不过这种情况下数据可能在给出ready信号的时候不改变,我们只能简单地丢弃这个握手信号。
下图是Ready-Valid接口的另一种变化的时序图:

上图中,在第一个时钟周期,ready和valid同时被设置一个时钟周期,数据D1的传输也在这个周期进行。数据可以背靠背传输(每个时钟周期内),比如第四、第五个时钟周期内D2和D3的传输。(注意,这里的背靠背指的是连续两次,常用于NBA)
Chisel中的Ready-Valid接口
为了让两个模块通过Ready-Valid接口连接,必须要保证ready和valid都不依赖于彼此。由于这个接口实在是太常见了,所以Chisel里面定义了DecoupledIO,定义类似这样:
class DecoupledIO[T <: Data](gen: T) extends Bundle {
val ready = Input(Bool())
val valid = Output(Bool())
val bits = Output(gen)
}
使用它需要导入util包。这个DecoupledIO根据数据data的类型来参数化,用DecoupledIO封装后,可以通过接口的bits字段来访问data。
当然了,显然这个DecoupledIO接口是发送端的,而接收端的接口是完全反过来的,那么我们就需要使用Chisel中的另一个函数Flipped了。Flipped函数可以将一个Bundle内的输入输出全都颠倒过来,所以如果一个发送端的Ready-Valid数据接口定义如下:
val out = DecoupledIO(UInt(8.W))
那么接收端的Ready-Valid数据接口在定义时在外面再套一个Flipped就行了:
val in = Flipped(DecoupledIO(UInt(8.W)))
可能还存在这么一个问题,ready和valid信号是可能在被设置后、在没有数据被传输的情况下又取消设置。比如说,接收端可能ready了一些时间,但未接受到数据,又因为一些其他事件取消了ready;再比如发送端可能准备好了数据,valid了一段时间,但是在未发送数据的情况下又取消了valid。不管这种行为是否被允许,这不是Ready-Valid接口要讨论的内容,但是这需要被接口的具体用法来定义。
Chisel中使用DecoupledIO的时候,对ready和valid信号的设置没有要求。但是,Chisel中的IrrevocableIO类对发送端做了如下限制:
IrrevocableIO是ReadyValidIO的一个具体子类,当valid为1,ready为0时,能够保证bits的值不改变。也就是说,一旦valid为1后,他就不会变为0,直到ready也变为1。
需要注意的是,这只是一个约定,并不能通过使用IrrevocableIO类来强制规范(Irrevocable意思是不可撤销的)。
而AXI协议就为总线的每一个部分都使用了Ready-Valid接口,包括读地址、读数据、写地址和写数据。AXI协议限制接口一旦ready或valid被设置,那在数据完成传输之前就不允许取消设置ready或valid了。
结语
通信状态机部分到这里就结束了,这篇文章对上一篇文章中使用的Ready-Valid接口进行了详细介绍,对时序和Chisel中提供的DecoupledIO接口也进行了分析。复杂的、大型的数字电路内部各种模块的通信都可以泛化为通信状态机,所以通信接口也很重要。到目前为止,Chisel相关的内容已经基本结束了,但是Chisel的最强大的特性我们还没有详细学习,那就是作为硬件生成器。下一部分,我们将从Scala开始,详细说说Chisel作为硬件生成器的写法,允许我们写出参数化的硬件电路,极大地发挥可复用性。
边栏推荐
猜你喜欢

【ROS基础】map、odom、base_link、laser 的理解 及其 tf 树的理解

【心电信号】基于matlab心率检测【含Matlab源码 1993期】

你认同这个观点吗?大多数企业的数字化都只是为了缓解焦虑

yml字符串读取时转成数字了怎么解决

2022.07.31(LC_6133_分组的最大数量)

Expert Insights | 3 ways to seize innovation opportunities in a downturn

聊天机器人如何提升独立站的营销水平?

数据库概论之MySQL表的增删改查1

速看!PMP新考纲、PMBOK第七版解读

Facebook社媒营销的5大技巧,迅速提高独立站转化率!
随机推荐
反射课后习题及做题记录
File upload vulnerability (2)
PWA 踩坑 - 第一次加载页面后无法获取CacheStorage某些资源
Vscode连接远程服务器出现‘Acquiring lock on/home/~’问题
张驰课堂:六西格玛测量系统的误差分析与判定
System.Security.SecurityException: 未找到源,但未能搜索某些或全部事件日志。不可 访问的日志: Security
返回文件名问题
根据一个字段的内容去更新另一个字段的数据,这样的sql语句该怎么样书写
【云原生】如何快速部署Kubernetes
jvm 二之 栈帧内部结构
有趣的网站
牛客编程题中——需要处理输入较大数的题目
Vscode connect to remote server "Acquiring the lock on the/home / ~ 'problem
typescript ‘props‘ is declared but its value is never read 解决办法
【npm install 报错问题合集】- npm ERR! code ENOTEMPTY npm ERR! syscall rmdir
【图像去噪】基于matlab双立方插值和稀疏表示图像去噪【含Matlab源码 2009期】
【机器学习】实验2布置:基于回归分析的大学综合得分预测
交换网络----三种生成树协议
Swagger的简单介绍,集成,以及如何在生产环境中关闭swagger,在测试和开发环境中自动打开
Redis 常用命令和基本数据结构(数据类型)