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. 用Visual Studio2019自定义项目模板

    项目模板简介 众所周知,在我们使用VS新建项目时,都需要选择一个项目模板,如下图: 我们选择完项目模板进行创建,创建完成之后,可以发现项目中已经包含了一些基础的文件.例如MVC: 可以看到,MVC项目 ...

  2. Cassandra 简介

    Cassandra是云原生和微服务化场景中最好的NoSQL数据库.我信了~ 1. Cassandra是什么 高可用性和可扩展的分布式数据库 Apache Cassandra™是一个开源分布式数据,可提 ...

  3. centos7启动httpd服务失败:Job for httpd.service failed because the control process exited with error code.

    centos7启动httpd命令有两个可以用 service httpd start    systemctl start httpd.service 如果出现如下报错 Job for httpd.s ...

  4. flink流处理从0到1

    一.DataStream API之Data Sources(消费者之数据源) 介绍: source是程序的数据源输入,你可以通过StreamExecutionEnvironment.addSource ...

  5. 豹子安全-注入工具-显错注入-asp_POST_显错_SQLServer_GetWebShell

    豹子安全-注入工具-显错注入-SQL Server-上传WebShell 请看下列视频 . 该视频在停留10秒钟后开始. 或点击此处查看:豹子安全-注入工具-asp_POST_显错_SQLServer ...

  6. Crash-fix-1:PhoneWindow$DecorView{29b8ae38 V.E..... R.....I. 0,0-1160,607} not attached to window ma

    最近开始对APP上的Crash进行对应,发现有好多常见的问题,同一个问题在多个APP都类似的出现了,这里记录下这些常见的错误. crash log: java.lang.IllegalArgument ...

  7. Analysis分析器

    一.Analysis简介 场景执行过程中,loadrunner收集执行过程中的数据,存储在扩展名为.lrr的文件中,Analysis分析器打开这个文件,对文件信息进行处理,并生成图和报告. 数据分析不 ...

  8. 谈谈Java常用类库中的设计模式 - Part Ⅰ

    背景 最近一口气看完了Joshua Bloch大神的Effective Java(下文简称EJ).书中以tips的形式罗列了Java开发中的最佳实践,每个tip都将其意图和要点压缩在了标题里,这种做法 ...

  9. 7.2 Go type assertion

    7.2 Go type assertion 类型断言是使用在接口值上的操作. 语法x.(T)被称为类型断言,x代表接口的类型,T代表一个类型检查. 类型断言检查它操作对象的动态类型是否和断言类型匹配. ...

  10. 08-Python之路---初识函数

    Python之路---初识函数️ 程序员三大美德: 懒惰 因为一直致力于减少工作的总工作量. 缺乏耐性 因为一旦让你去做本该计算机完成的事,你将会怒不可遏. 傲慢 因为被荣誉感冲晕头的你会把程序写得让 ...