https://mp.weixin.qq.com/s/UHGq74sEd9mcG5Q3f-g3mA

 
介绍AddressDecoder的实现。
 
1. 基本定义
 
每个Port包含多个地址集合(Seq[AddressSet]),需要确定输入的地址是属于哪一个Port。
AddressDecoder的任务是在满足需求的情况下,找到需要比对的最少比特位。
 
其中,givenBits是确定要比对的比特位。如果givenBits已经可以满足需求,则不需要再找其他比特位。
 
2. 类型定义
 
 
3. partitionPort
 
根据AddressSet中bit对应位的值,把Port中的AddressSet分成两部分。
这里存在三种情况:
 
这样就把一个Port拆分为两部分分别称为一个Port。
 
4. partitionPorts
 
根据partitionPort的划分结果,把所有相似的Port搜集到一起。
 
case_a_ports中包含的port中的所有的AddressSet中,bit对应位的值为0;
case_b_ports中包含的port中的所有的AddressSet中,bit对应位的值为1;
 
5. partitionPartitions
 
根据partitionPorts的划分结果,把所有相似的Partition搜集到一起。
 
最初的Partitions中只包含一个partition,
根据第一个比特位的划分,把这一个partition分为两个partition;
根据第二个比特位的划分,把这两个partition分为四个partition;
。。。
 
每个partition中的port是bit对应位相同的port,亦即使用bit对应位无法区分的port。所以最终的目标是每个partition中只包含一个port,这样就可以把所有的port都能单独区分出来。
 
6. bitScore
 
对bit划分的结果进行评分,依据是均匀程度,越能把Ports进行均匀划分的bit位得分越高:
 
这里有一个疑似Bug:
根据命名规则,前两个度量使用max开头,使用max结尾;后两个度量应该是使用sum开头,使用sum结尾。但是第四个度量值使用sum开头,而使用max结尾。使用max结尾,使其意义与第二个度量值一样,显得冗余。所以应当是sum结尾。
 
7. recurse
 
从bits中,递归找到能对所有Port进行唯一区分的最有比特位集合。
 
8. AddressDecoder.apply
 
 
a. 确保任意两个Port中的地址集合不重叠,重叠的地址集合怎样都无法区分;
b. 找到所有要尝试的比特位;
c. givenBits包含了一定要比对的比特位,所以先使用其中的比特位进行划分;
d. 使用recurse找到bitsToTry中的最优比特位组合;
e. 与givenBits或在一起即为(为了确定address属于哪一个port,)所有要比对的比特位;
f. 验证结果:只考虑output中比特位的情况下,任意两个Port中的地址集合不重叠;
 
9. 使用实例
 
ahb/Xbar.scala(为提升可阅读性,已进行重构):
 
a. 找到所有的port:val port_addrs;
b. 找到区分port地址所需要的比特位:val routingMask;
c. 每个port中,只考虑routingMask中的位,所需要比对的地址:route_addrs;
d. 生成电路比对输入的地址(in.haddr)是否存在与每一个Port中,返回结果比特位(Bool);
 

