https://mp.weixin.qq.com/s/yO_9Ec3S5-AosRVLpsBgOg

 
简单介绍基于通道位置的队列(LanePositionedQueue)的实现。
 
 
1. LanePositionedDecoupledIO
 
包含多个lane的ReadyValid接口,其中:
a. maxVliad & maxReady:valid和ready信号的数量;
b. validBits1 & readyBits1:表示valid和ready的数量所需要的比特数;
c. lanes:包含多少个数据通路;
d. ready:允许输出数据的个数;
e. valid:可以输出数据的个数;
f. bits:我方要输出的数据:同时输出lanes个T类型的数据;
 
相较于ReadyValidIO,有如下的区别:
a. bits包含多个通道的数据;
b. ready/valid有多个位;也就是说ready/valid不是一个标志位,而是一个值;
 
2. LanePositionedQueueIO
 
使用LanePositionedDecoupledIO数据传递接口的队列接口。
 
其中:
a. lanes:通道数;
b. depth:队列深度,即队列中可以存放的元素的个数;
c. laneBitsU:表示lanes的数量所需要使用的比特数;
d. enq: 入队的接口;
 
入口的宽度为lanes,即一次最多可以入lanes个元素,即maxValid = lanes;而最多可以入队depth个元素,即maxReady = depth;
 
e. deq:出队的接口;
 
出口的宽度为lanes,即一次最多可以出lanes个元素,即maxReady = lanes;而最多可以出队depth个元素,即maxValid = depth;
 
f. enq_0_lane:没有使用,略;
g. deq_0_lane:没有使用,略;
 
3. LanePositionedQueueModule
 
 
4. LanePositionedQueue
 
 
5. LanePositionedQueueBase
 
基于通道位置的队列基本实现。因为是基本实现,不能直接使用,所以应该是抽象的:
其实现类似于表格,把每个元素置于对应的行(row)列(lane)。
 
1) io
 
通道数为lanes;队列深度为rows * lanes,即每行lanes个元素,总共有rows行。
 
2) capacity:容量,可以存放的元素的个数,即:rows * lanes;
3) rowBits: 表示行号所需要的比特数;
3) laneBits:表示通道号所需要的比特数;
4) laneBits1:没有被使用,忽略;
5) lane()
 
计算向后移动add个元素之后,下一个lane的编号,以及是否发生了换行;
 
a. 入队
 
入队io.enq.valid个元素,enq_lane表示入队之后下一个lane的编号,enq_wrap表示是否发生了反转即换行。
 
b. 出队
 
出队io.deq.ready个元素,deq_lane表示出队之后下一个lane的编号,deq_wrap表示是否发生了换行。
 
6) row()
 
 
根据是否发生了换行,计算入队之后,当前行号以及下一行的行号。
 
 
a. 入队
 
当前行号:enq_row,下一行的行号:enq_row1;
 
b. 出队
 
当前行号:deq_row,下一行的行号:deq_row1;
 
7) delta
 
入队的元素个数与出队的元素个数的差值:
 
这是一个有符号数,也就是说可以为负值。
 
8) used & free
 
队列(表格)中已有的和空闲的单元格的个数。
 
9) position
 
a. enq_pos:入队单元格的序号;
b. deq_pos:出队单元格的序号;
c. diff_pos:enq_pos和deq_pos之间的单元格数;
d. 已用的和空闲的单元格数量之和为队列容量:assert(used + free === capacity.U)
e. used == diff_pos,或者队列满:assert(used === diff_pos || (diff_pos === 0.U && used === capacity.U))
 
10) io.enq.ready & io.deq.valid
 
不考虑pipe和flow:
io.enq.ready表示允许入队的元素的数量,io.deq.valid表示允许出队的元素的数量;
 
断言:
a. 入队数量不超过允许入队的数量:assert(io.enq.valid <= io.enq.ready)
b. 出队的数量不超过允许出队的数量:assert(io.deq.ready <= io.deq.valid)
c. 入队的数量不超过lanes:assert(io.enq.valid <= lanes.U)
d. 出队的数量不超过lanes:assert(io.deq.ready <= lanes.U)
 
11) enq mask
 
vmask指valid对应的mask,rmask指ready对应的mask,lmask指lane对应的mask。
 
a. UIntToOH1(x, width):生成一个宽度为width的mask,低x位为1,其余的高位为0;
b. 2 * lanes:生成一个宽度为2*lanes的mask。意义:本行和下一行总共两行的mask。
c. +& enq_lane:低enq_lane位为1,在vmask/lmask/lmask中皆是如此;
d. io.enq.valid +& enq_lane:原有的元素所在的单元格,以及新入队元素对应的单元格,所对应的mask位都置为1;
e. io.enq.ready +& enq_lane:原有的元素所在的单元格,以及后续io.enq.ready个未使用的单元格,所对应的mask位都置为1,截取其中的低2*lanes位;
f. vmask & rmask:为1的mask位包含两部分:(enq_lane, 0],(io.enq.valid + enq_lane, enq_lane];
g. & (~lmask):把位(enq_lane, 0]置0;
 
 
撇开最后会被清零的位段(enq_lane,0],其余部分的意义如下:
a. enq_vmask:本次入队io.enq.valid个元素所在单元格对应的位;
b. enq_rmask:当前行及下一行空闲单元格对应的位;
c. enq_lmask:当前行中已有元素对应的位;
d. enq_mask:本次入队io.enq.valid个元素所在单元格对应的位;
 
