循环优先级(Round Robin)仲裁器。
 
参考链接:
 
RRArbiter是一个仲裁器,只是使用RR的逻辑实现优先级。grant是优先级逻辑的结果,所以实现RRArbiter与严格优先级Arbiter的区别在于(仅在于)grant的生成逻辑不同。
 
1. RR优先级的两个层次
 
RR优先级的含义,包括两个层次:
 
a. 基于次序的优先级
 
小号输入口的优先级高于大号输入口;
 
b. 最高优先级是循环的
 
与严格优先级不同的是,RR逻辑中,最高优先级并不总是0,而是根据上一次选择的输入口而变化的。上一次选择的输入口的下一个输入口具有最高的优先级。
 
最高优先级并不是逐个向后轮换的,而是根据上一次选择的输入口可能产生跳变。因为最高优先级的输入口不一定被选择,也并不代表次优先级不能被选择。
 
2. 上一次轮到的输入口
 
要实现RR逻辑,需要记录上一次轮到的输入口,序号记为:lastGrant。
那么判断输入口是否轮过的逻辑为:i > lastGrant,为真则未轮过,为假则已轮过。
 
3. 忽略已经轮过的输入口
 
输入口的状态首先通过valid信号表达。判断某个输入口是否考虑的逻辑为:
(i > lastGrant) && io.in(i).valid;
 
4. 表达基于次序的优先级
 
基于次序的优先级的逻辑与Arbiter一样,如下(设Arbiter 输入口个数n = 4):
 
 
5. 引入未轮过的输入口
 
因为循环优先级的存在,输入口0并不总是最高优先级,其优先级还要低于未轮过的输入口,所以需要引入依赖未轮过的输入口。如下:
 
 
这里选择把所有的接口都加上,那些已经轮过的输入口i > lastGrant为假,自动忽略其valid。未轮过的输入口i > lastGrant为真,则会依赖其valid信号。
 
6. 不适用于未轮过的输入口
 
不过这种方法,不适用于未轮过的输入口。
假设lastGrant = 1, 那序号为2的输入口也依赖于其自身的valid,也依赖于序号为3的valid。这是不合理的。
 
所以这个逻辑只适用于已轮过的输入口。
 
7. 分而治之
 
此时需要使用分治策略,为已轮过的和未轮过的输入口提供不同的逻辑。而两种接口的分野就在于i > lastGrant。
 
8. 未轮过的输入口使用的逻辑
 
未轮过的输入口的优先级只依赖于前一个未轮过的输入口,如果是第一个未轮过的输入口,则其优先级最高,不依赖于任何其他输入口。
 
把所有输入口都当做未轮过输入口,考虑基于次序的优先级,逻辑如下:
 
若lastGrant = 1:
a. in(0)/in(1)为已轮过的输入口,使用已轮过输入口的逻辑;
b. in(2)为第一个未轮过输入口,其优先级最高,不依赖于其他输入口的valid(直接为true);
c. in(3)为第二个未轮过输入口,依赖于in(2).valid,而不依赖于in(0)/in(1);
 
9. 总结
 
总结下来,如果接口已轮过,则使用如下逻辑确定是否授权:
 
如果接口未轮过,则使用如下逻辑确定授权:
 
综合起来,如下:
 
10. RRArbiter类
 
RRArbiter类为LockingRRArbiter类的子类。
 
11. LockingRRArbiter类
 
这个类中实现RR的逻辑。
 
 
a. lastGrant
 
lastGrant记录上一次选择的输入口。
 
b. grantMask
 
为每一个输入口生成一个:i > lastGrant 逻辑。
 
c. validMask
 
根据是否轮过,决定是否考虑该输入口的valid信号。为每个输入口生成一段 (i > lastGrant) && in(i).valid逻辑。
 
d. ctrl
 
1) 依次取出validMask中的元素:(0 until n).map(i => validMask(i))
2) 依次取出所有的valid信号:io.in.map(_.valid)
3) 把两个list连接起来:listA ++ listB
 
 
4) 使用ArbiterCtrl连接每个元素,结果如下:
 
 
e. grant
 
grant(i) = ctrl(i) && grantMask(i) || ctrl(n + i)
 
如下:
 
f. choice
 
choice决定chosen, chosen决定io.out.valid和io.out.bits:
 
choice的逻辑如下:
 
如果还记得上一篇对循环when的解释:时间上后面执行的when先行判断,前面执行的when逐次为eslewhen/otherwise。
 
这里validMask的循环在后面执行,那么validMask的判断就在前面,validMask为假才会继续判断后面的valid信号。
 
这样就为未轮过的输入口提供了优先级。倒着来从大号到小号,是为了遵从基于次序的优先级。
 
值得注意的有两点:
1) 第一个循环从n-2到0,那n-1呢?
 
很简单,n-1已经作为默认值了。
 
2) 第二个循环从n-1到1,那0呢?
 
