https://mp.weixin.qq.com/s/YPFa6kE6I_Ud_MJGvzmS-g
简单讨论输入边/输出边Bundle的方向。
1. 上游节点的地址不重复
仔细看了一下sourceFn的实现:
其中要求上游节点中不存在重复的地址:
这样也就不存在decoded中存在两个元素同时为真的情况:
2. source.addr := sink.addr
在lazy module的实现中,把sink.addr输入到source.addr中:
而在DebugCustomBundle的定义中,addr的方向是Input:
也就是说DebugCustomXbar节点的输入边对应的DebugCustomBundle的方向被反转了,而输出边对应的DebugCustomBundle的方向没有被反转。就是下图的情况:
输入边对应的Bundle的方向在哪里被反转的呢?
3. 一个例子:TLBundle & TLBundleA
TLBundleA中没有定义方向:
TLBundle中使用Decoupled来定义方向:
Decoupled->DecoupledIO->ReadyValidIO的方向使用的是Producer的视角:
一般情况下,一个TileLink节点N包含两个TLBundleA:分别与输入边和输出边对应。
与输出边对应的TLBundleA连接下游节点,节点N的角色是Producer,所以TLBundleA不需要反转方向。
与输入边对应的TLBundleA连接下游节点,节点N的角色是Consumer,所以TLBundleA需要反转方向。
也就是说,输入边对应的Bundle应该反转方向。
4. 在哪里反转方向?
跟踪LazyModule的使用和初始化代码,确定在哪里反转的。
因为流程较长,放在其他文件中了,下面以参考链接的形式列出。
A. Level 0
参考链接:https://docs.qq.com/pdf/DUW56RWp6SUFJS3Ru
B. new DebugCustomXbar(outputRequiresInput = false)
参考链接:https://docs.qq.com/pdf/DUWxpdmR3aVpuVlFx
C. 引用xbar.module
参考链接:https://docs.qq.com/pdf/DUWhUd3liY1hBcWdh
5. 总结
a. 输入边对应的Bundle的方向会被反转;
b. 反转的位置在LazyModuleImpLike.instantiate()中调用的AutoBundle.makeElements中:
原文地址:https://www.cnblogs.com/wjcdx/p/12230027.html