PS. 因为断言:assert(io.enq.valid <= io.enq.ready),所以vmask中的位少于rmask中的位。在计算enq_mask时,是否仍有必要使用vmask & rmask?
 
12) deq mask:参考enq mask;
 
 
13) deq_bits
 
输出到io.deq.bits,但是输入没有实现。这也是LanePositionedQueueBase需要标记为抽象类的原因之一。
 
14) maybe_empty
 
可能为空,并不一定为空。
a. 当入队换行和出队换行中只有一个发生时,更新maybe_full的值;
b. 因为入队换行和出队换行每次只换一行,所以当两个同时发生时,maybe_full的值不变;
c. 当入队没换行,出队发生换行时,maybe_full为真;
d. 当入队换行,出队没换行时,maybe_full为假;
 
总结一下:当出队追上入队所在的行时,可能为空。
 
15) bypass
 
从deq_lane开始的lanes个单元格,如果是空闲的(!set),则直接把所对应的通道(i)上io.enq.bits(i)的值,透传给io.deq.bits(i)。
 
a. row0:入队行与出队行相同,并且是出队行追上入对行;
 
 
b. row1:入队行 = 出队行 + 1;
 
 
c. !row0 && !row1:入对行与出队行之间隔了一个或者多个行;
 
 
d. deq_lmask中:(deq_lane, 0]为1,(2*lanes, deq_lane]为1;
 
e. 从deq_lane开始的lanes个单元格是否空闲,还是容易推导的,这里不再表述;
 
 
6. FloppedLanePositionedQueueModule
 
继承自LanePositionedQueueBase的可实例化的队列实现。
把队列内存分成两个bank:
 
分别从各自的bank中输出:
 
分别向各自的bank中写入:
 
7. FloppedLanePositionedQueue
 
简化创建FloppedLanePositionedQueue的方法。
 
8. OnePortLanePositionedQueueModule
 
因为没有使用,这里不做略去不做介绍。
 
9. 附录
 

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

  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. 基于KepServer实现与S7-1200PLC之间的通信

    对于学习上位机开发,有一种通信方式是必须要了解的,那就是OPC是OLE for Process Control的简称,然而随着技术的不断发展,人们开始对它有了新的定义,比如Open Platform ...

  2. Python Serial 串口基本操作(收发数据)

    1.需要模块以及测试工具 模块名:pyserial 使用命令下载:python -m pip install pyserial 串口调试工具:sscom5.13.1.exe 2.导入模块 import ...

  3. MYSQL 日月周季年分组

    首先准备几条测试数据 DROP TABLE IF EXISTS `test`;CREATE TABLE `test` ( `n_id` int(11) DEFAULT NULL, `d_created ...

  4. .netcore 部署时遇到413 Request Entity Too Large 和 413Payload Too Large 的问题

    .netcore3.1 遇到一个webapi 上传大文件问题 首先,在kestrel模式调试模式下上传 会报错413, 需要在三个地方添加 1.startup中 这里设置的2g最大值 2.在progr ...

  5. [csu1605]数独(精确覆盖问题)

    题意 :给定数独的某些初始值,规定每个格子的得分,求得分最大的数独的解. 思路:这是某年的noip的原题,高中时就写过,位运算也就是那个时候学会的--.这题明显是暴搜,但是需要注意两点,一是需要加一些 ...

  6. Gradle 多环境URL请求设置

    在开发过程中,多环境配置是经常遇到的,比如在Android开发过程中,在不同环境上请求服务器的URL是不同的,使用Gradle进行管理,是非常方便的. 首先查看工程目录结构: 使用AndroidStu ...

  7. centos6 升级gcc 无法识别的命令行选项“-std=gnu++1y”的解决办法

    npm install 提示: 1.下载源文件,并安装: wget http://people.centos.org/tru/devtools-2/devtools-2.repo mv devtool ...

  8. pyppteer下

    目录 启动pyppteer 切图 获取响应头,响应头状态,cookies 获取当前页面标题 获取页面html 第一种:获取整个页面html 第二种:只获取文本 注入JS,控制上下滚动 选择器 获取元素 ...

  9. springboot使用redis的keyspace notifications 实现定时通知

    简单定时任务解决方案:使用redis的keyspace notifications(键失效后通知事件) 需要注意此功能是在redis 2.8版本以后推出的,因此你服务器上的reids最少要是2.8版本 ...

  10. 避免scrollview内部控件输入时被键盘遮挡,监听键盘弹起,配合做滚动

    1,监听键盘 2,根据当前键盘弹起高度与控件的底部位置计算滑动距离 3,根据滑动距离在键盘弹起和隐藏是分别设置动画完成滑动     实现: 1,监听键盘使用   #pragma mark - 键盘监听 ...