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中包含了调试模式下核心要执行的代码,需要连接到核心的总线,并入核心的地址空间;