Rocket - debug - TLDebugModule

https://mp.weixin.qq.com/s/EhUb1z5oiIw6dJ-90ifDJA

 

简单介绍TLDebugModule中的实现。

 

 

1. device

 

device是一个设备描述符,包含了设备的各种信息:

 

2. dmOuter

 

dmOuter是一个TLDebugModuleOuterAsync模块:

 

其结构示意图如下:

 

3. dmInner

 

dmInner是一个TLDebugModuleInnerAsync模块:

 

其结构示意图如下:

 

4. node

 

node是dmInner.tlNode的别名:

 

5. intnode

 

intnode是dmOuter.intnode的别名:

 

6. 连接DMI同步接口

 

连接dmOuter的dmi同步接口(source)和dmInner的dmi同步接口(sink):

 

7. lazy val module

 

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

 

1) io

 

lazy val module定义了一组IO接口:

 

其示意图如下:

 

2) 为dmOuter指定时钟和复位信号

 

dmOuter模块使用外部供入的时钟和复位信号:

 

从目前的实现看,这里的外部是指TestHarness:

 

TestHarness是顶层模块,其reset信号是最外层的复位信号:

a. dut也就是RocketSystem的复位信号来自于TestHarness.reset和调试模块的ndreset;

b. TestHarness的复位信号和时钟信号同时也输出给dut.debug模块:

 

如果是不需要调试模块,则不需要驱动时钟信号,同时一直保持复位信号即可:

 

3) 内部连接

 

将io与dmOuter/dmInner相连,将dmOuter与dmInner相连:

 

8. 总结

 

TLDebugModule总体结构示意图(可以单独打开图片查看)如下:

其中:

a. TLDebugModuleOuterAsync使用外部供入的时钟和复位信号;

b. TLDebugModuleOuterAsync的io.innerCtrl连接到TLDebugModuleInnerAsync的io.innerCtrl,中间有时钟同步逻辑。io.innerCtrl中包含了调试器通过写DMCONTROL寄存器传递的控制信息;

c. io.ctrl.debugUnavail同时传递给TLDebugModuleOuterAsync和TLDebugModuleInnerAsync;只是TLDebugModuleOuterAsync中不使用;

d. dmOuter.intnode用于对核心发起中断请求,这里暂时没有连接;

e. dmInner.tlNode中包含了调试模式下核心要执行的代码,需要连接到核心的总线,并入核心的地址空间;

 

posted @ 2020-04-05 23:10  wjcdx  阅读(327)  评论(0编辑  收藏  举报