Rocket

https://mp.weixin.qq.com/s/1bIqzDYXM36MIfSsjvvYIw

 

简单介绍TLDebugModuleInner中的针对Custom的访问。

 

 

1. customNode

 

customNode定义为DebugCustomSink类型的节点:

 

根据DebugCustomSink的定义,customNode所属的模块为调试模块:

这与customNode所属的模块为TLDebugModuleInner相符。

 

Custom相关节点到连接图如下,供参考:

 

2. needCustom

 

needCustom标志着是否需要生成Custom逻辑:

其中到两个条件为:

a. 包含一个以上的输入边;

b. 包含一个以上的地址可供访问;

 

customNode代表调试模块,customNode.in代表与被调试模块到连接。这两个条件到意义也就是存在被调试模块,被调试模块存在可被访问到地址。

 

3. accessRegIsCustom

 

accessRegIsCustom表示抽象命令访问到寄存器是否属于Custom节点:

其中:

a. 如果customNode没有输入边,也就是没有被调试模块,则直接返回假;

b. 如果存在输入边,则把访问到寄存器地址与输入边中的地址相比较;

 

这里只比较了customNode.in.head的地址,也就是第一个输入边相对应到模块到地址。难道不能有多个被调试模块吗?

 

可以有,他们都通过DebugCustomXbar与调试模块相连,所以与调试模块相连到也就只有DebugCustomXbar这一个模块了:

 

DebugCustomXbar也限定了只有一个输出边连接一个Sink节点:

也就是只有一个调试模块与之相连。

 

4. goCustom

 

在检测生成的命令阶段,如果访问到寄存器地址在Custom源节点,那么会进入Custom状态:

否则,进入命令执行状态。也就是命令由Custom相关节点执行。

 

在Custom状态,设置goCustom为真:

如果custom.ready和custom.valid同时为真,也就是命令执行结束(数据从Custom源节点返回),就进入下一个状态(Waiting)。

 

5. Drive Custom Access

 

抽象命令中的寄存器编号就是要访问的地址(custom.addr):

根据地址是否属于Custom源节点(goCustom)确定custom.valid是否为真。

 

6. abstractDataMem

 

当数据从Custom源节点返回时,将其存入abstractDataMem中:

参考注释:

             

 

原文地址:https://www.cnblogs.com/wjcdx/p/12595214.html