https://mp.weixin.qq.com/s/CUnrpyQN5LRBR5bxC5u86A

 
简单介绍MultiWidthFifo的实现。
 
​​
 
1. 基本介绍
 
实现一个输入宽度为inW,输出宽度为outW,可存n个outW宽度元素的FIFO。
a. 如果inW == outW,直接使用队列(Queue)实现;
b. 如果inW > outW,则相当于每次输入多个元素,而输出只能有一个元素;
c. 如果inW < outW,则相当于每次输出多个元素,而输入只能有一个元素;
 
需要注意的是,n指的是FIFO中可以存储的宽度为outW的元素的个数。
 
2. 实现
 
1) io
 
​​
a. in: 输入,宽度为inW;
b. out: 输出,宽度为outW;
c. count: 队列内宽度为outW的元素的个数;
 
2) inW == outW
 
​​
 
输入输出宽度相等,直接使用队列实现。
 
3) inW > outW
 
​​
 
输入宽度大于输出宽度,先决条件:
a. 输入宽度是输出宽度的整数倍:
require(inW % outW == 0, s"MultiWidthFifo: in: $inW not divisible by out: $outW")
b. 队列可以存储整数倍个输入宽度的数据:
require(n % nBeats == 0, s"Cannot store $n output words when output beats is $nBeats")
 
也就是说:
a. nBeats表示inW中outW的个数;
b. n/nBeats表示队列中存放的inW的个数(n表示队列中存放的outW的个数);
 
具体实现如下:
a. 写端
 
每次写的宽度为inW,总共可写的个数为n/nBeats:
​​
 
b. 读端
 
把写端的数据转换为以outW宽度数据为单位的序列。
 
c. 输入
 
​​
输入以inW宽度为单位,head是输入序号;
​​
 
d. 输出
 
​​
​​
输出以outW宽度为单位,tail是输出序号;
 
e. size
 
FIFO中宽度为outW的元素的个数。
​​
如果输入一个的同时输出一个,size = size + nBeats - 1;
如果只是输入一个,size = size + nBeats;
如果只是输出一个,size = size - 1;
如果没有发生上述情况,size = size;
 
f. 可输出
 
队列中有宽度为outW的元素即可:
​​
 
g. 可输入
 
​​
这个实现是有问题的。
如果队列满之后,输出一个元素。此时size < n,但是无法输入。因为nBeats > 1,所以需要至少输出2个元素才能输入。
 
参考inW < outW的情况下out.valid的实现,就不是直接使用size与0比较:
​​
 
可以考虑改成:
​​
 
h. 队列中宽度为outW的元素的个数
 
​​
 
4) inW < outW
 
参考inW > outW的实现。
 
3. 附录
 
略
 
 
 
 

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

  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 - MaskGen

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

  8. Rocket - util - Misc

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

  9. Rocket - util - LanePositionedQueue

    https://mp.weixin.qq.com/s/yO_9Ec3S5-AosRVLpsBgOg   简单介绍基于通道位置的队列(LanePositionedQueue)的实现.   ​​   1. ...

随机推荐

  1. 线段树 区间加 gcd 差分 小阳的贝壳

    小阳的贝壳 如果线段树要维护区间gcd 这个很简单,但是如果有了区间加,维护gcd 就比较麻烦了. 这个首先可以证明的是 gcd(x,y,z)=gcd(x,y-x,z-y)   这个可以推到 n 个 ...

  2. java基础篇 之 集合概述(List)

    list,有序集合,元素可重复 LinkedList:底层用链表实现,查找慢,增删快.为什么?? ArrayList:底层用数组实现,查找看,增删慢.为什么?? Vector:跟ArrayList一样 ...

  3. 用Visual Studio2019自定义项目模板

    项目模板简介 众所周知,在我们使用VS新建项目时,都需要选择一个项目模板,如下图: 我们选择完项目模板进行创建,创建完成之后,可以发现项目中已经包含了一些基础的文件.例如MVC: 可以看到,MVC项目 ...

  4. SAP CSO1创建BOM

      1业务说明 此文档使用BAPI:BAPI_MATERIAL_BOM_GROUP_CREATE创建BOM 2前台实现 事务代码:CS01 输入行项目信息 保存即可 3代码实现 3.1调用BAPI 抬 ...

  5. CF#135 D. Choosing Capital for Treeland 树形DP

    D. Choosing Capital for Treeland 题意 给出一颗有方向的n个节点的树,现在要选择一个点作为首都. 问最少需要翻转多少条边,使得首都可以到所有其他的城市去,以及相应的首都 ...

  6. CF#633 C. Powered Addition 思维

    Powered Addition 题意 给出n个数字,现在你可以在第x秒,选择任意数量的下标,让这些位置上的数加上\(2^{x-1}\),问最快需要几秒使得数列变成一个非递减的序列. 思路 让求x的最 ...

  7. bash初始化小建议

    bash有一些很好用但已经常被人忽略的小技巧,谨以此文记录下…… 1. 给history命令加上时间 history的命令很好用,他可以记录我们之前做了哪些操作,有了这些记录,我们可以很快捷的重复执行 ...

  8. Navicat15 for Mysql激活教程

    1.下载Navicat Premium Navicat15链接:http://www.navicat.com.cn/download/navicat-premium,选择相应版本,这里选择window ...

  9. vue实例中created、mounted以及其他类型说明

    生命周期图示(图片来自coderwhy老师): 每个 Vue 实例在被创建之前都要经过一系列的初始化过程.例如,实例需要配置数据观测(data observer).编译模版.挂载实例到 DOM ,然后 ...

  10. 记一条sql语句优化

    傻瓜级的.此sql语句存在于分销王系统中. 查阅slow log ,时间设置1s 发现很多 SELECT r.*, goods_id, bn, name FROM sdb_goods_rate r, ...