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. E. A Simple Task

    E. A Simple Task 这个题目的意思是 给你一个由小写字母组成的字符串,有两种操作 i j k 如果k==1 那么就是就把i 到 j 的这个区间非递减排序. i j k如果k==2 那么就 ...

  2. mac下使用xampp中php显示1044/1045/1046(卸载xampp)

    问题描述 在mac下使用xampp,访问http://192.168.64.3/phpmyadmin/可以正常显示php页面,当创建数据库时提示1044也就是普通用户没有权限 问题猜测 猜测在使用xa ...

  3. 【Scala】利用akka实现Spark启动通信

    文章目录 思路分析 步骤 一.创建maven工程,导包 二.master进程代码开发 三.worker进程代码开发 思路分析 1.首先启动master,然后依次启动worker 2.启动worker时 ...

  4. 【Spark】RDD(Resilient Distributed Dataset)究竟是什么?

    目录 基本概念 官方文档 概述 含义 RDD出现的原因 五大属性 以单词统计为例,一张图熟悉RDD当中的五大属性 解构图 RDD弹性 RDD特点 分区 只读 依赖 缓存 checkpoint 基本概念 ...

  5. Day_08【面向对象】扩展案例1_测试项目经理类和程序员类

    分析以下需求,并用代码实现: 1.定义项目经理类 属性: 姓名 工号 工资 奖金 行为: 工作work 2.定义程序员类 属性: 姓名 工号 工资 行为: 工作work 要求: 向上抽取一个父类,让这 ...

  6. 字节码编程,Javassist篇一《基于javassist的第一个案例helloworld》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 目录 @ 目录 目录 一.前言 二.开发环境 三.案例目标 四.技术实现 五.测试结果 1. ...

  7. indexDB解决过的难题

    我第一次使用indexDB是1年前(2018年10月),运用这个黑科技,解决过3个异常棘手的问题(如果不是indexDB 几乎找不到其他解决方案)所以我经常强调,前端一定要学indexDB! 难题一: ...

  8. Codeforces Round #635C Linova and Kingdom 思维

    Linova and Kingdom 题意 现在有一颗n个节点的树,每个节点是一个城市,现在要选出k个城市作为工业城市,其他城市作为旅游城市,现在每个工业城市要派出一名特使前往根节点,每个特使的幸福度 ...

  9. 第一章 Windows内核概述

    第一章 Windows内核概述 这一章节描述了Windows内核知识中最重要的几个概念,这些话题在这本书之后会有更详细的描述,那些会与当前的主题密切相关.要确保你理解这个章节的概念,因为这些概念构成了 ...

  10. HDU 3874 Necklace 区间查询的离线操作

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=3874 对需要查询的区间按右端点排序,然后从左到右依次加入序列中的元素,同时更新,更新的方法是,把上一次出 ...