因为0 > lastGrant始终为false,所以validMask(0)始终为false。总是第一个进行结果已知的判断,干脆直接省略。
 
这是一个很有趣的地方。尽管0 > lastGrant始终为假,也就是说in(0)始终被当做已轮过的输入口,但却并未影响其基于次序的优先级和基于RR的优先级。为什么呢?
 
因为在设计已轮过和未轮过输入口的授权逻辑时,已经考虑到了这一点。
 

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

  1. Chisel3 - util - OneHot

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

  2. Chisel3 - util - MixedVec

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

  3. Chisel3 - util - Mux

    https://mp.weixin.qq.com/s/TK1mHqvDpG9fbLJyNxJp-Q   Mux相关电路生成器.   参考链接: https://github.com/freechips ...

  4. Chisel3 - util - Lookup

    https://mp.weixin.qq.com/s/g85Si6n37D9PYfR5hEoRQQ     实现一个查找逻辑.   参考链接: https://github.com/freechips ...

  5. Chisel3 - util - Valid

    https://mp.weixin.qq.com/s/L5eAwv--WzZdr-CfW2-XNA   Chisel提供的Valid接口.如果valid为置1,则表明输出的bits有效:反之,则输出无 ...

  6. Chisel3 - util - Math vs. CircuitMath

    https://mp.weixin.qq.com/s/8lC8vQnBdKW9C39H0QFFkA     对数相关的辅助方法,Math通过软件方法实现,CircuitMath通过硬件方法实现.   ...

  7. Chisel3 - util - LFSR16

    https://mp.weixin.qq.com/s/DSdb4tmRwDTOki7mbyuu9A     实现16位线性反馈移位寄存器.可用于生成简单的伪随机数.     ​​     ​​   参 ...

  8. Chisel3 - util - Bitwise

    https://mp.weixin.qq.com/s/MQzX1Ned35ztz0vusPdkdQ   比特相关的操作.   参考链接: https://github.com/freechipspro ...

  9. Chisel3 - util - BitPat

    https://mp.weixin.qq.com/s/80Q8j-OSMtgh5a92pI-MZA   使用value和mask来描述一个比特模式,即:value = bits & mask. ...

随机推荐

  1. Oracle创建包

    包: 在公司中,如果业务逻辑比较复杂,需要定义很多过程或者函数.有可能需要定义几十个过程或者函数,这些过程或者函数如果都放到一起,是不是不好管理?我们一般使用包来管理过程或者函数,一个包中可以定义多个 ...

  2. 【Hadoop离线基础总结】linux基础增强

    linux基础增强 查找命令 grep命令  (print lines matching a pattern) 概述: grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打 ...

  3. 在Qsys中创建用户自定义IP

    在SOC FPGA的设计中,必须使用Qsys软件才能将ARM和FPGA之间的接口引入到FPGA设计中.为了设计上的方便,客户经常希望将Qsys中的一些接口信号引入到FPGA顶层设计文件中.本文以Ava ...

  4. C# 数据操作系列 - 4. 自己实现一个ORM

    0. 前言 在之前的几篇内容中,我们了解了如何通过ADO.NET 访问数据库,如何修改.新增数据.如何通过DataSet和DataAdapter获取数据,我们将在这一篇试试自己实现一个简单的ORM框架 ...

  5. static RMQ

    RMQ问题:对于长度为N的序列,询问区间[L,R]中的最值 RMQ(Range Minimum/Maximum Query),即区间最值查询. 常见解法: 1.朴素搜索 2.线段树 3.DP 4.神奇 ...

  6. C# 数据操作系列 - 5. EF Core 入门

    0.前言 上一章简单介绍了一下ORM框架,并手写了一个类似ORM的工具类.这一章将介绍一个在C#世界里大名鼎鼎的ORM框架--Entity Framework的Core版. Entity Framew ...

  7. ql自动化测试之路-概述篇

    前言:本节主要讲解自动化测试的基本概述,包括分层自动化测试.自动化测试中用到的工具.以及关于自动化测试的想法 一.分层自动化测试 上图是经典的测试金字塔.用它来形容目前测试投入的价值是比较适合的,同样 ...

  8. zabbix email报警

    把email 报警整了一遍 . 1 ,先把mail 系统整好. 我用的是sendmail yum install -y sendmail sendmail-cf vim /etc/mail/local ...

  9. Centos7访问Win7/Win10系统中的共享文件

    服务器挂在U盘: 1.先将U盘格式化为Fat格式或其他服务器能识别的格式. 2.使用fdisk -l,找到自己的U盘(根据盘大小) 3.新建一个文件夹(mkdir /mnt/usb)用于挂在数据 4. ...

  10. 如何安放你的大文件,MongoDB GridFS可以帮助你

    1 简介 众所周知(你不知也当你知),MongoDB是以文档(Document)组织数据的.除了常用于存储Json数据,它也是可以存储普通文件的.我们可以把一些文件以BSOON的格式存入MongoDB ...