Rocket - interrupts - Xbar
https://mp.weixin.qq.com/s/icPGf4KdSOudwuNpLxdo7w
简单介绍Xbar的实现。
1. 简单介绍
IntXbar主要用于把上游多个中断源的中断组合在一起,然后与下游相连接。
2. diplomacy node
diplomacy node用于与上下游节点连接,并与上下游节点协商参数。
IntXbar中的节点是一个IntNexusNode:
1) sinkFn
sinkFn就是uFn,就是把参数向上游传递的函数。这里用于把IntXbar看到的下游节点的参数向上游节点传递,转换为上游节点看到的IntXbar的参数。
这里不管下游节点的参数如何,都向上游传递一个默认的下游参数。
2) sourceFn
sourceFn就是dFn,就是把参数向下游传递的函数。这里用于把IntXbar看到的上游节点的参数向下游节点传递,转换为下游节点看到的IntXbar的参数。
a. seq是与intnode节点相连的输入边的IntSourcePortParameters;
b. seq.map(_.num).scanLeft(0)(_ + _).init汇总和offset平移用于把中断号重新编排:
c. 把seq中的所有IntSourcePortParameters摊平成为一个IntSourcePortParameters。一个IntSourcePortParameters中的所有中断源的中断区间是不重叠的,多个IntSourcePortParameters之间不重叠则需要重新编排来保证;
d. 根据NexusNode的特点,sourceFn把所有输入边的IntSourcePortParameters转换为一个IntSourcePortParameters;然后再把这个IntSourcePortParameters复制成n份(输出边的条数),供每个输出边使用。
e. 也就是说,每个输出边都包含所有输入边传入的中断信号;
3. lazy module
lazy module用于实现IntXbar的内部逻辑。
这里是把输入边输入的全部信号归并到一起,同输出边相连:
1) 所有输入边一起使用,而不是成对的输入边和输出边逐个使用
把所有输入边的中断信号组合在一起,成为cat:
2) 把组合后的中断向量,灌入每一个输出边
4. 伴生对象
用于简化IntXbar的创建,输出xbar.intnode用于与其他节点连接:
5. 附录
略