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

 
实现队列模块,先入先出(FIFO)。
 
参考链接:
 
 
1. QueueIO
 
队列(Queue )输入输出接口,entries为队列的容量。这些接口的方向都是从队列的角度来定义的。
 
a. enq:队列输入接口。
 
b. deq:队列输出接口。
 
c. count:当前队列的深度。
 
2. Queue
 
a. 继承自Module
 
 
b. 接口
 
 
c.内部变量
 
1) ram为队列使用的内存;
2) enq_ptr为入队时使用的指针;
3) deq_ptr为出队时使用的指针;
4) 队列状态指示:empty/full;
5) 当前是否在入队或出队:do_enq/do_deq;
 
因为enq_ptr/deq_ptr都是Counter类型,Counter是循环的,即到达最大值之后就返回从0开始。所以队列也是一个循环队列。
 
d.入队
 
如果do_enq置位,则把入队数据(io.enq.bits)存下来,并递增指针;
 
入队需要队列处于ready状态,只要队列没有full,则可以接收数据:
 
e.出队
 
如果do_deq置位,则递增出队指针;
 
 
出队需要deq接口处于valid状态,只要队列没有空,则io.deq.valid为真;
 
f. maybe_full
 
maybe, 名字取的很贴切。可能满,也可能没有满。
 
 
如果正在入队和正在出队状态的值不一致,则更新maybe_full。
 
分为四种情况:
1) 正在入队(do_enq = 1),没有出队(do_deq = 0)
 
只有入队,没有出队,则队列有可能满。
 
2) 没有入队(do_enq = 0),没有出队(do_deq = 0)
 
队列中元素个数未变,不更新maybe_full的值。
 
3) 正在入队(do_enq = 1),正在出队(do_deq = 1)
 
正在入队,也正在出队。每一个clock最多只入队一个,只出队一个。没有变化,不更新。
 
4) 没在入队(do_enq = 1),正在出队(do_deq = 1)
 
队列中元素个数在减少,不可能满。
 
g. full/empty
 
 
当入队和出队指针相同时,有可能是空也有可能是满,此时需要使用maybe_full来做一个指示性判断。
 
h. count
 
 
队列中元素的个数为:
会不会存在负数?不存在,value为无符号数。
 
抽象成形式 C = A - B。
 
假设队列容量为entries:
如果A > B,很好理解,元素个数 C = A - B;
如果A < B,发生了回环,元素个数 C = A + entries - B;
其中,A, B都会在entries处发生回环,从0开始。
 
1) 如果entries为2的指数
 
如果entries为2的指数即2^n,无论A/B的大小关系,元素个数的计算方法是一样的,即 C = A - B。
 
n为无符号二进制数,随意加多少2^n,值都不变。即 A - B = A + 2^n - B。
 
如3位无符号数,entries = 2^3 = 8:
3 - 5 = (3 + 2^3 - 5) % 2^3 = 6
 
需要处理的情形是当ptr_diff为0时,存在的empty/full两种情况。
 
这里存在两种情况,如果为maybe_full && ptr_match为0,则队列未满,使用ptr_diff;如果为1,则队列满,ptr_diff为0。
 
2) 如果entries不是2的指数
 
如果enq_ptr等于deq_ptr,则要看是empty还是full,如果为full,则count为entries;如果为empty,则count为0;
 
如果enq_ptr不等于deq_ptr,则要先比较大小。如果A > B,则使用 A - B,即ptr_diff;如果A < B,则使用A + entries - B,即entries.asUInt + ptr_diff。
 
i. pipe/flow
 

Chisel3 - util - Queue的更多相关文章

  1. Java中的队列:java.util.Queue接口

    队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作. Queue接口与List.Set同一级别,都是继承了Collection接口.Linked ...

  2. java中使用队列:java.util.Queue

    在java5中新添加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口.Queue使用时要尽量避免Collection的add()和 ...

  3. java.util.Queue用法

    队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头.队列中没有元素时,称为空队列. 在队列这 ...

  4. java中使用队列:java.util.Queue(转)

    队列是一种特殊的线性表,是运算受到限制的一种线性表,只允许在表的一端进行插入,而在另一端进行删除元素的线性表.队尾(rear)是允许插入的一端.队头(front)是允许删除的一端.空队列是不含元素的空 ...

  5. java.util.Queue(队列)的简单使用

    import java.util.LinkedList; import java.util.Queue; import org.junit.Before; import org.junit.Test; ...

  6. JDK源码(1.7) -- java.util.Queue<E>

    java.util.Queue<E> 源码分析(JDK1.7) -------------------------------------------------------------- ...

  7. java.util.Queue

    转载于:https://www.runoob.com/java/data-queue.html 队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList ...

  8. Chisel3 - util - OneHot

    https://mp.weixin.qq.com/s/Jsy8P3m9W2EYKwneGVekiw   独热码相关的电路生成器.   参考链接: https://github.com/freechip ...

  9. Chisel3 - util - MixedVec

    https://mp.weixin.qq.com/s/mO648yx4_ZRedXSWX4Gj2g   可以容纳不同类型的变量的向量.   参考链接: https://github.com/freec ...

随机推荐

  1. Spring官网阅读(十三)ApplicationContext详解(下)

    文章目录 BeanFactory 接口定义 继承关系 接口功能 1.HierarchicalBeanFactory 2.ListableBeanFactory 3.AutowireCapableBea ...

  2. Spring源码阅读 之 bean的注册

    在前面我们已经学习了配置的加载,读取,解析.现在我们已经能够将一份配置转变成对应的一个个beandefinition了,我们知道Spring是一个IOC的容器,那么我们如何将这个一个个beandefi ...

  3. 【漫画】JAVA并发编程之并发模拟工具

    原创声明:本文来源于公众号[胖滚猪学编程],转载请注明出处. 上一节[漫画]JAVA并发编程三大Bug源头(可见性.原子性.有序性)我们聊了聊并发编程的三个bug源头,这还没开始进入并发世界,胖滚猪就 ...

  4. NEON中的vshr vshl vext中的位移参数必须为编译时字面常量

    NEON中的vshr指令中位移数量参数必须为compile time literal constant,因为该参数是被encoded as part pf ARM instruction itself ...

  5. 使用elasticsearch搭建自己的搜索系统

    什么是elasticsearch Elasticsearch 是一个开源的高度可扩展的全文搜索和分析引擎,拥有查询近实时的超强性能. 大名鼎鼎的Lucene 搜索引擎被广泛用于搜索领域,但是操作复杂繁 ...

  6. js 调用webservice及nigix解决跨域问题

    前言 我们写一些简单的爬虫的时候会遇到跨域问题,难道我们一定要用后台代理去解决吗? 答案是否定的.python之所以适应爬虫,是因为库真的很好用. 好吧python不是今天的主角,今天的主角是js. ...

  7. java -> final与static 关键字

    final的概念 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对 ...

  8. Mybatis系列二-快速开发

    mybatis学习系列第二篇 分页 在网页中常常用到,在查询数据库内容并想将其输出的时候,因为有时有多组数据,一页展示过于突兀,所以会用到分页操作. 在sql用limit来分页. 首先是UserMap ...

  9. mysql5.6 thread pool

    从percona 的压测来看,确实很牛笔啊.提升很大. http://www.mysqlperformanceblog.com/2014/01/29/percona-server-thread-poo ...

  10. git pull 部分文件无法获取

    今天发现git pull origin master 的时候部分文件无法获取,然后学到了一个新方法: git fetch git checkout origin/master -- path/to/f ...