Rocket - debug - TLDebugModuleOuterAsync

https://mp.weixin.qq.com/s/PSeMVZjSjEFHJgCYZzfa9Q

 

简单介绍TLDebugModuleOuterAsync的实现。

 

 

1. dmi2tl

 

dmi2tl是TLDebugModuleOuterAsync中的一个子模块,用于把dmi接口转换为tilelink接口。

 

其结构图如下:

 

2. dmiXbar

 

dmiXbar是一个TLXbar模块,用于连接多个TileLink模块:

 

3. dmOuter

 

dmOuter也是一个子模块:

 

4. intnode

 

intnode是一个别名,dmOuter.intnode经过一个IntSyncCrossingSource生成的结构:

 

结构示意如下:

 

5. dmiInnerNode

 

dmiInnerNode是dmiXbar.node经过TLAsyncCrossingSource之后生成的结构:

 

结构示意如下:

 

6. 内部子节点

 

1) TLDebugModuleOuterAsync各个内部子节点如下:

 

 

2) 对内部部分节点进行了连接:

 

结构示意图如下:

 

可以看到io.dmi经过dmi2tl转换为tilelink接口,连接到dmiXbar节点。

a. 进而连接到dmOuter节点的dmiNode访问dmOuter中的寄存器;

b. 也经过TLAsyncCrossingSource节点跨域与inner节点连接;

 

7. lazy val module

 

lazy val module实现了TLDebugModuleOuterAsync的内部逻辑。

 

1) 这里声明了IO接口:

 

2) 又进行了一定的接口连接:

 

 

示意图如下(可以单独打开图片查看):

 

8. 总结

 

1) io.dmi

 

io.dmi用于实现DMI访问。通过DMI接口读写DMI地址空间的寄存器对调试模块进行控制。

 

在实现中,DMI地址空间被分为了outer和inner两个部分。outer部分对应的是dmiNode:TLRegisterNode;inner部分通过TLAsyncCrossingSource模块跨域进行访问。

 

2) io.ctrl

 

io.ctrl的定义如下:

其方向无论是在TLDebugModuleOuter中还是在TLDebugModuleOuterSync中都没有进行转向(flip)。所以这里就是:

a. debugUnavail从outerSync输出到outer

 

debugUnavail用于从外部控制调试模块是否可用,在outerSync内部并没有被使用。

 

b. ndreset从outer输出到outerSync

 

ndreset的值来自于DMCONTROL寄存器的ndmcontrol位:

 

其意义在于复位系统中除调试模块之外的其他部分:

 

ndreset最终用于控制系统其他模块复位:

 

c. dmactive从outer输出到outerSync;

 

dmactive的值来自于DMCONTROL寄存器的dmactive位:

 

用于复位调试模块:

 

3) io.innerCtrl

 

io.innerCtrl定义如下:

 

根据注释,用于从outer传递控制信息到inner。因为其定义中没有方向信息,所以整个结构全部信号值传递的方向是一致的:都是从outer到inner。

 

猜你喜欢

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