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. Spring官网阅读(三)自动注入

    上篇文章我们已经学习了1.4小结中关于依赖注入跟方法注入的内容.这篇文章我们继续学习这结中的其他内容,顺便解决下我们上篇文章留下来的一个问题-----注入模型. 文章目录 前言: 自动注入: 自动注入 ...

  2. 图形学_Bezier曲线

    Bezier曲线由n个控制点生成,举个例子:当n=2时,点$P_0$.$P_1$之间遵从计算: $P_0=(1-t)P_0+tP_1$ 而推广为n维时,有: $P^n_0=(1-t)P^{n-1}_0 ...

  3. 【hdu5100】棋盘覆盖

    http://acm.hdu.edu.cn/showproblem.php?pid=5100 题目大意: 用1*k的木块铺n*n的棋盘,求多铺满多少个单位格. 方法: n < k,显然无解:n ...

  4. Coursera课程笔记----C++程序设计----Week3

    类和对象(Week 3) 内联成员函数和重载成员函数 内联成员函数 inline + 成员函数 整个函数题出现在类定义内部 class B{ inline void func1(); //方式1 vo ...

  5. C# 数据操作系列 - 6 EF Core 配置映射关系

    0. 前言 在<C# 数据操作系列 - 5. EF Core 入门>篇中,我们简单的通过两个类演示了一下EF增删改查等功能.细心的小伙伴可能看了生成的DDL SQL 语句,在里面发现了些端 ...

  6. Flutter RenderBox指南——绘制篇

    本文基于1.12.13+hotfix.8版本源码分析. 0.大纲 RenderBox的用法 通过RenderObjectWidget把RenderBox塞进界面 1.RenderBox 在flutte ...

  7. python-修改文件

    1.修改文件1 # fw = open('username','w')# fw.write('hhhh')# fw.flush()  #强制把缓冲区里面的数据写到磁盘上1.简单粗暴直接#  1.打开一 ...

  8. spring源码解析之前置知识点

    本文是作者原创,版权归作者所有.若要转载,请注明出处. 最近在看spring源码,但是spring的体系太庞大了,在这里记录一下阅读源码中遇到知识点 @PostConstruct 被注解的方法,在对象 ...

  9. React 中使用sass

    npm install node-sass-chokidar --save-dev package.json添加两行: "scripts": { 2 "build-css ...

  10. B. Sleepy Game 博弈搜索

    题意:给一个有向图和起点,然后只有一名选手,这名选手可以随意挪动棋子,最终不能动的时候走过的边为奇数边为Win并输出路径,否则如果有环输出Draw,否则输出Lose; 题目链接 知道状态数最多只有n* ...