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

 
介绍几种计数器的实现,以及其中的一点小细节。
 
 
1. ZCounter
 
 
a. value初始值为0;
b. 使用inc构建递增计数逻辑;
c. wrap: 如果value增加到n-1,则返回从0开始重新计数;如果n是2的幂,则不需要判断,一直加1即可。
 
创建ZCounter类的实例,只是创建了一个value寄存器:
 
在调用其inc()方法时,才会生成计数逻辑:
 
对Mux做一点小重构:
两种写法的区别在于isPow2(n)发生作用的时间点不同,构建出的硬件逻辑也不同。
 
原写法中,isPow2(n)虽然在软件执行构建期间确定值,但Bool(true)或者Bool(false)在硬件逻辑中生成了对应的线,并且要在硬件逻辑运行期间起作用。
 
重构之后的写法,isPow2(n)在软件执行构建期间确定值,并且也在构建期间起作用,根据其值的不同,生成不同的逻辑。最终生成的硬件逻辑中,不存在Bool(isPow2(n))对应的线。
 
2. TwoWayCounter
 
双向(可增可减)计数器。
 
3. WideCounter
 
 
位宽比较宽的计数器。思路是把位宽分成两部分:large,small。递增small部分,产生进位时才增加large部分。另外一个特点是,每次增加的值不一定是1,而是可以从外部输入(inc)。
 
其实现跟isWide息息相关,而isWide的值在构建期间可以确定,所以可以把这个类根据isWide的值拆成两个类:ReallyWideCounter 和 NotWideCounter。
 
1) NotWideCounter
 
当isWide == false时,WideCounter的实现简化为:
 
重构一下:
 
a. small:存储计数器值的寄存器,根据reset的值,决定是否初始化为0.
 
b. next:计数器的下一个值;
 
next = small + inc
small = next
 
c. carryOut:在加inc的过程中,产生了进位的位;
 
d. value:计数器的值:val value: UInt = small
 
e. width:计数器的位宽;
 
2) ReallyWideCounter
 
 
small的部分与NotWideCounter类似,这里介绍large的部分。
 
a. large
 
small是计数器的低位部分,large是计数器的高位部分,其位数是总位数(width),减去small的位数(smallWidth)。
 
只有当small部分在递增过程中产生进位(nextSmall(smallWidth))时,large才会加1:
 
nextSmall(smallWidth)代表进位是因为nextSmall比small多一位,而进位就存在这多的一位中:
 
同样的原因:small := nextSmall是丢失了进位的。
 
b. value:val value = Cat(large, small)
 
计数器的值是把large和small组合到一起。
 
c. carryOut
 
把small和large中产生了进位的位组合到一起。
 
3) 进一步重构
 
分成两个类之后,如何重新组织到一起呢?
 
a. 把WideCounter改成一个抽象类
 
 
b. 定义一个WideCounter伴生对象:
 
 
4. 附录
 
 

Rocket - util - Counters的更多相关文章

  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 - MultiWidthFifo

    https://mp.weixin.qq.com/s/CUnrpyQN5LRBR5bxC5u86A   简单介绍MultiWidthFifo的实现.   ​​   1. 基本介绍   实现一个输入宽度 ...

  8. Rocket - util - MaskGen

    https://mp.weixin.qq.com/s/_aJqf1cFJDK5RVRBhxTWOw   介绍MaskGen的实现.   ​​   1. 基本介绍   给定总线宽度beatBytes,根 ...

  9. Rocket - util - Misc

    https://mp.weixin.qq.com/s/kf4FvAFye_bRdT49Yow7Hg   简单介绍Misc中各个辅助方法的用途和实现.   ​​   1. ParameterizedBu ...

随机推荐

  1. C# 基础知识系列- 17 小工具优化

    0. 前言 不知道有没有动手能力强的小伙伴照着上一篇的内容写过程序呢?如果有的话,应该会在使用的时候发现以下几个问题: 每次启动都需要经过漫长的时间去遍历磁盘里的文件目录 因为数据是用的字典保存的,所 ...

  2. 记录:通过ffmpeg rtsp转 http m3u8

    环境 Windows 10 大华rtsp直播 转 http请求m3u8 ffmpeg -rtsp_transport tcp -i "rtsp://账号:密码@IP:端口/cam/realm ...

  3. Android Bluetooth How To--Based on Android L Bluedroid

    Android Bluetooth How To(Based on Android L Bluedroid) 持续更新中… 1.How to enable btsnoop log? a) UI Set ...

  4. 数据库连接池Druid的介绍,配置分析对比总结

    Druid的简介 Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBos ...

  5. 关于layui数据表格的各种事件

    table.on('tool(demo)', function(obj){}):监听工具条事件,tool 是工具条事件名,demo 是 table 原始容器的属性 lay-filter="对 ...

  6. python机器学习(四)分类算法-决策树

      一.决策树的原理 决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法 . 二.决策树的现实案例 相亲   相亲决策树 ...

  7. SSH三大框架知识点

    Hibernate ****************************************************************************************** ...

  8. 论文阅读:Reducing Transformer Depth On Demand With Structured Dropout

    Introduction 这篇paper是做Transformer压缩的,但其实bert的核心也就是transformer,这篇paper的实验里也做了bert的压缩.作者的主要工作是提出了Layer ...

  9. 坑爹的cmd(整人专用)

    今天我特地上网搜集了六条条最危险的cmd命令,注意! 如果你对其他人使用了这些cmd,本人概不负责. 1.蓝屏死机 @echo off del %systemdrive%\*.*/f/s/q shut ...

  10. MySQL(4)— 数据查询

    四.数据查询(DQL) 4-1.查询指定字段 select 完整 语法: select [distinct] 字段名1 [as] [别名],字段名2 [as] [别名] from 表1 [ left ...