https://mp.weixin.qq.com/s/6McbqOKM4fu4J5vdpZvxKw

 
简单介绍异步队列(AsyncQueue)的实现。
 
0. 异步队列
 
异步队列的两端分属不同的时钟域,拥有各自的复位逻辑。
异步队列用于存值的一端为上游端(source),用于取值的一端为下游端(sink)。
 
1. AsyncQueueParams
 
异步队列的参数,包含如下几项:
a. depth
 
队列深度,表示队列可以存储几个元素;
 
b. sync
 
表示流水线的级数。
 
c. safe
 
使用valid来标识ridx和widx是否合法;是否要把一端的reset同步到另一端。
 
d. narrow
 
标识数据同步通道的宽度。如果数据同步通道为窄,则每次只同步一个数据。否则,为所有数据提供同步通道。
 
2. AsyncBundleSafety
 
 
safe相关要在队列两端同步的信号(这里略去不做详细介绍):
 
个人认为更名为AsyncSafetyBundle更好,因为本质上是一个Bundle,Safety是修饰词,前置为宜。如白马和马白不是同一个意思。
 
3. AsyncBundle
 
要在队列两端同步的数据,包括:
a. 待读取元素的索引号:ridx;
b. 待写入元素的索引号:widx;
c. 数据:mem;
d. 数据索引号:index;
e. safe相关的bundle(valid和reset);
 
c和d重构如下:
如果数据同步通道为窄通道,则mem这个Vec只包含1个元素,而index则是当前数据通道中元素的索引号。
如果数据同步通道为宽通道,则mem这个Vec包含depth个元素,每一个元素都有自己的同步通道,就不需要index来指示元素索引号了,所以此时index为None。
 
PS. option是一个隐式方法,定义如下:
 
4. GrayCounter
 
格雷码计数器。
 
5. AsyncValidSync
 
用于支持AsyncBundleSafety,这里不做具体介绍。
 
6. AsyncQueueSource
 
异步队列的上游端。上游端写数据。
 
1) io
 
a. enq:输入;
b. async:用于数据同步的端口;
 
2) 实现
 
a. enq
 
当对方valid,而我方ready,亦即io.enq.fire()时,把io.enq.bits存入mem中。
 
注意,此index为新定义的index,非io.async.index:
 
b. mem
 
也要注意区分mem和io.async.mem。
 
mem的定义为:
存储的元素个数为队列深度params.depth。
 
根据数据同步通道的宽窄,来决定同步一个,还是全部同步:
 
c. widx
 
source端为写端,widx是一个格雷码计数器,会被同步到sink端:
 
d. ridx
 
读取的元素索引号。sink端为读端。ridx从sink端同步而来。
 
e. ready
 
队列不满,则可以ready。
可以看到io.enq.ready也取决于sink_ready。在不考虑safe的情况下,sink_ready一直为true。
 
7. AsyncQueueSink
 
与AsyncQueueSource对应,这里略去。
 
8. FromAsyncBundle
 
x是一个AsyncBundle,构造一个sink端与之连接。从AsyncBundle到DecoupledIO,即From AsyncBundle to DecoupledIO。
 
9. ToAsyncBundle
 
x是一个ReadyValidIO,构造一个source端与之连接。从ReadyValidIO到AsyncBundle,即To AsyncBundle from ReadyValidIO。
 
10. AsyncQueue
 
创建异步队列的两端,并把它们相连。
 
CrossingIO定义如下:

