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

 
简单介绍Xbar的实现。
 
 
1. 基本介绍
 
用于为Xbar的输入和输出连接生成内部的连接逻辑。
 
2. object TLXbar
 
定义了一些辅助方法。
 
1) assignRanges
 
 
把size放大到与之临近的2的幂,然后进行排序累加,确定新的范围。
 
运行结果如下:
 
2) mapInputIds
 
重新划定sourceId的范围:
 
3) mapOutputIds
 
重新划定sinkId的范围;
 
4) relabeler
 
re-lable,重新打标签的意思。这里是用于把fifoId重新赋值成为连续的整数值。
a. relabler返回的是一个无参函数:
b. 这个无参函数返回的是带一个整型值参数返回一个整型值的函数:
 
在diplomacy node中使用:
a. 首先,调用relabler返回一个函数名叫fifoIdFactory;
b. 然后,调用fifoIdFactory这个函数,返回一个函数名叫fifoIdMapper;
c. 最后,针对每个manager的fifoId调用这个fifoIdMapper函数,返回新的连续的fifoId;
 
5) fanout
 
根据select中各个位的值,决定是否把input转发到对应的输出口中。
a. 复制select.size份input类型的输出口filtered;
b. 逐个连接input和filtered中的输出口;
c. filtered(i).bits与input.bits连接:force用于一定生成这样一个扇出口,应该与优化有关;
d. filtered(i).valid由input.valid和select(i)的值决定,即要么被选择输出,要么只有一个输出口必须要从中输出;
e. input.ready由被选择的输出口的ready信号决定;
 
3. class TLXbar
 
1) 类参数
 
类参数policy是一个仲裁策略:
 
2) diplomacy node
 
diplomacy node用于与上下游节点连接,并进行参数协商。
 
A. clientFn
 
clientFn用于把Xbar看到的上游节点的参数,转换为下游节点看到的Xbar的参数:
a. 调整minLatency,client的最小延迟适用于下游节点发起的Probe消息;
b. 调整每个client的sourceId,使之落入新的范围;(这里是否假设原来的sourceId.start==0?)
 
B. managerFn
 
managerFn用于把Xbar看到的下游节点的参数,转换为上游节点看到的Xbar的参数:
a. 调整minLatency;
b. 调整endSinkId;
c. 调整fifoId;
d. 要求所有下游连接边的数据总线宽度相同;
 
3) lazy module
 
lazy module用于生成Xbar的内部逻辑。
这里主要是生成上游各个节点与下游各个节点之间的转发连接逻辑。
 
A. 所有输入边和所有输出边统一处理:
 
 
B. 输入边和输出边不能太多:
 
 
C. 输入边是否可以转发到输出边:
 
把输入边的可见地址范围与输出边的支持地址范围进行比对,如果有重叠,就存在从这个输入边项这个输出边转发消息的情况:
a. 一个输入边对所有输出边都存在是否可达的判断;
b. 每个输入边都有这样的一组判断值;
 
D. 输入边和输出边之间是否存在转发Probe消息的情况:
 
 
E. 输入边和输出边之间是否存在转发Release消息的情况:
 
 
F. 生成各channel的连接矩阵:
 
其中:
a. channel a/d有reachableIO决定;
b. channel b由是否发起Probe消息的ProbeIO决定;
c. channel c有是否发起Release消息的releaseIO决定;
d. channel e:这个单独讨论一下;
 
首先,Release和Acquire是一对消息,所以可以转发Release消息的配对,也会转发到Acquire消息;Acquire消息会触发Probe/ProbeAck消息,ProbeAck消息使用channel e;所以channel e由releaseIO决定。
 
其次,Acquire消息通过channel a发送,所以releaseIO实际上也部分决定了channel a的配对表。
 
G. 矩阵行列转置方法transpose:
 
 
H. 把输入边视角的配对表,转换为输出边视角的配对表:
 
 
I. 处理id
 
其中:wide_bundle是找到最宽线参数,用于生成转发连接逻辑。
 
J. 使用最宽的线参数,生成与输入边的连接:
 
 
K. 根据配对表,生成与输入边的连接
 
a. channel a
 
a) 如果没有输出边接收这个输入边的消息,那么直接关闭channel a;
b) 需要把source域做转换;
 
b. channel b
 
这里主要是把source与调整回来。
 
c. channel c/d/e
 
 
L. 根据配对表,生成与输出边的连接
 
 
a. channel a/b/c
 
直连即可:
 
b. channel d/e
 
需对sink域做处理:
 
M. filter
 
根据mask,选出相应的data:
 
N. 生成一个基于地址的转发函数表
 
a. port_addrs包含每个Port支持的所有地址集合;
b. routingMask是区分一个地址属于哪一个Port所需要比对的最少比特的掩码;
c. route_addrs是把Port支持的地址集合使用routingMask简化之后的转发地址表;
d. 映射的第一个元素是配对表;
e. 映射的第二个元素是一个函数,这个函数根据访问地址,生成一个转发表,表明是否转发到对应的Port;
 
O. 取出channel a/c的地址域:
 
这是一个序列,包含每个输入边的地址域:
 
P. 根据地址,确定请求消息的转发表
 
 
Q. 计算请求消息需要多少个beat:
 
 
R. 使用消息转发表生成转发扇出:
 
首先,针对一个输入边,生成到每个输出边的转发扇出;
其次,转置成为所有输入边到某一个输出边的扇出接口;
 
S. 生成仲裁输出逻辑:
 
以outs(i).a为例:
a. sink是outs(i).a;
b. portsAOI是所有输入边的扇出接口;
c. filter根据connectAOI过滤出会向其转发请求消息的输入边的扇出接口;
d. 仲裁器根据仲裁策略仲裁哪一个扇出接口的消息转发到outs(i).a;
 
