Rocket - debug - DebugCustomXbar再讨论

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中:

 

 

猜你喜欢

转载自www.cnblogs.com/wjcdx/p/12230027.html