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.

Rocket - debug - TLDebugModuleOuter的更多相关文章

  1. Rocket - debug - TLDebugModuleInner - Hart Bus Access

    https://mp.weixin.qq.com/s/deNMEyJ1idJDVoZwwo0A1A 简单介绍TLDebugModuleInner中核心总线访问(Hart Bus Access). 参考 ...

  2. Rocket - debug - Periphery

    https://mp.weixin.qq.com/s/uGxn-Xec0LkwdaSsCtQBvw 简单介绍Periphery的实现. 1. ExportDebugDMI/ExportDebugJTA ...

  3. Rocket - debug - DebugTransport

    https://mp.weixin.qq.com/s/EcsuTjb4hFF9Ncig9Gfhew 简单介绍DebugTransport的实现. 1. JtagDTMConfig 1) JtagDTM ...

  4. Rocket - debug - TLDebugModule

    https://mp.weixin.qq.com/s/EhUb1z5oiIw6dJ-90ifDJA 简单介绍TLDebugModule中的实现. 1. device device是一个设备描述符,包含 ...

  5. Rocket - debug - TLDebugModuleOuterAsync

    https://mp.weixin.qq.com/s/PSeMVZjSjEFHJgCYZzfa9Q 简单介绍TLDebugModuleOuterAsync的实现. 1. dmi2tl dmi2tl是T ...

  6. Rocket - debug - TLDebugModuleInner - ROM Generation

    https://mp.weixin.qq.com/s/j_CgHU4PnY82NMwJzOqHYg 简单介绍Variable ROM Generation. 1. jalAbstract jalAbs ...

  7. Rocket - debug - TLDebugModuleInner

    https://mp.weixin.qq.com/s/jkiHceU0HaJbHGvHiU-QOA 简单介绍TLDebugModuleInner的实现. 1. 引入全局配置 1) cfg 引入Debu ...

  8. Rocket - debug - Example: DMI

    https://mp.weixin.qq.com/s/7suuJ7m2BKCpsHk1K2FzJQ 介绍riscv-debug的使用实例:如何使用DMI. 1. dm Debug Module实现了调 ...

  9. Rocket - debug - Example: Triggers

    https://mp.weixin.qq.com/s/zPNyrBOhsytkRrZTDTEvpw 介绍riscv-debug的使用实例:配置Triggers功能. 1. Trigger Trigge ...

随机推荐

  1. Spring官网阅读(十四)Spring中的BeanWrapper及类型转换

    文章目录 接口定义 继承关系 接口功能 1.PropertyEditorRegistry(属性编辑器注册器) 接口定义 PropertyEditor 概念 Spring中对PropertyEditor ...

  2. 变分深度嵌入(Variational Deep Embedding, VaDE)

    变分深度嵌入(Variational Deep Embedding, VaDE) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 这篇博文主要是对论文“ ...

  3. PHP正则表达式语法汇总

    首先,让我们看看两个特别的字符:'^' 和 ‘$' 他们是分别用来匹配字符串的开始和结束,一下分别举例说明"^The": 匹配以 "The"开头的字符串;&qu ...

  4. 用项目强化你的webpack

    用你的webpack实现vue-cli 本文围绕前端工程化,用webpack从零搭建一个完整项目的过程 本文核心知识点: webpack的使用 vue组件化思想 Element-UI的使用 别走别走, ...

  5. 前端面试题-WebSocket的实现和应用

    (1)什么是WebSocket? WebSocket是HTML5中的协议,支持持久连续,http协议不支持持久性连接.Http1.0和HTTP1.1都不支持持久性的链接,HTTP1.1中的keep-a ...

  6. 搜索引擎优化(SEO)

    一.SEM SEM(Search Engine Marketing)即搜索引擎营销.SEM是一种新的网络营销模式.SEM所做的就是全面有效地利用所搜引擎来进行网络行销推广.SEM追求最高的性价比,以最 ...

  7. Windows 系统如何安装 Docker

    1 docker 是基于 unix 开发的系列工具,所以在 windows 上安装 docker 非常容易出现环境不兼容的问题. 如果 windows 版本是 pro,一般是可以直接安装 docker ...

  8. 9.3 Go json

    9.3 Go json json是一种轻量级的数据交换格式,易于机器解析,是种key-value格式. JavaScript Object Notation是中种主流的数据格式. json常用于网络传 ...

  9. removebg抠图小工具

    由于比较简单,直接上代码(removebg接口官网),更多小工具获取 (1)官网API,需注册获取X-Api-Key:removebg_官网api.py import requests respons ...

  10. 存储系列之 LUN 和 LVM

    一.LUN 1.LUN的由来 上一篇文章已经介绍了RAID技术的原理,那么RAID的实现呢?有两种方式,RAID软件和RAID硬件.但是因软件RAID占用主机CPU和主机内存,而且RAID功能不易实现 ...