T. unique
 
unique表示,如果输入边和输出边的配对表中只有一项,也就是输入边只连接到一个输出边,那么可以忽略地址转发表,而直接进行转发:
这样可以把fn(a)的逻辑优化掉。
 
这样导致:
a. requestAIO中的某一行为全1;
b. portsAOI中的所有扇出接口都会被选中:
 
但在仲裁时相应的扇出接口会被connectAOI(i)过滤掉:
 

Rocket - tilelink - Xbar的更多相关文章

  1. Rocket - interrupts - Xbar

    https://mp.weixin.qq.com/s/icPGf4KdSOudwuNpLxdo7w 简单介绍Xbar的实现. 1. 简单介绍 IntXbar主要用于把上游多个中断源的中断组合在一起,然 ...

  2. Rocket - tilelink - RegisterRouter

    https://mp.weixin.qq.com/s/DaJhf7hEoWsEi_AjwSrOfA   简单介绍RegisterRouter的实现.   ​​   1. 基本介绍   实现挂在Tile ...

  3. Rocket - tilelink - BusWrapper

    https://mp.weixin.qq.com/s/03BvgTNQtD75Guco6gUGQg   简单介绍BusWrapper的实现.   1. HasTLBusParams   定义SoC的挂 ...

  4. Rocket - tilelink - Nodes

    https://mp.weixin.qq.com/s/KJ8pVH76rdxPOZ1vE3QlKA   简单介绍tilelink对Diplomacy Nodes的实现.   ​​   1. TLImp ...

  5. Rocket - tilelink - AsyncCrossing

    https://mp.weixin.qq.com/s/v8plWCBD8vZkxykjJe4TCg   介绍AsyncCrossing的实现,主要介绍如何实现diplomacy Node和LazyMo ...

  6. Rocket - tilelink - mask

    https://mp.weixin.qq.com/s/Gqv09RIgSSg5VKe-wb4aGg   讨论tilelink中使用MaskGen生成mask的用法.   1. tilelink中的ma ...

  7. Rocket - tilelink - Parameters

    https://mp.weixin.qq.com/s/1I6DcONr0Mg7xiX8F1C7SQ   简单介绍TileLink相关的参数实现(具体问题暂时不展开,后续用到时再做分析).   ​​   ...

  8. Rocket - tilelink - Bundles

    https://mp.weixin.qq.com/s/jrqBg2AIpQogBrpwNXjmwg   简单介绍Bundles文件中对TileLink规范(1.7.1)的定义. 参考链接:https: ...

  9. Rocket - tilelink - TLBusWrapper.to

    https://mp.weixin.qq.com/s/jSnhBzU5_ayQCg5fWAcx-g 简单介绍TLBusWrapper.to()的实现.主要介绍确定this{...}对应代码的过程. 1 ...

随机推荐

  1. POJ3255(次最短路)

    描述 求1到n的次最短路 开个\(dis[maxn][2]\)的储存距离的二维数组,0储存最短路,1储存次短路 初始化全为正无穷,\(dis[1][0]=0;\) 然后遍历更新时,先尝试更新最短路和次 ...

  2. Java 函数式接口

    目录 Java 函数式接口 1. 函数式接口 1.1 概念 1.2 格式 1.3 函数式接口的使用 2. 函数式编程 2.1 Lambda的延迟执行 性能浪费的日志案例 使用Lambda表达式的优化 ...

  3. ubuntu18.04下mysql安装时没有出现密码提示

    前言: 一:配置 ubuntu 18.04 mysql 5.7.30 二:问题 ubuntu18.04下mysql安装时没有出现密码提示,安装后自己有一个默认的用户名以及密码 解决方案: 1. 在终端 ...

  4. 记录关于Android多线程的一个坑

    最近在写项目的时候由于联网用得比较频繁,就简单地封装了一个工具类,省得每次联网得时候都要把联网配置写一遍,代码如下: public class okhttp_plus { public static ...

  5. [hdu4552]最长公共前缀

    题意:给一个串s,求s的每个前缀出现次数之和. 思路:对于一个后缀i,设i和原串的最长公共前缀为k,则当前总共可以产生k个答案.因此原题转化为求所有后缀与原串的最长公共前缀之和.模板题.以下为通过模板 ...

  6. HDU 2006 (水)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2006 题目大意:给你几个数,求奇数的乘积和 解题思路: 很水,不需要数组的,一个变量 x 就行 代码: ...

  7. 曾经你说chrome浏览器天下第一,现在你却说Microsoft edge真香!呸,渣男!!

    曾经你说chrome浏览器天下第一,现在你却说Microsoft edge真香!呸,渣男!! 一个月前我每天打卡搜索的时候,老是有微软新版浏览器的广告.我刚才是内心其实是抵触的,直到我发现了它的奇妙之 ...

  8. Spring全家桶之SpringMVC(三)

    Spring MVC单个接收表单提交的数据   单个接收表单提交的参数 在实际开发中通过会在spring MVC的Controller里面接收表单提交过来的参数,这块代码该怎么去编写呢? 示例: 编写 ...

  9. QQ恢复解散后的群聊或删除后的好友的方法

    今天有一个群被一个管理员乱踢人,之后将群解散. 事后几分钟我在想有没有什么方法可以重新恢复的方法,之后进入了QQ的官网进行查找. 本来以为没希望了,但是奇迹发生了. 原来真的可以恢复! 恢复的详情: ...

  10. 00008 - layui 表单验证,需要验证,但非必输

    当使用layui的验证规则,比如 手机, <input type="text" name="userName" lay-verify="phon ...