zoukankan      html  css  js  c++  java
  • Chisel3

    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
     
  • 相关阅读:
    利用反射技术修改类中的字段(成员变量的反射)
    Java长存!12个Java长久占居主要地位的原因
    撰写架构设计文档的心得体会
    做个正能量的程序员
    程序员如何提高自己的编程水平
    mysql查询优化
    MySQL修改最大连接数,没有my.ini文件,只有my-default,这怎么改呀?
    PDO 拿出來的 Float 數據跟数据库中的数据不匹配
    大量多级分类数据的获取、缓存、搜索查询 怎么设计最快 ?
    windows下MySQL5.6以上版本,如何通过修改配置文件来修改数据库的最大连接数啊?
  • 原文地址:https://www.cnblogs.com/wjcdx/p/10124651.html
Copyright © 2011-2022 走看看