https://mp.weixin.qq.com/s/7h9Bdb0x4_clyigMU_0B7Q

讨论DebugCustomXbar中的几个问题。

Rocket - debug - DebugCustomXbar-LMLPHP

1. sources/sourceParams

node.in.unzip解出来输入边中的BI, EI参数,分别是sources和sourceParams:

Rocket - debug - DebugCustomXbar-LMLPHP

其中,sourceParams的类型为Seq[DebugCustomParams],其中包含了每一条输入边的地址列表(addrs:List[Int])和数据宽度;

2. decoded

decoded是对sourceParams中的每一个元素做map操作:

Rocket - debug - DebugCustomXbar-LMLPHP

而sourceParams中的每一个元素代表了一个输入边的参数,这个输入边的参数中包含了多个地址,每一个地址都与sink.addr进行比较,最后输出一个结果(Bool)。

sourceParams中的所有元素,亦即所有边的比较结果(Bool)集合在一起,成为decoded(Seq[Bool])。也就是说,decoded中的每一个掩码表示了sink.addr与相应输入边中地址参数比对的结果,即sink.addr是否选择输入边连接的source。

3. sourceParams与dSeq

diplomacy node的sourceFn中的dSeq也是Seq[DebugCustomParams]:

Rocket - debug - DebugCustomXbar-LMLPHP

这里的dSeq与sourceParams是什么关系?相同吗?

sourceFn是把当前节点即DebugCustomXbar节点看到的上游节点的参数,转换为下游节点看到的DebugCustomXbar节点的参数。

即dSeq是DebugCustomXbar节点看到的上游节点的参数,DebugCustomXbar节点根据这组参数生成lazy module。所以lazy module中的sourceParams,其实就是这sourceFn中的dSeq。

sourceFn把dSeq中全部的地址集合到一起进行了去重操作,然后传递给下游节点(调试模块)。所以这里默认dSeq中不同的source节点可能包含重复的地址。

综合这两点:decoded中可能存在两个或更多个为真的值。从这个结论出发,会导致很多问题。

4. source.addr & source.valid

可能存在多个source.valid为真,进而sink.addr输入到source.addr中被认为合法:

Rocket - debug - DebugCustomXbar-LMLPHP

5. sink.ready

可能存在多个d & i.ready为真,进而向sink.ready中输入真:

Rocket - debug - DebugCustomXbar-LMLPHP

6. sink.data

即便把i.ready更改为d & i.ready,也可能存在多个i.data输出相或在一起,从而导致sink.data错误:

Rocket - debug - DebugCustomXbar-LMLPHP

7. 总结

这里存在两种情况:

a. 存在一个假设,即上游节点的地址不互相重复,那么sourceFn中去重的代码多余;

b. 上游节点的地址可以互相重复,那么decoded需要使用带优先级的掩码(参考仲裁器的实现);

8. 勘误及补充:

sourceFn中有限制各个source节点的地址不重复:require(all_addrs.size == all_addrs.distinct.size, "Different Custom sources can't use the same addresses.")。

05-26 23:24