Rocket - util - AsyncQueue的更多相关文章

  1. Rocket - util - Annotations

    https://mp.weixin.qq.com/s/7C8ZmPpwAqFqyKjL9K40Fg   介绍util中定义的注解(Annotations).   ​​   1. Annotation ...

  2. Rocket - util - Timer

    https://mp.weixin.qq.com/s/Z4JJhZ_jL1lqF1nf_orq9A   简单介绍Timer的实现.   ​​   1. 基本功能   实现定时器的功能.   2. Ti ...

  3. Rocket - util - Replacement

    https://mp.weixin.qq.com/s/zCP7wPuxgQ-r94Tr6BV5iw   简单介绍Replacement的实现.   ​​   1. 基本介绍   用于实现Cache替换 ...

  4. Rocket - util - ReduceOthers

    https://mp.weixin.qq.com/s/gbR5fuDbE_nUFVxw-p4rsA   简单介绍ReduceOthers的实现.   ​​   1. 基本介绍   输入一组Bool元素 ...

  5. Rocket - util - Repeater

    https://mp.weixin.qq.com/s/xyEq3DgYuf2QuNjssv8pkA   简单介绍Repeater的实现.   ​​   1. 基本功能   A Repeater pas ...

  6. Rocket - util - PrefixSum

    https://mp.weixin.qq.com/s/G2vLP-ncoJzSOgxGGEJkfA   简单介绍PrefixSum的实现.   ​​   1. 基本介绍   ​​ 把一个序列从前向后逐 ...

  7. Rocket - util - MultiWidthFifo

    https://mp.weixin.qq.com/s/CUnrpyQN5LRBR5bxC5u86A   简单介绍MultiWidthFifo的实现.   ​​   1. 基本介绍   实现一个输入宽度 ...

  8. Rocket - util - MaskGen

    https://mp.weixin.qq.com/s/_aJqf1cFJDK5RVRBhxTWOw   介绍MaskGen的实现.   ​​   1. 基本介绍   给定总线宽度beatBytes,根 ...

  9. Rocket - util - Misc

    https://mp.weixin.qq.com/s/kf4FvAFye_bRdT49Yow7Hg   简单介绍Misc中各个辅助方法的用途和实现.   ​​   1. ParameterizedBu ...

随机推荐

  1. N - Subpalindromes URAL - 1989 哈希+线段树

    N - Subpalindromes URAL - 1989 这个是一个哈希+线段树,这个题目也不算特别难,但是呢,还比较有意思. 这个题目给你两个操作,一个是回答l~r 区间是不是回文,一个是对一个 ...

  2. CC2530ADC转换

    一.ADC简介 ADC支持 14 位的模拟数字转换,具有多达12 位的 ENOB(有效数字位).它包括一个模拟多路转换器,具有多达8 个各自可配置的通道,以及一个参考电压发生器.转换结果通过DMA写入 ...

  3. Openwrt:编译固件提示[mktplinkfw] error: images are too big 错误

    在编译mr3420的固件时,添加了luci.jamvm,但是最终编译的固件"openwrt-ar71xx-generic-tl-mr3420-v1-squashfs-factory.bin& ...

  4. [codeforces 200 E Tractor College]枚举,扩展欧几里得,三分

    题目出自 Codeforces Round #126 (Div. 2) 的E. 题意大致如下:给定a,b,c,s,求三个非负整数x,y,z,满足0<=x<=y<=z,ax+by+cz ...

  5. [hdu5255]枚举

    思路:这题与csu1392题目类似,方法类似.枚举最高位,最低位和中间数字的长度,然后列等式,计算中间的数字,看长度是不是跟枚举的一致,需要注意的是中间数字可以有前导0,如果根据等式算出来的中间数字为 ...

  6. Sharding JDBC整合SpringBoot 2.x 和 MyBatis Plus 进行分库分表

    Sharding JDBC整合SpringBoot 2.x 和 MyBatis Plus 进行分库分表 交易所流水表的单表数据量已经过亿,选用Sharding-JDBC进行分库分表.MyBatis-P ...

  7. 最短路径——floyd算法代码(c语言)

    最短路径问题 昨天自己试了试写一下dijkstra的算法博客 dijkstra链接在这← 今天来更floyd算法,感觉非常简单果然暴力才是解决一切的王道 一.总体思想 floyd算法就是每一次从邻接矩 ...

  8. 3.7 Go指针

    1. Go指针 每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置. Go 语言中使用&作符放在变量前面对变量进行“取地址”操作. 1.指针默认值nil 2.通过&(取地值 ...

  9. redis 主从哨兵01

    主从复制过程 1.从服务器开始连接主服务器时,会向主服务器发送一个SYNC同步命令 2.主服务器接收到命令后,执行BGSAVE,异步的将写命令保存到一个缓冲区里 3.主服务器执行完BGSAVE之后,就 ...

  10. JQuery动态创建表单并提交

    // 捕捉链接的点击事件 $('#btn').click(function(){ // 取得要提交的参数 var my_val = $.trim($('#ipt').val()); // 取得要提交页 ...