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. Asp.Net Core MVC在View中,根据用户权限动态生成菜单

    1. 用户登录时,将用户的权限写入Cookie: //将需要的信息写入claims后 var identity = new ClaimsIdentity(claims, IdentityConstan ...

  2. String、StringBuffer和StringBuilder比较

    从执行速度效率来说: String为字符串常量,一旦创建就不能修改,第一次创建一个String对象,实例化后有初始值:当第二次创建String对象后,再次赋值,表面上看是改变了第一个String对象的 ...

  3. JMeter-SHA256加密算法接口测试

    前言 我们已经学过了如何利用python脚本对SHA256加密接口进行测试,还没学会的小伙伴们可以看回我写的随笔Python-SHA256加密算法接口测试,那么,对于SHA256加密算法接口,我们如何 ...

  4. WPF - 简单的UI框架

    实现了一个简单的WPF应用程序UI框架 ,分享出来.界面效果图如下: 运行效果如下: 喜欢的可以下载源码参考:https://github.com/DuelWithSelf/WPFEffects 左侧 ...

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

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

  6. 容器技术之LXC WEB管理工具LXC WEB Panel

    前一篇博文中主要说了下,lxc容器在Linux上的简单管理,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12901493.html:今天我们来介绍下lxc的图 ...

  7. (Redis基础教程之六)如何使用Redis中的List

    如何在ubuntu18.04上安装和保护redis 如何连接到Redis数据库 如何管理Redis数据库和Keys 如何在Redis中管理副本和客户端 如何在Redis中管理字符串 如何在Redis中 ...

  8. 简单而面试中又常见的知识点:JS执行机制

        在开始讲解之前,我们先来看一段代码: console.log('1'); setTimeout(function() { console.log('2'); process.nextTick( ...

  9. scrapy五大核心组件

    scrapy五大核心组件 引擎(Scrapy)用来处理整个系统的数据流处理, 触发事务(框架核心) 调度器(Scheduler)用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. ...

  10. java排查故障

    java排查故障top -Hp 31327 #或top -p 31327,再按shift+h,-H则是线程开关,传入该参数的话,top界面会显示所有单独的线程列表) ##31327为java进程,拿到 ...