Rocket - diplomacy - AddressDecoder的更多相关文章

  1. Rocket - diplomacy - LazyModule的组织方式

    https://mp.weixin.qq.com/s/vaDUekxkFkOJLmzg5jCngw 简单介绍LazyModule/LazyModuleImp的组织方式. 1. LazyModule L ...

  2. Rocket - diplomacy - LazyModule的实例化(补)

    https://mp.weixin.qq.com/s/rgCRorjPYyyD6i7moIzbZg   介绍LazyModule和Node构造方法的执行过程,即实例化过程.     1. NullIn ...

  3. Rocket - diplomacy - LazyModule的实例化

    https://mp.weixin.qq.com/s/9PsBt4_4qHx4i6C5XtuiUw   介绍LazyModule和Node构造方法的执行过程,即实例化过程.     1. NullIn ...

  4. Rocket - diplomacy - LazyModule

    https://mp.weixin.qq.com/s/FBU8fE4u9-UK6mRGQOlvbQ   介绍LazyModule的实现.     ​​   1. children   LazyModu ...

  5. Rocket - diplomacy - ValName

    https://mp.weixin.qq.com/s/so-2x5KLfYF0IMCCqNThwQ   简单调试ValName实现:   1. 使用     ​​   Desugar之后如下: ​​ ...

  6. Rocket - diplomacy - NodeHandle相关类

    https://mp.weixin.qq.com/s/GWL41P1G1BXm2sTeLmckdA   介绍NodeHandle相关的类.     ​​   1. NoHandle   顶层类(tra ...

  7. Rocket - diplomacy - DUEB参数模型的设计

    https://mp.weixin.qq.com/s/9PEEpe1pkQDN9RWpOGSUCQ   介绍DUEB参数模型的设计,不包含实现(实现对设计做了简化).     1. DUEB   di ...

  8. Rocket - diplomacy - 模块结构信息

    https://mp.weixin.qq.com/s/cTRxXwWNEeb4-XX_t4bRcg   讨论模块结构信息的来源及使用方式.     ​​   1. diplomacy   diplom ...

  9. Rocket - diplomacy - misaligned

    https://mp.weixin.qq.com/s/poCJBcx45clXHm6Uuv8M6w 介绍AddressSet.misaligned的实现.之前介绍的比较概括,也有偏差.这里根据实际执行 ...

随机推荐

  1. 001_python变量,if,while

    Python介绍 python的出生与应用 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时间, ...

  2. 【基础】excel如何根据数据内容显示不同颜色。

    需求: 店柜完成率排名相比上阶段升降,升显示绿色“↑“,降显示红色“↓”,持平显示黑色“-”. 步骤: 第一步 先计算两次排名的差值(本次排名-上次排名). 第二步 对差值列设置单元格格式,设置格式如 ...

  3. Java 多线程启动为什么调用 start() 方法而不是 run() 方法?

    多线程在工作中多多少少会用到,我们知道启动多线程调用的是 start() 方法,而不是 run() 方法,你知道原因吗? 在探讨这个问题之前,我们先来了解一些多线程的基础知识~ 线程的状态 Java ...

  4. 浅析Spring中AOP的实现原理——动态代理

    一.前言   最近在复习Spring的相关内容,刚刚大致研究了一下Spring中,AOP的实现原理.这篇博客就来简单地聊一聊Spring的AOP是如何实现的,并通过一个简单的测试用例来验证一下.废话不 ...

  5. Mysql常用sql语句(18)- union 全连接

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 其实Mysql并没有全连接,Oracle才有全连 ...

  6. JVM-Java内存区域与内存溢出异常

    第二章:Java内存区域与内存溢出异常 2.1 运行时数据区 1:程序计数器  : 线程私有,较小的内存空间,当前线程所执行的字节码的行号指示器,唯一不会发生错误的内存区域 2:虚拟机栈: 线程私有, ...

  7. Linux 命令行下搜索工具大盘点,效率提高不止一倍!

    在 Linux 命令行下进行文本关键字的搜索,大家肯定第一时间会想到 grep 命令.grep 命令确实十分强大,但如果需要用到它更加灵活的功能时,可能命令就会显得十分复杂. 于是,为了简化 grep ...

  8. 如何使用 frp 实现内网穿透

    这有一个专注Gopher技术成长的开源项目「go home」 背景 作为一名程序员,家里多多少少会有一些落了灰的电脑,如果把闲置的电脑变成服务器,不仅有良好的配置,还能用来做各种测试,那就再好不过了. ...

  9. Django使用channel实现websocket

    channel 什么是channel? channel是第三方工具包,对于不支持websocket协议的框架可以借助此包实现websocket 安装 终端安装: pip3 install channe ...

  10. android学习流程确立

    也是摘抄自网上,先打个基础吧,以后有更新,再更改. 确定学习路线:向着中级工程师奋斗Android入门的时候,需要有一本入门书,好好学习书中的内容,同时花一年时间把Android官方文档中的train ...