Rocket - debug - DebugCustomXbar

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

 

讨论DebugCustomXbar中的几个问题。

 

 

1. sources/sourceParams

 

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

 

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

 

2. decoded

 

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

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

 

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

 

3. sourceParams与dSeq

 

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

这里的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中被认为合法:

 

5. sink.ready

 

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

 

6. sink.data

 

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

 

7. 总结

 

这里存在两种情况:

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

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

 

猜你喜欢

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