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. GitHub上Asp.Net Core的源代码

    记录,备查. https://github.com/aspnet/AspNetCore/tree/master/src

  2. 读源码之Spring 核心内容

    为什么有这篇文档 工作两三年之后,总感觉什么东西都懂,但是什么东西又都不会.所以日常学习是很有必要的,俗话说学而不思则罔 ,思而不学则殆.所以我们要学思结合,学习的方法有很多,但是思考的深度或者说有没 ...

  3. leetcode485——最大连续1的个数(easy)

    一.题目描述 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意 ...

  4. Spring Cloud 系列之 Config 配置中心(一)

    服务配置现状 配置文件是我们再熟悉不过的,在微服务系统中,每个微服务不仅仅只有代码,还需要连接其他资源,例如数据库的配置或功能性的开关 MySQL.Redis .Security 等相关的配置.除了项 ...

  5. 【Spark】Spark必不可少的多种集群环境搭建方法

    目录 Local模式运行环境搭建 小知识 搭建步骤 一.上传压缩包并解压 二.修改Spark配置文件 三.启动验证进入Spark-shell 四.运行Spark自带的测试jar包 standAlone ...

  6. FOC中的Clarke变换和Park变换详解(动图+推导+仿真+附件代码)

    文章目录 1 前言 2 自然坐标系ABC 3 αβ\alpha\betaαβ 坐标系 3.1 Clarke变换 3.2 Clarke反变换 4 dqdqdq 坐标系 4.1 Park变换 正转 反转 ...

  7. CodeForces - 1209D Cow and Snacks 并查集

    CodeForces - 1209D 题意 现在n种点心,每种点心只有一份,有k位客人,每位客人有两种想要吃的点心,你可以安排他们进场的顺序,每位客人会吃掉所有他想要吃的,并且还没被吃掉的点心.如果客 ...

  8. [zoj 3416/hdu 3709]数位DP

    题意:求从区间[L, R]内有多少个数是平衡数,平衡数是指以10进制的某一位为中心轴,左右两边的每一位到中心轴的距离乘上数位上的值的和相等.0<=L<=R<=1e18 思路:由于任何 ...

  9. Springboot中修改.properties文件为.yml文件时项目不能运行问题

    可能很多小伙伴会考虑环境配置的问题,maven版本.idea版本什么的,其实没有必要 只要你之前.ies时能运行,那么环境配置就没有问题 不能运行的原因,一定是你的.yml文件的格式问题 .yml文件 ...

  10. jsp 中文乱码????解决

    中文乱码是个非常蛋疼的问题,在页面表单提交的时候后台获取数据变成了????,解决方案如下: 1:确认编码都是一致的如页面和后台都设置为utf-8 2:String str = new String(r ...