Rocket - debug - TLDebugModuleOuter

https://mp.weixin.qq.com/s/9nMo6IYmDCz7S-ALFx824g

 

简单介绍TLDebugModuleOuter的实现。

 

 

1. DebugModuleAccessType

 

定义调试模块访问宽度:

 

2. DebugAbstractCommandError

 

定义抽象命令访问错误:

 

3. DebugAbstractCommandType

 

定义抽象命令类型:

 

4. DebugModuleParams

 

定义调试模块参数:

其中:

a. nDMIAddrSize:调试总线地址宽度;

b. nProgramBufferWords:Program Buffer中包含的字数,每个字包含4个字节;

c. nAbstractDataWords: 抽象命令数据的字数,每个字包含4个字节;

d. nScratch:

e. hasBusMaster:是否包含SBToTL模块;

f. clockGate: 是否使用门控时钟;

g. maxSupportedSBAccess: 支持访问系统总线的最大宽度;

h. supportQuickAccess: 是否支持快速访问抽象命令;

i. supportHartArray: 是否支持核心数组;

j. hasImplicitEbreak: Program Buffer最后是否包含一个隐含的ebreak命令;

 

限定条件:

a. DMIAddrSize在7-32之间;

b. nAbstractDataWords在0-16之间;

c. nProgramBufferWords在0-16之间;

 

5. DefaultDebugModuleParams

 

默认调试模块参数:

除了已有的默认值外:

a. nAbstractDataWords: 根据总线宽度来决定支持的抽象命令数据字数;

b. maxSupportedSBAccess: 根据总线宽度确定;

 

6. DebugModuleParams

 

定义用于获取配置的Key:

 

7. DebugModuleHartSelFuncs

 

定义hartid和hartsel之间的映射函数:

 

8. DebugModuleHartSelKey

 

定义用于获取配置的Key:

 

9. DebugInternalBundle

 

用于传递hartsel等信息的结构:

 

10. DebugCtrlBundle

 

调试模块顶层信号:

 

11. WNotifyWire

 

生成一个只写的寄存器域:

其中:

a. 宽度为n;

b. 读出的数值为0;

c. 值写入value变量,并以set作为写入标志;

 

12. RWNotify

 

生成一个读写寄存器域:

其中:

a. 宽度为n;

b. 从rVal中读出值,并以rNotify作为读取标志;

c. 值写入wVal中,并以wNotify作为写入标志;

 

13. TLDebugModuleOuter

 

1) 引入全局配置

 

 

2) 多个diplomacy node

 

A. intnode

 

包含一个中断节点:

 

B. dmiNode

 

包含一个DMI节点,这是一个寄存器节点:

 

3) lazy module

 

 

A. 输出中断,但不接收中断

 

B. 支持的核心数量:

如果只有一个核心,则不需要支持核心数组;

 

C. 定义模块IO:

 

D. dmcontrol使用dmiClock时钟:

 

E. dmcontrol寄存器

 

 

a. 复位值:

 

b. 更新值:

 

c. 异步复位寄存器:

 

d. 寄存器读取时使用的数据源:

 

e. 接收写寄存器时写入的32位值:

 

f. 把32位值解析成为带结构值:

 

g. 读写使能标志:

 

h. 根据dmactive的值,更新dmcontrol的值:

如果不支持核心数组,则hasel=0;

 

i. 写使能时更新dmactive的值:

 

j. dmcontrol是一个可读写寄存器:

其中:DMCONTROLRdEn, DMCONTROLWrEn指示正在读和正在写。

 

F. hawindowsel & hawindow寄存器

 

 

a. 每个核心一个掩码位,窗口宽度为32位:

 

b. 读取hawindowsel寄存器时使用的数据源:

 

c. 接收写寄存器时写入的值:

- HAWINDOWSELWrDataVal接收写入的32位值;

- HAWINDOWSELWrData把这个32位的值解析成带结构信息的值;

 

d. hawindowsel寄存器的读写标志:

 

e. hawindow寄存器相关变量:

 

f. 如果支持核心窗口,hawindowsel等于当前选择的32个核心的窗口:

为了防止写入值超过支持的值,需要一个掩码进行限定。这里使用的是:log2Up(nComponents) - 5。这个应该是有问题的,需要再取一次对数,如log2Up(log2Up(nComponents) - 5)。

 

g. 支持的核心数量需要多少个32位窗口:

 

h. 生成每个窗口的掩码:

- 如果不是最后一个窗口,则32个核心都支持;如果是最后一个窗口,则根据数量计算包含多少个掩码位;

- HAWINDOWRdData:读取时返回的值需要使用掩码进行限定;

- 如果dmactive为假,则使用复位值;

- 否则如果选择的是当前窗口,则把掩码值写入到hamask寄存器中;

 

i. 更新包含全部掩码的hamask:

- 把写入的新值更新到当前窗口;

- 非当前窗口使用原值;

 

G. 生成dmcontrol/hawindowsel/hawindow寄存器:

 

H. Interrupt Registers

 

每个核心对应一个中断线,通过intnode连接到每一个核心:

 

中断的值等于haltreq的值:

 

I. inner & ctrl

 

把信号向inner传递:

这里只使用了harsello,没有使用hartselhi,也就是支持1024个以内的核心,hartselhi默认为0.

 

 

posted @ 2020-02-09 15:51  wjcdx  阅读(394)  评论(0编辑  收藏  举报